xref: /OK3568_Linux_fs/kernel/drivers/video/fbdev/sis/sis_accel.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * SiS 300/540/630[S]/730[S],
4*4882a593Smuzhiyun  * SiS 315[E|PRO]/550/[M]650/651/[M]661[F|M]X/740/[M]741[GX]/330/[M]760[GX],
5*4882a593Smuzhiyun  * XGI V3XT/V5/V8, Z7
6*4882a593Smuzhiyun  * frame buffer driver for Linux kernels >= 2.4.14 and >=2.6.3
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * 2D acceleration part
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Based on the X driver's sis300_accel.h which is
11*4882a593Smuzhiyun  *     Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
12*4882a593Smuzhiyun  * and sis310_accel.h which is
13*4882a593Smuzhiyun  *     Copyright (C) 2001-2004 by Thomas Winischhofer, Vienna, Austria
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  * Author:   Thomas Winischhofer <thomas@winischhofer.net>:
16*4882a593Smuzhiyun  *			(see http://www.winischhofer.net/
17*4882a593Smuzhiyun  *			for more information and updates)
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #ifndef _SISFB_ACCEL_H
21*4882a593Smuzhiyun #define _SISFB_ACCEL_H
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun /* Guard accelerator accesses with spin_lock_irqsave? Works well without. */
24*4882a593Smuzhiyun #undef SISFB_USE_SPINLOCKS
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #ifdef SISFB_USE_SPINLOCKS
27*4882a593Smuzhiyun #include <linux/spinlock.h>
28*4882a593Smuzhiyun #define CRITBEGIN  spin_lock_irqsave(&ivideo->lockaccel, critflags);
29*4882a593Smuzhiyun #define CRITEND	   spin_unlock_irqrestore(&ivideo->lockaccel, critflags);
30*4882a593Smuzhiyun #define CRITFLAGS  unsigned long critflags;
31*4882a593Smuzhiyun #else
32*4882a593Smuzhiyun #define CRITBEGIN
33*4882a593Smuzhiyun #define CRITEND
34*4882a593Smuzhiyun #define CRITFLAGS
35*4882a593Smuzhiyun #endif
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun /* Definitions for the SIS engine communication. */
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #define PATREGSIZE      384  /* Pattern register size. 384 bytes @ 0x8300 */
40*4882a593Smuzhiyun #define BR(x)   (0x8200 | (x) << 2)
41*4882a593Smuzhiyun #define PBR(x)  (0x8300 | (x) << 2)
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun /* SiS300 engine commands */
44*4882a593Smuzhiyun #define BITBLT                  0x00000000  /* Blit */
45*4882a593Smuzhiyun #define COLOREXP                0x00000001  /* Color expand */
46*4882a593Smuzhiyun #define ENCOLOREXP              0x00000002  /* Enhanced color expand */
47*4882a593Smuzhiyun #define MULTIPLE_SCANLINE       0x00000003  /* ? */
48*4882a593Smuzhiyun #define LINE                    0x00000004  /* Draw line */
49*4882a593Smuzhiyun #define TRAPAZOID_FILL          0x00000005  /* Fill trapezoid */
50*4882a593Smuzhiyun #define TRANSPARENT_BITBLT      0x00000006  /* Transparent Blit */
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun /* Additional engine commands for 315 */
53*4882a593Smuzhiyun #define ALPHA_BLEND		0x00000007  /* Alpha blend ? */
54*4882a593Smuzhiyun #define A3D_FUNCTION		0x00000008  /* 3D command ? */
55*4882a593Smuzhiyun #define	CLEAR_Z_BUFFER		0x00000009  /* ? */
56*4882a593Smuzhiyun #define GRADIENT_FILL		0x0000000A  /* Gradient fill */
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun /* source select */
59*4882a593Smuzhiyun #define SRCVIDEO                0x00000000  /* source is video RAM */
60*4882a593Smuzhiyun #define SRCSYSTEM               0x00000010  /* source is system memory */
61*4882a593Smuzhiyun #define SRCCPUBLITBUF           SRCSYSTEM   /* source is CPU-driven BitBuffer (for color expand) */
62*4882a593Smuzhiyun #define SRCAGP                  0x00000020  /* source is AGP memory (?) */
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun /* Pattern flags */
65*4882a593Smuzhiyun #define PATFG                   0x00000000  /* foreground color */
66*4882a593Smuzhiyun #define PATPATREG               0x00000040  /* pattern in pattern buffer (0x8300) */
67*4882a593Smuzhiyun #define PATMONO                 0x00000080  /* mono pattern */
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun /* blitting direction (300 series only) */
70*4882a593Smuzhiyun #define X_INC                   0x00010000
71*4882a593Smuzhiyun #define X_DEC                   0x00000000
72*4882a593Smuzhiyun #define Y_INC                   0x00020000
73*4882a593Smuzhiyun #define Y_DEC                   0x00000000
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun /* Clipping flags */
76*4882a593Smuzhiyun #define NOCLIP                  0x00000000
77*4882a593Smuzhiyun #define NOMERGECLIP             0x04000000
78*4882a593Smuzhiyun #define CLIPENABLE              0x00040000
79*4882a593Smuzhiyun #define CLIPWITHOUTMERGE        0x04040000
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun /* Transparency */
82*4882a593Smuzhiyun #define OPAQUE                  0x00000000
83*4882a593Smuzhiyun #define TRANSPARENT             0x00100000
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun /* ? */
86*4882a593Smuzhiyun #define DSTAGP                  0x02000000
87*4882a593Smuzhiyun #define DSTVIDEO                0x02000000
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun /* Subfunctions for Color/Enhanced Color Expansion (315 only) */
90*4882a593Smuzhiyun #define COLOR_TO_MONO		0x00100000
91*4882a593Smuzhiyun #define AA_TEXT			0x00200000
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun /* Some general registers for 315 series */
94*4882a593Smuzhiyun #define SRC_ADDR		0x8200
95*4882a593Smuzhiyun #define SRC_PITCH		0x8204
96*4882a593Smuzhiyun #define AGP_BASE		0x8206 /* color-depth dependent value */
97*4882a593Smuzhiyun #define SRC_Y			0x8208
98*4882a593Smuzhiyun #define SRC_X			0x820A
99*4882a593Smuzhiyun #define DST_Y			0x820C
100*4882a593Smuzhiyun #define DST_X			0x820E
101*4882a593Smuzhiyun #define DST_ADDR		0x8210
102*4882a593Smuzhiyun #define DST_PITCH		0x8214
103*4882a593Smuzhiyun #define DST_HEIGHT		0x8216
104*4882a593Smuzhiyun #define RECT_WIDTH		0x8218
105*4882a593Smuzhiyun #define RECT_HEIGHT		0x821A
106*4882a593Smuzhiyun #define PAT_FGCOLOR		0x821C
107*4882a593Smuzhiyun #define PAT_BGCOLOR		0x8220
108*4882a593Smuzhiyun #define SRC_FGCOLOR		0x8224
109*4882a593Smuzhiyun #define SRC_BGCOLOR		0x8228
110*4882a593Smuzhiyun #define MONO_MASK		0x822C
111*4882a593Smuzhiyun #define LEFT_CLIP		0x8234
112*4882a593Smuzhiyun #define TOP_CLIP		0x8236
113*4882a593Smuzhiyun #define RIGHT_CLIP		0x8238
114*4882a593Smuzhiyun #define BOTTOM_CLIP		0x823A
115*4882a593Smuzhiyun #define COMMAND_READY		0x823C
116*4882a593Smuzhiyun #define FIRE_TRIGGER      	0x8240
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun #define PATTERN_REG		0x8300  /* 384 bytes pattern buffer */
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun /* Transparent bitblit registers */
121*4882a593Smuzhiyun #define TRANS_DST_KEY_HIGH	PAT_FGCOLOR
122*4882a593Smuzhiyun #define TRANS_DST_KEY_LOW	PAT_BGCOLOR
123*4882a593Smuzhiyun #define TRANS_SRC_KEY_HIGH	SRC_FGCOLOR
124*4882a593Smuzhiyun #define TRANS_SRC_KEY_LOW	SRC_BGCOLOR
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun /* Store queue length in par */
127*4882a593Smuzhiyun #define CmdQueLen ivideo->cmdqueuelength
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun /* ------------- SiS 300 series -------------- */
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun /* BR(16) (0x8240):
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun    bit 31 2D engine: 1 is idle,
134*4882a593Smuzhiyun    bit 30 3D engine: 1 is idle,
135*4882a593Smuzhiyun    bit 29 Command queue: 1 is empty
136*4882a593Smuzhiyun    bits 28:24: Current CPU driven BitBlt buffer stage bit[4:0]
137*4882a593Smuzhiyun    bits 15:0:  Current command queue length
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun */
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun #define SiS300Idle \
142*4882a593Smuzhiyun   { \
143*4882a593Smuzhiyun   	while((MMIO_IN16(ivideo->mmio_vbase, BR(16)+2) & 0xE000) != 0xE000){}; \
144*4882a593Smuzhiyun   	while((MMIO_IN16(ivideo->mmio_vbase, BR(16)+2) & 0xE000) != 0xE000){}; \
145*4882a593Smuzhiyun   	while((MMIO_IN16(ivideo->mmio_vbase, BR(16)+2) & 0xE000) != 0xE000){}; \
146*4882a593Smuzhiyun   	CmdQueLen = MMIO_IN16(ivideo->mmio_vbase, 0x8240); \
147*4882a593Smuzhiyun   }
148*4882a593Smuzhiyun /* (do three times, because 2D engine seems quite unsure about whether or not it's idle) */
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun #define SiS300SetupSRCBase(base) \
151*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS300Idle;\
152*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, BR(0), base);\
153*4882a593Smuzhiyun 	CmdQueLen--;
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun #define SiS300SetupSRCPitch(pitch) \
156*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS300Idle;\
157*4882a593Smuzhiyun 	MMIO_OUT16(ivideo->mmio_vbase, BR(1), pitch);\
158*4882a593Smuzhiyun 	CmdQueLen--;
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun #define SiS300SetupSRCXY(x,y) \
161*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS300Idle;\
162*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, BR(2), (x)<<16 | (y) );\
163*4882a593Smuzhiyun 	CmdQueLen--;
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun #define SiS300SetupDSTBase(base) \
166*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS300Idle;\
167*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, BR(4), base);\
168*4882a593Smuzhiyun 	CmdQueLen--;
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun #define SiS300SetupDSTXY(x,y) \
171*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS300Idle;\
172*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, BR(3), (x)<<16 | (y) );\
173*4882a593Smuzhiyun 	CmdQueLen--;
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun #define SiS300SetupDSTRect(x,y) \
176*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS300Idle;\
177*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, BR(5), (y)<<16 | (x) );\
178*4882a593Smuzhiyun 	CmdQueLen--;
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun #define SiS300SetupDSTColorDepth(bpp) \
181*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS300Idle;\
182*4882a593Smuzhiyun 	MMIO_OUT16(ivideo->mmio_vbase, BR(1)+2, bpp);\
183*4882a593Smuzhiyun 	CmdQueLen--;
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun #define SiS300SetupRect(w,h) \
186*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS300Idle;\
187*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, BR(6), (h)<<16 | (w) );\
188*4882a593Smuzhiyun 	CmdQueLen--;
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun #define SiS300SetupPATFG(color) \
191*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS300Idle;\
192*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, BR(7), color);\
193*4882a593Smuzhiyun 	CmdQueLen--;
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun #define SiS300SetupPATBG(color) \
196*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS300Idle;\
197*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, BR(8), color);\
198*4882a593Smuzhiyun 	CmdQueLen--;
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun #define SiS300SetupSRCFG(color) \
201*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS300Idle;\
202*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, BR(9), color);\
203*4882a593Smuzhiyun 	CmdQueLen--;
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun #define SiS300SetupSRCBG(color) \
206*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS300Idle;\
207*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, BR(10), color);\
208*4882a593Smuzhiyun 	CmdQueLen--;
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun /* 0x8224 src colorkey high */
211*4882a593Smuzhiyun /* 0x8228 src colorkey low */
212*4882a593Smuzhiyun /* 0x821c dest colorkey high */
213*4882a593Smuzhiyun /* 0x8220 dest colorkey low */
214*4882a593Smuzhiyun #define SiS300SetupSRCTrans(color) \
215*4882a593Smuzhiyun 	if(CmdQueLen <= 1) SiS300Idle;\
216*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, 0x8224, color);\
217*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, 0x8228, color);\
218*4882a593Smuzhiyun 	CmdQueLen -= 2;
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun #define SiS300SetupDSTTrans(color) \
221*4882a593Smuzhiyun 	if(CmdQueLen <= 1) SiS300Idle;\
222*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, 0x821C, color); \
223*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, 0x8220, color); \
224*4882a593Smuzhiyun 	CmdQueLen -= 2;
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun #define SiS300SetupMONOPAT(p0,p1) \
227*4882a593Smuzhiyun 	if(CmdQueLen <= 1) SiS300Idle;\
228*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, BR(11), p0);\
229*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, BR(12), p1);\
230*4882a593Smuzhiyun 	CmdQueLen -= 2;
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun #define SiS300SetupClipLT(left,top) \
233*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS300Idle;\
234*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, BR(13), ((left) & 0xFFFF) | (top)<<16 );\
235*4882a593Smuzhiyun 	CmdQueLen--;
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun #define SiS300SetupClipRB(right,bottom) \
238*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS300Idle;\
239*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, BR(14), ((right) & 0xFFFF) | (bottom)<<16 );\
240*4882a593Smuzhiyun 	CmdQueLen--;
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun /* General */
243*4882a593Smuzhiyun #define SiS300SetupROP(rop) \
244*4882a593Smuzhiyun 	ivideo->CommandReg = (rop) << 8;
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun #define SiS300SetupCMDFlag(flags) \
247*4882a593Smuzhiyun 	ivideo->CommandReg |= (flags);
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun #define SiS300DoCMD \
250*4882a593Smuzhiyun 	if(CmdQueLen <= 1) SiS300Idle;\
251*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, BR(15), ivideo->CommandReg); \
252*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, BR(16), 0);\
253*4882a593Smuzhiyun 	CmdQueLen -= 2;
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun /* -------------- SiS 315/330 series --------------- */
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun /* Q_STATUS:
258*4882a593Smuzhiyun    bit 31 = 1: All engines idle and all queues empty
259*4882a593Smuzhiyun    bit 30 = 1: Hardware Queue (=HW CQ, 2D queue, 3D queue) empty
260*4882a593Smuzhiyun    bit 29 = 1: 2D engine is idle
261*4882a593Smuzhiyun    bit 28 = 1: 3D engine is idle
262*4882a593Smuzhiyun    bit 27 = 1: HW command queue empty
263*4882a593Smuzhiyun    bit 26 = 1: 2D queue empty
264*4882a593Smuzhiyun    bit 25 = 1: 3D queue empty
265*4882a593Smuzhiyun    bit 24 = 1: SW command queue empty
266*4882a593Smuzhiyun    bits 23:16: 2D counter 3
267*4882a593Smuzhiyun    bits 15:8:  2D counter 2
268*4882a593Smuzhiyun    bits 7:0:   2D counter 1
269*4882a593Smuzhiyun */
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun #define SiS310Idle \
272*4882a593Smuzhiyun   { \
273*4882a593Smuzhiyun   	while( (MMIO_IN16(ivideo->mmio_vbase, Q_STATUS+2) & 0x8000) != 0x8000){}; \
274*4882a593Smuzhiyun   	while( (MMIO_IN16(ivideo->mmio_vbase, Q_STATUS+2) & 0x8000) != 0x8000){}; \
275*4882a593Smuzhiyun 	while( (MMIO_IN16(ivideo->mmio_vbase, Q_STATUS+2) & 0x8000) != 0x8000){}; \
276*4882a593Smuzhiyun   	while( (MMIO_IN16(ivideo->mmio_vbase, Q_STATUS+2) & 0x8000) != 0x8000){}; \
277*4882a593Smuzhiyun   	CmdQueLen = 0; \
278*4882a593Smuzhiyun   }
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun #define SiS310SetupSRCBase(base) \
281*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS310Idle;\
282*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, SRC_ADDR, base);\
283*4882a593Smuzhiyun 	CmdQueLen--;
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun #define SiS310SetupSRCPitch(pitch) \
286*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS310Idle;\
287*4882a593Smuzhiyun 	MMIO_OUT16(ivideo->mmio_vbase, SRC_PITCH, pitch);\
288*4882a593Smuzhiyun 	CmdQueLen--;
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun #define SiS310SetupSRCXY(x,y) \
291*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS310Idle;\
292*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, SRC_Y, (x)<<16 | (y) );\
293*4882a593Smuzhiyun 	CmdQueLen--;
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun #define SiS310SetupDSTBase(base) \
296*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS310Idle;\
297*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, DST_ADDR, base);\
298*4882a593Smuzhiyun 	CmdQueLen--;
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun #define SiS310SetupDSTXY(x,y) \
301*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS310Idle;\
302*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, DST_Y, (x)<<16 | (y) );\
303*4882a593Smuzhiyun 	CmdQueLen--;
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun #define SiS310SetupDSTRect(x,y) \
306*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS310Idle;\
307*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, DST_PITCH, (y)<<16 | (x) );\
308*4882a593Smuzhiyun 	CmdQueLen--;
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun #define SiS310SetupDSTColorDepth(bpp) \
311*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS310Idle;\
312*4882a593Smuzhiyun 	MMIO_OUT16(ivideo->mmio_vbase, AGP_BASE, bpp);\
313*4882a593Smuzhiyun 	CmdQueLen--;
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun #define SiS310SetupRect(w,h) \
316*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS310Idle;\
317*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, RECT_WIDTH, (h)<<16 | (w) );\
318*4882a593Smuzhiyun 	CmdQueLen--;
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun #define SiS310SetupPATFG(color) \
321*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS310Idle;\
322*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, PAT_FGCOLOR, color);\
323*4882a593Smuzhiyun 	CmdQueLen--;
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun #define SiS310SetupPATBG(color) \
326*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS310Idle;\
327*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, PAT_BGCOLOR, color);\
328*4882a593Smuzhiyun 	CmdQueLen--;
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun #define SiS310SetupSRCFG(color) \
331*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS310Idle;\
332*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, SRC_FGCOLOR, color);\
333*4882a593Smuzhiyun 	CmdQueLen--;
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun #define SiS310SetupSRCBG(color) \
336*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS310Idle;\
337*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, SRC_BGCOLOR, color);\
338*4882a593Smuzhiyun 	CmdQueLen--;
339*4882a593Smuzhiyun 
340*4882a593Smuzhiyun #define SiS310SetupSRCTrans(color) \
341*4882a593Smuzhiyun 	if(CmdQueLen <= 1) SiS310Idle;\
342*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, TRANS_SRC_KEY_HIGH, color);\
343*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, TRANS_SRC_KEY_LOW, color);\
344*4882a593Smuzhiyun 	CmdQueLen -= 2;
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun #define SiS310SetupDSTTrans(color) \
347*4882a593Smuzhiyun 	if(CmdQueLen <= 1) SiS310Idle;\
348*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, TRANS_DST_KEY_HIGH, color); \
349*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, TRANS_DST_KEY_LOW, color); \
350*4882a593Smuzhiyun 	CmdQueLen -= 2;
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun #define SiS310SetupMONOPAT(p0,p1) \
353*4882a593Smuzhiyun 	if(CmdQueLen <= 1) SiS310Idle;\
354*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, MONO_MASK, p0);\
355*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, MONO_MASK+4, p1);\
356*4882a593Smuzhiyun 	CmdQueLen -= 2;
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun #define SiS310SetupClipLT(left,top) \
359*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS310Idle;\
360*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, LEFT_CLIP, ((left) & 0xFFFF) | (top)<<16 );\
361*4882a593Smuzhiyun 	CmdQueLen--;
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun #define SiS310SetupClipRB(right,bottom) \
364*4882a593Smuzhiyun 	if(CmdQueLen <= 0) SiS310Idle;\
365*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, RIGHT_CLIP, ((right) & 0xFFFF) | (bottom)<<16 );\
366*4882a593Smuzhiyun 	CmdQueLen--;
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun #define SiS310SetupROP(rop) \
369*4882a593Smuzhiyun 	ivideo->CommandReg = (rop) << 8;
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun #define SiS310SetupCMDFlag(flags) \
372*4882a593Smuzhiyun 	ivideo->CommandReg |= (flags);
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun #define SiS310DoCMD \
375*4882a593Smuzhiyun 	if(CmdQueLen <= 1) SiS310Idle;\
376*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, COMMAND_READY, ivideo->CommandReg); \
377*4882a593Smuzhiyun 	MMIO_OUT32(ivideo->mmio_vbase, FIRE_TRIGGER, 0); \
378*4882a593Smuzhiyun 	CmdQueLen -= 2;
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun int  sisfb_initaccel(struct sis_video_info *ivideo);
381*4882a593Smuzhiyun void sisfb_syncaccel(struct sis_video_info *ivideo);
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun int  fbcon_sis_sync(struct fb_info *info);
384*4882a593Smuzhiyun void fbcon_sis_fillrect(struct fb_info *info, const struct fb_fillrect *rect);
385*4882a593Smuzhiyun void fbcon_sis_copyarea(struct fb_info *info, const struct fb_copyarea *area);
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun #endif
388