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