1d983712dSmrg#ifndef _TSENG_ACCEL_H 2d983712dSmrg#define _TSENG_ACCEL_H 3d983712dSmrg/* 4d983712dSmrg * Shortcuts to Tseng memory-mapped accelerator-control registers 5d983712dSmrg */ 6d983712dSmrg 7d983712dSmrg#define MMU_CONTROL(x) MMIO_OUT8(pTseng->MMioBase, 0x13<<0, x) 8d983712dSmrg#define ACL_SUSPEND_TERMINATE(x) MMIO_OUT8(pTseng->MMioBase, 0x30<<0, x) 9d983712dSmrg#define ACL_OPERATION_STATE(x) MMIO_OUT8(pTseng->MMioBase, 0x31<<0, x) 10d983712dSmrg 11d983712dSmrg#define ACL_SYNC_ENABLE(x) MMIO_OUT8(pTseng->MMioBase, 0x32<<0, x) 12d983712dSmrg /* for ET6000, ACL_SYNC_ENABLE becomes ACL_6K_CONFIG */ 13d983712dSmrg 14d983712dSmrg#define ACL_INTERRUPT_STATUS(x) \ 15d983712dSmrg MMIO_OUT8(pTseng->MMioBase, 0x35<<0, x) 16d983712dSmrg#define ACL_INTERRUPT_MASK(x) MMIO_OUT8(pTseng->MMioBase, 0x34<<0, x) 17d983712dSmrg#define ACL_ACCELERATOR_STATUS (0x36 << 0) 18d983712dSmrg#define ACL_ACCELERATOR_STATUS_SET(x) \ 19d983712dSmrg MMIO_OUT8(pTseng->MMioBase, ACL_ACCELERATOR_STATUS, x) 20d983712dSmrg#define ACL_WRITE_INTERFACE_VALID (0x33 << 0) 21d983712dSmrg 22d983712dSmrg /* and this is only for the ET6000 */ 23d983712dSmrg#define ACL_POWER_CONTROL(x) MMIO_OUT8(pTseng->MMioBase, 0x37<<0, x) 24d983712dSmrg 25d983712dSmrg /* non-queued for w32p's and ET6000 */ 26d983712dSmrg#define ACL_NQ_X_POSITION(x) MMIO_OUT16(pTseng->MMioBase, 0x38<<0, x) 27d983712dSmrg#define ACL_NQ_Y_POSITION(x) MMIO_OUT16(pTseng->MMioBase, 0x3A<<0, x) 28d983712dSmrg /* queued for w32 and w32i */ 29d983712dSmrg#define ACL_X_POSITION(x) MMIO_OUT16(pTseng->MMioBase, 0x94<<0, x) 30d983712dSmrg#define ACL_Y_POSITION(x) MMIO_OUT16(pTseng->MMioBase, 0x96<<0, x) 31d983712dSmrg 32d983712dSmrg#define ACL_PATTERN_ADDRESS(x) MMIO_OUT32(pTseng->MMioBase, 0x80<<0, x) 33d983712dSmrg#define ACL_SOURCE_ADDRESS(x) MMIO_OUT32(pTseng->MMioBase, 0x84<<0, x) 34d983712dSmrg 35d983712dSmrg#define ACL_PATTERN_Y_OFFSET(x) MMIO_OUT16(pTseng->MMioBase, 0x88<<0, x) 36d983712dSmrg#define ACL_PATTERN_Y_OFFSET32(x) MMIO_OUT32(pTseng->MMioBase, 0x88<<0, x) 37d983712dSmrg#define ACL_SOURCE_Y_OFFSET(x) MMIO_OUT16(pTseng->MMioBase, 0x8A<<0, x) 38d983712dSmrg#define ACL_DESTINATION_Y_OFFSET(x) MMIO_OUT16(pTseng->MMioBase, 0x8C<<0, x) 39d983712dSmrg 40d983712dSmrg /* W32i */ 41d983712dSmrg#define ACL_VIRTUAL_BUS_SIZE(x) MMIO_OUT8(pTseng->MMioBase, 0x8E<<0, x) 42d983712dSmrg /* w32p */ 43d983712dSmrg#define ACL_PIXEL_DEPTH(x) MMIO_OUT8(pTseng->MMioBase, 0x8E<<0, x) 44d983712dSmrg 45d983712dSmrg /* w32 and w32i */ 46d983712dSmrg#define ACL_XY_DIRECTION(x) MMIO_OUT8(pTseng->MMioBase, 0x8F<<0, x) 47d983712dSmrg 48d983712dSmrg#define ACL_PATTERN_WRAP(x) MMIO_OUT8(pTseng->MMioBase, 0x90<<0, x) 49d983712dSmrg#define ACL_PATTERN_WRAP32(x) MMIO_OUT32(pTseng->MMioBase, 0x90<<0, x) 50d983712dSmrg#define ACL_TRANSFER_DISABLE(x) MMIO_OUT8(pTseng->MMioBase, 0x91<<0, x) /* ET6000 only */ 51d983712dSmrg#define ACL_SOURCE_WRAP(x) MMIO_OUT8(pTseng->MMioBase, 0x92<<0, x) 52d983712dSmrg 53d983712dSmrg#define ACL_X_COUNT(x) MMIO_OUT16(pTseng->MMioBase, 0x98<<0, x) 54d983712dSmrg#define ACL_Y_COUNT(x) MMIO_OUT16(pTseng->MMioBase, 0x9A<<0, x) 55d983712dSmrg/* shortcut. not a real register */ 56d983712dSmrg#define ACL_XY_COUNT(x) MMIO_OUT32(pTseng->MMioBase, 0x98<<0, x) 57d983712dSmrg 58d983712dSmrg#define ACL_ROUTING_CONTROL(x) MMIO_OUT8(pTseng->MMioBase, 0x9C<<0, x) 59d983712dSmrg /* for ET6000, ACL_ROUTING_CONTROL becomes ACL_MIX_CONTROL */ 60d983712dSmrg#define ACL_RELOAD_CONTROL(x) MMIO_OUT8(pTseng->MMioBase, 0x9D<<0, x) 61d983712dSmrg /* for ET6000, ACL_RELOAD_CONTROL becomes ACL_STEPPING_INHIBIT */ 62d983712dSmrg 63d983712dSmrg#define ACL_BACKGROUND_RASTER_OPERATION(x) MMIO_OUT8(pTseng->MMioBase, 0x9E<<0, x) 64d983712dSmrg#define ACL_FOREGROUND_RASTER_OPERATION(x) MMIO_OUT8(pTseng->MMioBase, 0x9F<<0, x) 65d983712dSmrg 66d983712dSmrg#define ACL_DESTINATION_ADDRESS(x) MMIO_OUT32(pTseng->MMioBase, 0xA0<<0, x) 67d983712dSmrg 68d983712dSmrg /* the following is for the w32p's only */ 69d983712dSmrg#define ACL_MIX_ADDRESS(x) MMIO_OUT32(pTseng->MMioBase, 0xA4<<0, x) 70d983712dSmrg 71d983712dSmrg#define ACL_MIX_Y_OFFSET(x) MMIO_OUT16(pTseng->MMioBase, 0xA8<<0, x) 72d983712dSmrg#define ACL_ERROR_TERM(x) MMIO_OUT16(pTseng->MMioBase, 0xAA<<0, x) 73d983712dSmrg#define ACL_DELTA_MINOR(x) MMIO_OUT16(pTseng->MMioBase, 0xAC<<0, x) 74d983712dSmrg#define ACL_DELTA_MINOR32(x) MMIO_OUT32(pTseng->MMioBase, 0xAC<<0, x) 75d983712dSmrg#define ACL_DELTA_MAJOR(x) MMIO_OUT16(pTseng->MMioBase, 0xAE<<0, x) 76d983712dSmrg 77d983712dSmrg /* ET6000 only (trapezoids) */ 78d983712dSmrg#define ACL_SECONDARY_EDGE(x) MMIO_OUT8(pTseng->MMioBase, 0x93<<0, x) 79d983712dSmrg#define ACL_SECONDARY_ERROR_TERM(x) MMIO_OUT16(pTseng->MMioBase, 0xB2<<0, x) 80d983712dSmrg#define ACL_SECONDARY_DELTA_MINOR(x) MMIO_OUT16(pTseng->MMioBase, 0xB4<<0, x) 81d983712dSmrg#define ACL_SECONDARY_DELTA_MINOR32(x) MMIO_OUT32(pTseng->MMioBase, 0xB4<<0, x) 82d983712dSmrg#define ACL_SECONDARY_DELTA_MAJOR(x) MMIO_OUT16(pTseng->MMioBase, 0xB6<<0, x) 83d983712dSmrg 84d983712dSmrg/* for ET6000: */ 85d983712dSmrg#define ACL_6K_CONFIG ACL_SYNC_ENABLE 86d983712dSmrg 87d983712dSmrg/* for ET6000: */ 88d983712dSmrg#define ACL_MIX_CONTROL ACL_ROUTING_CONTROL 89d983712dSmrg#define ACL_STEPPING_INHIBIT ACL_RELOAD_CONTROL 90d983712dSmrg 91d983712dSmrg/* 92d983712dSmrg * Some shortcuts. 93d983712dSmrg */ 94d983712dSmrg 95d983712dSmrg#define MAX_WAIT_CNT 500000 /* how long we wait before we time out */ 96d983712dSmrg#undef WAIT_VERBOSE /* if defined: print out how long we waited */ 97d983712dSmrg 983cb82e98Smrgvoid tseng_recover_timeout(TsengPtr pTseng); 99d983712dSmrg 100d983712dSmrgstatic __inline__ void 101d983712dSmrgtseng_wait(TsengPtr pTseng, int reg, char *name, unsigned char mask) 102d983712dSmrg{ 103d983712dSmrg int cnt = MAX_WAIT_CNT; 104d983712dSmrg 105d983712dSmrg while ((MMIO_IN32(pTseng->MMioBase,reg)) & mask) 106d983712dSmrg if (--cnt < 0) { 107d983712dSmrg ErrorF("WAIT_%s: timeout.\n", name); 108d983712dSmrg tseng_recover_timeout(pTseng); 109d983712dSmrg break; 110d983712dSmrg } 111d983712dSmrg#ifdef WAIT_VERBOSE 112d983712dSmrg ErrorF("%s%d ", name, MAX_WAIT_CNT - cnt); 113d983712dSmrg#endif 114d983712dSmrg} 115d983712dSmrg 116d983712dSmrg#define WAIT_QUEUE tseng_wait(pTseng, ACL_ACCELERATOR_STATUS, "QUEUE", 0x1) 117d983712dSmrg 118d983712dSmrg/* This is only for W32p rev b...d */ 119d983712dSmrg#define WAIT_INTERFACE tseng_wait(pTseng, ACL_WRITE_INTERFACE_VALID, "INTERFACE", 0xf) 120d983712dSmrg 121d983712dSmrg#define WAIT_ACL tseng_wait(pTseng, ACL_ACCELERATOR_STATUS, "ACL", 0x2) 122d983712dSmrg 123d983712dSmrg#define WAIT_XY tseng_wait(pTseng, ACL_ACCELERATOR_STATUS, "XY", 0x4) 124d983712dSmrg 125d983712dSmrg#define SET_FUNCTION_BLT \ 126d983712dSmrg if (pTseng->ChipType == ET6000) \ 127d983712dSmrg ACL_MIX_CONTROL(0x33); \ 128d983712dSmrg else \ 129d983712dSmrg ACL_ROUTING_CONTROL(0x00); 130d983712dSmrg 131d983712dSmrg#define SET_FUNCTION_BLT_TR \ 132d983712dSmrg ACL_MIX_CONTROL(0x13); 133d983712dSmrg 134d983712dSmrg#define FBADDR(pTseng, x,y) ( (y) * pTseng->line_width + MULBPP(pTseng, x) ) 135d983712dSmrg 136d983712dSmrg#define SET_FG_ROP(rop) \ 137d983712dSmrg ACL_FOREGROUND_RASTER_OPERATION(W32OpTable[rop]); 138d983712dSmrg 139d983712dSmrg#define SET_FG_ROP_PLANEMASK(rop) \ 140d983712dSmrg ACL_FOREGROUND_RASTER_OPERATION(W32OpTable_planemask[rop]); 141d983712dSmrg 142d983712dSmrg#define SET_BG_ROP(rop) \ 143d983712dSmrg ACL_BACKGROUND_RASTER_OPERATION(W32PatternOpTable[rop]); 144d983712dSmrg 145d983712dSmrg#define SET_BG_ROP_TR(rop, bg_color) \ 146d983712dSmrg if ((bg_color) == -1) /* transparent color expansion */ \ 147d983712dSmrg ACL_BACKGROUND_RASTER_OPERATION(0xaa); \ 148d983712dSmrg else \ 149d983712dSmrg ACL_BACKGROUND_RASTER_OPERATION(W32PatternOpTable[rop]); 150d983712dSmrg 151d983712dSmrg#define SET_DELTA(Min, Maj) \ 152d983712dSmrg ACL_DELTA_MINOR32(((Maj) << 16) + (Min)) 153d983712dSmrg 154d983712dSmrg#define SET_SECONDARY_DELTA(Min, Maj) \ 155d983712dSmrg ACL_SECONDARY_DELTA_MINOR(((Maj) << 16) + (Min)) 156d983712dSmrg 157d983712dSmrg#ifdef NO_OPTIMIZE 158d983712dSmrg#define SET_XYDIR(dir) \ 159d983712dSmrg ACL_XY_DIRECTION(dir); 160d983712dSmrg#else 161d983712dSmrg/* 162d983712dSmrg * only changing ACL_XY_DIRECTION when it needs to be changed avoids 163d983712dSmrg * unnecessary PCI bus writes, which are slow. This shows up very well 164d983712dSmrg * on consecutive small fills. 165d983712dSmrg */ 166d983712dSmrg#define SET_XYDIR(dir) \ 167d983712dSmrg if ((dir) != pTseng->tseng_old_dir) \ 168d983712dSmrg pTseng->tseng_old_dir = (dir); \ 169d983712dSmrg ACL_XY_DIRECTION(pTseng->tseng_old_dir); 170d983712dSmrg#endif 171d983712dSmrg 172d983712dSmrg#define SET_SECONDARY_XYDIR(dir) \ 173d983712dSmrg ACL_SECONDARY_EDGE(dir); 174d983712dSmrg 175d983712dSmrg/* Must do 0x09 (in one operation) for the W32 */ 176d983712dSmrg#define START_ACL(pTseng, dst) \ 177d983712dSmrg ACL_DESTINATION_ADDRESS(dst); 178d983712dSmrg 179d983712dSmrg/* START_ACL for the ET6000 */ 180d983712dSmrg#define START_ACL_6(dst) \ 181d983712dSmrg ACL_DESTINATION_ADDRESS(dst); 182d983712dSmrg 183d983712dSmrg#define START_ACL_CPU(pTseng, dst) \ 184d983712dSmrg ACL_DESTINATION_ADDRESS(dst); 185d983712dSmrg 186d983712dSmrg/* ACL_DESTINATION_ADDRESS(dst); should be enough for START_ACL_CPU */ 187d983712dSmrg 188d983712dSmrg/* 189d983712dSmrg * Some commonly used inline functions and utility functions. 190d983712dSmrg */ 191d983712dSmrg 192d983712dSmrgstatic __inline__ int 193d983712dSmrgCOLOR_REPLICATE_DWORD(TsengPtr pTseng, int color) 194d983712dSmrg{ 195d983712dSmrg switch (pTseng->Bytesperpixel) { 196d983712dSmrg case 1: 197d983712dSmrg color &= 0xFF; 198d983712dSmrg color = (color << 8) | color; 199d983712dSmrg color = (color << 16) | color; 200d983712dSmrg break; 201d983712dSmrg case 2: 202d983712dSmrg color &= 0xFFFF; 203d983712dSmrg color = (color << 16) | color; 204d983712dSmrg break; 205d983712dSmrg } 206d983712dSmrg return color; 207d983712dSmrg} 208d983712dSmrg 209d983712dSmrg/* 210d983712dSmrg * Optimizing note: increasing the wrap size for fixed-color source/pattern 211d983712dSmrg * tiles from 4x1 (as below) to anything bigger doesn't seem to affect 212d983712dSmrg * performance (it might have been better for larger wraps, but it isn't). 213d983712dSmrg */ 214d983712dSmrg 215d983712dSmrgstatic __inline__ void 216d983712dSmrgSET_FG_COLOR(TsengPtr pTseng, int color) 217d983712dSmrg{ 218d983712dSmrg ACL_SOURCE_ADDRESS(pTseng->AccelColorBufferOffset + pTseng->tsengFg); 219d983712dSmrg ACL_SOURCE_Y_OFFSET(3); 220d983712dSmrg color = COLOR_REPLICATE_DWORD(pTseng, color); 221d983712dSmrg MMIO_OUT32(pTseng->scratchMemBase, pTseng->tsengFg, color); 222d983712dSmrg 223d983712dSmrg ACL_SOURCE_WRAP(0x02); 224d983712dSmrg} 225d983712dSmrg 226d983712dSmrgstatic __inline__ void 227d983712dSmrgSET_BG_COLOR(TsengPtr pTseng, int color) 228d983712dSmrg{ 229d983712dSmrg ACL_PATTERN_ADDRESS(pTseng->AccelColorBufferOffset + pTseng->tsengPat); 230d983712dSmrg ACL_PATTERN_Y_OFFSET(3); 231d983712dSmrg color = COLOR_REPLICATE_DWORD(pTseng, color); 232d983712dSmrg MMIO_OUT32(pTseng->scratchMemBase,pTseng->tsengPat, color); 233d983712dSmrg 234d983712dSmrg ACL_PATTERN_WRAP(0x02); 235d983712dSmrg} 236d983712dSmrg 237d983712dSmrg/* 238d983712dSmrg * this does the same as SET_FG_COLOR and SET_BG_COLOR together, but is 239d983712dSmrg * faster, because it allows the PCI chipset to chain the requests into a 240d983712dSmrg * burst sequence. The order of the commands is partly linear. 241d983712dSmrg * So far for the theory... 242d983712dSmrg */ 243d983712dSmrgstatic __inline__ void 244d983712dSmrgSET_FG_BG_COLOR(TsengPtr pTseng, int fgcolor, int bgcolor) 245d983712dSmrg{ 246d983712dSmrg ACL_PATTERN_ADDRESS(pTseng->AccelColorBufferOffset + pTseng->tsengPat); 247d983712dSmrg ACL_SOURCE_ADDRESS(pTseng->AccelColorBufferOffset + pTseng->tsengFg); 248d983712dSmrg ACL_PATTERN_Y_OFFSET32(0x00030003); 249d983712dSmrg fgcolor = COLOR_REPLICATE_DWORD(pTseng, fgcolor); 250d983712dSmrg bgcolor = COLOR_REPLICATE_DWORD(pTseng, bgcolor); 251d983712dSmrg MMIO_OUT32(pTseng->scratchMemBase,pTseng->tsengFg, fgcolor); 252d983712dSmrg MMIO_OUT32(pTseng->scratchMemBase,pTseng->tsengPat, bgcolor); 253d983712dSmrg 254d983712dSmrg ACL_PATTERN_WRAP32(0x00020002); 255d983712dSmrg} 256d983712dSmrg 257d983712dSmrg/* 258d983712dSmrg * Real 32-bit multiplications are horribly slow compared to 16-bit (on i386). 259d983712dSmrg */ 260d983712dSmrg#ifdef NO_OPTIMIZE 261d983712dSmrgstatic __inline__ int 262d983712dSmrgMULBPP(TsengPtr pTseng, int x) 263d983712dSmrg{ 264d983712dSmrg return (x * pTseng->Bytesperpixel); 265d983712dSmrg} 266d983712dSmrg#else 267d983712dSmrgstatic __inline__ int 268d983712dSmrgMULBPP(TsengPtr pTseng, int x) 269d983712dSmrg{ 270d983712dSmrg int result = x << pTseng->powerPerPixel; 271d983712dSmrg 272d983712dSmrg if (pTseng->Bytesperpixel != 3) 273d983712dSmrg return result; 274d983712dSmrg else 275d983712dSmrg return result + x; 276d983712dSmrg} 277d983712dSmrg#endif 278d983712dSmrg 279d983712dSmrgstatic __inline__ int 280d983712dSmrgCALC_XY(TsengPtr pTseng, int x, int y) 281d983712dSmrg{ 282d983712dSmrg int new_x, xy; 283d983712dSmrg 284d983712dSmrg if ((pTseng->old_y == y) && (pTseng->old_x == x)) 285d983712dSmrg return -1; 286d983712dSmrg 287d983712dSmrg if (pTseng->ChipType == ET4000) 288d983712dSmrg new_x = MULBPP(pTseng, x - 1); 289d983712dSmrg else 290d983712dSmrg new_x = MULBPP(pTseng, x) - 1; 291d983712dSmrg xy = ((y - 1) << 16) + new_x; 292d983712dSmrg pTseng->old_x = x; 293d983712dSmrg pTseng->old_y = y; 294d983712dSmrg return xy; 295d983712dSmrg} 296d983712dSmrg 297d983712dSmrg/* generic SET_XY */ 298d983712dSmrgstatic __inline__ void 299d983712dSmrgSET_XY(TsengPtr pTseng, int x, int y) 300d983712dSmrg{ 301d983712dSmrg int new_x; 302d983712dSmrg 303d983712dSmrg if (pTseng->ChipType == ET4000) 304d983712dSmrg new_x = MULBPP(pTseng, x - 1); 305d983712dSmrg else 306d983712dSmrg new_x = MULBPP(pTseng, x) - 1; 307d983712dSmrg ACL_XY_COUNT(((y - 1) << 16) + new_x); 308d983712dSmrg pTseng->old_x = x; 309d983712dSmrg pTseng->old_y = y; 310d983712dSmrg} 311d983712dSmrg 312d983712dSmrgstatic __inline__ void 313d983712dSmrgSET_X_YRAW(TsengPtr pTseng, int x, int y) 314d983712dSmrg{ 315d983712dSmrg int new_x; 316d983712dSmrg 317d983712dSmrg if (pTseng->ChipType == ET4000) 318d983712dSmrg new_x = MULBPP(pTseng, x - 1); 319d983712dSmrg else 320d983712dSmrg new_x = MULBPP(pTseng, x) - 1; 321d983712dSmrg ACL_XY_COUNT((y << 16) + new_x); 322d983712dSmrg pTseng->old_x = x; 323d983712dSmrg pTseng->old_y = y - 1; /* old_y is invalid (raw transfer) */ 324d983712dSmrg} 325d983712dSmrg 326d983712dSmrg/* 327d983712dSmrg * This is plain and simple "benchmark rigging". 328d983712dSmrg * (no real application does lots of subsequent same-size blits) 329d983712dSmrg * 330d983712dSmrg * The effect of this is amazingly good on e.g large blits: 400x400 331d983712dSmrg * rectangle fill in 24 and 32 bpp on ET6000 jumps from 276 MB/sec to up to 332d983712dSmrg * 490 MB/sec... But not always. There must be a good reason why this gives 333d983712dSmrg * such a boost, but I don't know it. 334d983712dSmrg */ 335d983712dSmrg 336d983712dSmrgstatic __inline__ void 337d983712dSmrgSET_XY_4(TsengPtr pTseng, int x, int y) 338d983712dSmrg{ 339d983712dSmrg int new_xy; 340d983712dSmrg 341d983712dSmrg if ((pTseng->old_y != y) || (pTseng->old_x != x)) { 342d983712dSmrg new_xy = ((y - 1) << 16) + MULBPP(pTseng, x - 1); 343d983712dSmrg ACL_XY_COUNT(new_xy); 344d983712dSmrg pTseng->old_x = x; 345d983712dSmrg pTseng->old_y = y; 346d983712dSmrg } 347d983712dSmrg} 348d983712dSmrg 349d983712dSmrgstatic __inline__ void 350d983712dSmrgSET_XY_6(TsengPtr pTseng, int x, int y) 351d983712dSmrg{ 352d983712dSmrg int new_xy; /* using this intermediate variable is faster */ 353d983712dSmrg 354d983712dSmrg if ((pTseng->old_y != y) || (pTseng->old_x != x)) { 355d983712dSmrg new_xy = ((y - 1) << 16) + MULBPP(pTseng, x) - 1; 356d983712dSmrg ACL_XY_COUNT(new_xy); 357d983712dSmrg pTseng->old_x = x; 358d983712dSmrg pTseng->old_y = y; 359d983712dSmrg } 360d983712dSmrg} 361d983712dSmrg 362d983712dSmrg/* generic SET_XY_RAW */ 363d983712dSmrgstatic __inline__ void 364d983712dSmrgSET_XY_RAW(TsengPtr pTseng,int x, int y) 365d983712dSmrg{ 366d983712dSmrg ACL_XY_COUNT((y << 16) + x); 367d983712dSmrg pTseng->old_x = pTseng->old_y = -1; /* invalidate old_x/old_y (raw transfers) */ 368d983712dSmrg} 369d983712dSmrg 370d983712dSmrgstatic __inline__ void 371d983712dSmrgPINGPONG(TsengPtr pTseng) 372d983712dSmrg{ 373d983712dSmrg if (pTseng->tsengFg == 0) { 374d983712dSmrg pTseng->tsengFg = 8; 375d983712dSmrg pTseng->tsengBg = 24; 376d983712dSmrg pTseng->tsengPat = 40; 377d983712dSmrg } else { 378d983712dSmrg pTseng->tsengFg = 0; 379d983712dSmrg pTseng->tsengBg = 16; 380d983712dSmrg pTseng->tsengPat = 32; 381d983712dSmrg } 382d983712dSmrg} 383d983712dSmrg 384d983712dSmrg/* 385d983712dSmrg * This is called in each ACL function just before the first ACL register is 386d983712dSmrg * written to. It waits for the accelerator to finish on cards that don't 387d983712dSmrg * support hardware-wait-state locking, and waits for a free queue entry on 388d983712dSmrg * others, if hardware-wait-states are not enabled. 389d983712dSmrg */ 390d983712dSmrgstatic __inline__ void 391d983712dSmrgwait_acl_queue(TsengPtr pTseng) 392d983712dSmrg{ 393d983712dSmrg if (pTseng->UsePCIRetry) 394d983712dSmrg WAIT_QUEUE; 395d983712dSmrg if (pTseng->need_wait_acl) 396d983712dSmrg WAIT_ACL; 397d983712dSmrg} 398d983712dSmrg#endif /* _TSENG_ACCEL_H */ 399