#include "tseng.h"
static __inline__ int
COLOR_REPLICATE_DWORD(TsengPtr pTseng, int color)
{
switch (pTseng->Bytesperpixel) {
case 1:
color &= 0xFF;
color = (color << 8) | color;
color = (color << 16) | color;
break;
case 2:
color &= 0xFFFF;
color = (color << 16) | color;
break;
}
return color;
}
static __inline__ void
SET_FG_COLOR(TsengPtr pTseng, int color)
{
ACL_SOURCE_ADDRESS(pTseng->AccelColorBufferOffset + pTseng->tsengFg);
ACL_SOURCE_Y_OFFSET(3);
color = COLOR_REPLICATE_DWORD(pTseng, color);
MMIO_OUT32(pTseng->scratchMemBase, pTseng->tsengFg, color);
if (Is_W32p || Is_ET6K) {
ACL_SOURCE_WRAP(0x02);
} else {
MMIO_OUT32(pTseng->scratchMemBase,pTseng->tsengFg + 4, color);
ACL_SOURCE_WRAP(0x12);
}
}
static __inline__ void
SET_BG_COLOR(TsengPtr pTseng, int color)
{
ACL_PATTERN_ADDRESS(pTseng->AccelColorBufferOffset + pTseng->tsengPat);
ACL_PATTERN_Y_OFFSET(3);
color = COLOR_REPLICATE_DWORD(pTseng, color);
MMIO_OUT32(pTseng->scratchMemBase,pTseng->tsengPat, color);
if (Is_W32p || Is_ET6K) {
ACL_PATTERN_WRAP(0x02);
} else {
MMIO_OUT32(pTseng->scratchMemBase,pTseng->tsengPat + 4, color);
ACL_PATTERN_WRAP(0x12);
}
}
static __inline__ void
SET_FG_BG_COLOR(TsengPtr pTseng, int fgcolor, int bgcolor)
{
ACL_PATTERN_ADDRESS(pTseng->AccelColorBufferOffset + pTseng->tsengPat);
ACL_SOURCE_ADDRESS(pTseng->AccelColorBufferOffset + pTseng->tsengFg);
ACL_PATTERN_Y_OFFSET32(0x00030003);
fgcolor = COLOR_REPLICATE_DWORD(pTseng, fgcolor);
bgcolor = COLOR_REPLICATE_DWORD(pTseng, bgcolor);
MMIO_OUT32(pTseng->scratchMemBase,pTseng->tsengFg, fgcolor);
MMIO_OUT32(pTseng->scratchMemBase,pTseng->tsengPat, bgcolor);
if (Is_W32p || Is_ET6K) {
ACL_PATTERN_WRAP32(0x00020002);
} else {
MMIO_OUT32(pTseng->scratchMemBase,pTseng->tsengFg + 4, fgcolor);
MMIO_OUT32(pTseng->scratchMemBase,pTseng->tsengPat + 4, bgcolor);
ACL_PATTERN_WRAP32(0x00120012);
}
}
#ifdef NO_OPTIMIZE
static __inline__ int
MULBPP(TsengPtr pTseng, int x)
{
return (x * pTseng->Bytesperpixel);
}
#else
static __inline__ int
MULBPP(TsengPtr pTseng, int x)
{
int result = x << pTseng->powerPerPixel;
if (pTseng->Bytesperpixel != 3)
return result;
else
return result + x;
}
#endif
static __inline__ int
CALC_XY(TsengPtr pTseng, int x, int y)
{
int new_x, xy;
if ((pTseng->old_y == y) && (pTseng->old_x == x))
return -1;
if (Is_W32p)
new_x = MULBPP(pTseng, x - 1);
else
new_x = MULBPP(pTseng, x) - 1;
xy = ((y - 1) << 16) + new_x;
pTseng->old_x = x;
pTseng->old_y = y;
return xy;
}
static __inline__ void
SET_XY(TsengPtr pTseng, int x, int y)
{
int new_x;
if (Is_W32p)
new_x = MULBPP(pTseng, x - 1);
else
new_x = MULBPP(pTseng, x) - 1;
ACL_XY_COUNT(((y - 1) << 16) + new_x);
pTseng->old_x = x;
pTseng->old_y = y;
}
static __inline__ void
SET_X_YRAW(TsengPtr pTseng, int x, int y)
{
int new_x;
if (Is_W32p)
new_x = MULBPP(pTseng, x - 1);
else
new_x = MULBPP(pTseng, x) - 1;
ACL_XY_COUNT((y << 16) + new_x);
pTseng->old_x = x;
pTseng->old_y = y - 1;
}
static __inline__ void
SET_XY_4(TsengPtr pTseng, int x, int y)
{
int new_xy;
if ((pTseng->old_y != y) || (pTseng->old_x != x)) {
new_xy = ((y - 1) << 16) + MULBPP(pTseng, x - 1);
ACL_XY_COUNT(new_xy);
pTseng->old_x = x;
pTseng->old_y = y;
}
}
static __inline__ void
SET_XY_6(TsengPtr pTseng, int x, int y)
{
int new_xy;
if ((pTseng->old_y != y) || (pTseng->old_x != x)) {
new_xy = ((y - 1) << 16) + MULBPP(pTseng, x) - 1;
ACL_XY_COUNT(new_xy);
pTseng->old_x = x;
pTseng->old_y = y;
}
}
static __inline__ void
SET_XY_RAW(TsengPtr pTseng,int x, int y)
{
ACL_XY_COUNT((y << 16) + x);
pTseng->old_x = pTseng->old_y = -1;
}
static __inline__ void
PINGPONG(TsengPtr pTseng)
{
if (pTseng->tsengFg == 0) {
pTseng->tsengFg = 8;
pTseng->tsengBg = 24;
pTseng->tsengPat = 40;
} else {
pTseng->tsengFg = 0;
pTseng->tsengBg = 16;
pTseng->tsengPat = 32;
}
}
static __inline__ void
wait_acl_queue(TsengPtr pTseng)
{
if (pTseng->UsePCIRetry)
WAIT_QUEUE;
if (pTseng->need_wait_acl)
WAIT_ACL;
}