apm_regs.h revision 17a48c7c
1/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/apm/apm_regs.h,v 1.7 2000/02/29 03:09:18 dawes Exp $ */
2
3
4
5#define curr08		(curr - 0x30)
6#define curr16		((CARD16 *)(curr - 0x30))
7#define curr32		((CARD32 *)(curr - 0x30))
8#define check08(addr, val)						\
9    ((addr) >= 0x80 || (((addr)&0xF8) == 0x48) || curr08[(addr)] != (val))
10#define check16(addr, val)						\
11    ((addr) >= 0x80 || (((addr)&0xF8) == 0x48) || curr16[(addr) / 2] != (val)||\
12	((addr) == 0x50 && curr32[0x40 / 4] & DEC_QUICKSTART_ONSOURCE)||\
13	((addr) == 0x52 && curr32[0x40 / 4] & DEC_QUICKSTART_ONSOURCE)||\
14	((addr) == 0x54 && curr32[0x40 / 4] & DEC_QUICKSTART_ONDEST) ||	\
15	((addr) == 0x56 && curr32[0x40 / 4] & DEC_QUICKSTART_ONDEST) ||	\
16	((addr) == 0x58 && curr32[0x40 / 4] & DEC_QUICKSTART_ONDIMX))
17#define check32(addr, val)						\
18    ((addr) >= 0x80 || (((addr)&0xF8) == 0x48) || curr32[(addr) / 4] != (val)||\
19	((addr) == 0x50 && curr32[0x40 / 4] & DEC_QUICKSTART_ONSOURCE)||\
20	((addr) == 0x54 && curr32[0x40 / 4] & DEC_QUICKSTART_ONDEST) ||	\
21	((addr) == 0x58 && curr32[0x40 / 4] & DEC_QUICKSTART_ONDIMX) ||	\
22	((addr) == 0x40 && (val) & DEC_START))
23
24#ifndef MIN
25#define MIN(a,b)	((a) < (b) ? (a) : (b))
26#endif
27/* Memory mapped access to extended registers */
28#define RDXB_M(addr)     (MMIO_IN8 (pApm->MemMap, (addr)))
29#define RDXW_M(addr)     (MMIO_IN16(pApm->MemMap, (addr)))
30#define RDXL_M(addr)     (MMIO_IN32(pApm->MemMap, (addr)))
31#define WRXB_M(addr,val)  do { if (check08((addr), (val))) { \
32			MMIO_OUT8 (pApm->MemMap, (addr), (val));	\
33			/*xf86DrvMsg(xf86Screens[pApm->pScreen->myNum]->scrnIndex, X_INFO, \
34				    "File %s, line %d,	%02X <-       %02X\n", \
35				    __FILE__, __LINE__, (addr), (val) & 255); */\
36			curr08[MIN((addr), 0x80)] = (val); }} while (0)
37#define WRXW_M(addr,val)  do { if (check16((addr), (val))) { \
38			MMIO_OUT16(pApm->MemMap, (addr), (val));	\
39			/*xf86DrvMsg(xf86Screens[pApm->pScreen->myNum]->scrnIndex, X_INFO, \
40				    "File %s, line %d,	%02X <-     %04X\n", \
41				    __FILE__, __LINE__, (addr), (val)&65535); */\
42			curr16[MIN(((addr) / 2), 0x40)] = (val); }} while (0)
43#define WRXL_M(addr,val)  do { if (check32((addr), (val))) { \
44			MMIO_OUT32(pApm->MemMap, (addr), (val));	\
45			/*xf86DrvMsg(xf86Screens[pApm->pScreen->myNum]->scrnIndex, X_INFO, \
46				    "File %s, line %d,	%02X <- %08X\n", \
47				    __FILE__, __LINE__, (addr), (val)); */\
48			curr32[MIN(((addr) / 4), 0x20)] = (val); }} while (0)
49
50/* IO port access to extended registers */
51#define RDXB_IOP(addr)     (wrinx(pApm->xport, 0x1D, (addr) >> 2), \
52			    inb(pApm->xbase + ((addr) & 3)))
53#define RDXW_IOP(addr)     (wrinx(pApm->xport, 0x1D, (addr) >> 2), \
54			    inw(pApm->xbase + ((addr) & 2)))
55#define RDXL_IOP(addr)     (wrinx(pApm->xport, 0x1D, (addr) >> 2), \
56			    inl(pApm->xbase))
57#define WRXB_IOP(addr,val)					   \
58    do { 							   \
59	if (check08((addr), (val))) {				   \
60	    wrinx(pApm->xport, 0x1D, (addr) >> 2);		   \
61	    outb(pApm->xbase + ((addr) & 3), (val));		   \
62	    curr08[MIN((addr), 0x80)] = (val);			   \
63	    break;						   \
64	}							   \
65    } while (1)
66#define WRXW_IOP(addr,val)					   \
67    do {							   \
68	if (check16((addr), (val))) {				   \
69	    wrinx(pApm->xport, 0x1D, (addr) >> 2);		   \
70	    outw(pApm->xbase + ((addr) & 2), (val));		   \
71	    curr16[MIN(((addr) / 2), 0x40)] = (val);		   \
72	    break;						   \
73	}							   \
74    } while (1)
75#define WRXL_IOP(addr,val)					   \
76    do {							   \
77	if (check32((addr), (val))) {				   \
78	    wrinx(pApm->xport, 0x1D, (addr) >> 2);		   \
79	    outl(pApm->xbase, (val));				   \
80	    curr32[MIN(((addr) / 4), 0x20)] = (val);		   \
81	    break;						   \
82	}							   \
83    } while (1)
84
85#define WRXL	WRXL_M
86#define WRXW	WRXW_M
87#define WRXB	WRXB_M
88#define RDXL	RDXL_M
89#define RDXW	RDXW_M
90#define RDXB	RDXB_M
91#define UPDATEDEST(x,y)		(void)(curr32[0x54 / 4] = ((y) << 16) | ((x) & 0xFFFF))
92
93/* Memory mapped access to VGA registers */
94#define APMVGAB(idx)		(((volatile unsigned char  *)pApm->VGAMap)[idx])
95#define APMVGAS(idx)		(((volatile unsigned short *)pApm->VGAMap)[(idx) >> 1])
96#define APMVGAW(idx)		(((volatile unsigned int   *)pApm->VGAMap)[(idx) >> 2])
97#define ApmWriteCrtc(idx, val)	do { APMVGAS(0x3D4) = ((val) << 8) | ((idx) & 0xFF); break; } while(1)
98#define ApmReadCrtc(idx)	((APMVGAB(0x3D4) = (idx)), APMVGAB(0x3D5))
99#define ApmWriteGr(idx, val)	do { APMVGAS(0x3CE) = ((val) << 8) | ((idx) & 0xFF); break; } while(1)
100#define ApmReadGr(idx)	((APMVGAB(0x3CE) = (idx)), APMVGAB(0x3CF))
101#define ApmWriteSeq(idx, val)	do { APMVGAB(0x3C4) = (idx); APMVGAB(0x3C5) = (val); break; } while(1)
102#define ApmReadSeq(idx)	((APMVGAB(0x3C4) = (idx)), APMVGAB(0x3C5))
103#define ApmWriteAttr(idx, val)	do { int tmp = APMVGAB(0x3DA); APMVGAB(0x3C0) = (idx); APMVGAB(0x3C0) = (val); break; } while(1)
104#define ApmReadAttr(idx)	(APMVGAB(0x3DA), (APMVGAB(0x3C0) = (idx)), APMVGAB(0x3C1))
105#define ApmWriteMiscOut(val)	do { APMVGAB(0x3C2) = (val); break; } while(1)
106#define ApmReadMiscOut()	APMVGAB(0x3CC)
107#define ApmWriteDacMask(val)	do { APMVGAB(0x3C6) = (val); break; } while(1)
108#define ApmReadDacMask()	APMVGAB(0x3C6)
109#define ApmWriteDacReadAddr(val)do { APMVGAB(0x3C7) = (val); break; } while(1)
110#define ApmWriteDacWriteAddr(val)do{ APMVGAB(0x3C8) = (val); break; } while(1)
111#define ApmWriteDacData(val)	do { APMVGAB(0x3C9) = (val); break; } while(1)
112#define ApmReadDacData()	APMVGAB(0x3C9)
113
114#define STATUS()			(RDXL(0x1FC))
115#define STATUS_IOP()			(RDXL_IOP(0x1FC))
116#define STATUS_FIFO			(0x0F)
117#define STATUS_HOSTBLTBUSY		(1 << 8)
118#define STATUS_ENGINEBUSY		(1 << 10)
119#define STATUS_SDA			(1 << 16)
120#define STATUS_SCL			(1 << 17)
121
122#define SETFOREGROUNDCOLOR(c)		WRXL(0x60,c)
123#define SETBACKGROUNDCOLOR(c)		WRXL(0x64,c)
124
125#define SETSOURCEX(x)			WRXW(0x50, x)
126#define SETSOURCEY(y)			WRXW(0x52, y)
127#define SETSOURCEXY(x,y)		WRXL(0x50, ((y) << 16) | ((x) & 0xFFFF))
128#define SETSOURCEOFF(o)			WRXL(0x50, (o))
129
130#define SETDESTX(x)			WRXW(0x54, x)
131#define SETDESTY(y)			WRXW(0x56, y)
132#define SETDESTXY(x,y)			WRXL(0x54, ((y) << 16) | ((x) & 0xFFFF))
133#define SETDESTOFF(o)			WRXL(0x54, (o))
134
135#define SETWIDTH(w)			WRXW(0x58, w)
136#define SETHEIGHT(h)			WRXW(0x5A, h)
137#define SETWIDTHHEIGHT(w,h)		WRXL(0x58, ((h) << 16) | ((w) & 0xFFFF))
138
139#define SETOFFSET(o)			WRXW(0x5C, (o))
140#define SETSOURCEOFFSET(o)		WRXW(0x5E, (o))
141
142#define SETBYTEMASK(mask)		WRXB(0x47, (mask))
143
144#define SETPATTERN(p1, p2)		do {WRXL(0x48, p1); WRXL(0x4C, p2);} while(0)
145
146#define SETDDA_AXIALSTEP(step)		WRXW(0x70, (step))
147#define SETDDA_DIAGONALSTEP(step)	WRXW(0x72, (step))
148#define SETDDA_ERRORTERM(eterm)		WRXW(0x74, (eterm))
149#define SETDDA_ADSTEP(s1,s2)		WRXL(0x70, ((s2) << 16)|((s1) & 0xFFFF))
150
151#define SETCLIP_CTRL(ctrl)		WRXB(0x30, (ctrl))
152#define SETCLIP_LEFT(x)			WRXW(0x38, (x))
153#define SETCLIP_TOP(y)			WRXW(0x3A, (y))
154#define SETCLIP_LEFTTOP(x,y)		WRXL(0x38, ((y) << 16) | ((x) & 0xFFFF))
155#define SETCLIP_RIGHT(x)		WRXW(0x3C, (x))
156#define SETCLIP_BOT(y)			WRXW(0x3E, (y))
157#define SETCLIP_RIGHTBOT(x,y)		WRXL(0x3C, ((y) << 16) | ((x) & 0xFFFF))
158
159/* RASTER OPERATION REGISTER */
160/* P = pattern   S = source   D = destination */
161#define SETROP(rop)			WRXB(0x46, (rop))
162#define ROP_P_and_S_and_D		0x80
163#define ROP_S_xor_D			0x66
164#define ROP_S				0xCC
165#define ROP_P				0xF0
166/* Then there are about 252 more operations ... */
167
168
169/* DRAWING ENGINE CONTROL REGISTER */
170#define SETDEC(control)             WRXL(0x40, (control))
171#define DEC_OP_VECT_NOENDP          0x0000000D
172#define DEC_OP_VECT_ENDP            0x0000000C
173#define DEC_OP_HOSTBLT_SCREEN2HOST  0x00000009
174#define DEC_OP_HOSTBLT_HOST2SCREEN  0x00000008
175#define DEC_OP_STRIP                0x00000004
176#define DEC_OP_BLT_STRETCH          0x00000003
177#define DEC_OP_RECT                 0x00000002
178#define DEC_OP_BLT                  0x00000001
179#define DEC_OP_NOOP                 0x00000000
180#define DEC_DIR_X_NEG               (1 << 6)
181#define DEC_DIR_X_POS               (0 << 6)
182#define DEC_DIR_Y_NEG               (1 << 7)
183#define DEC_DIR_Y_POS               (0 << 7)
184#define DEC_MAJORAXIS_X             (0 << 8) /* Looks like an error in the docs ...*/
185#define DEC_MAJORAXIS_Y             (1 << 8)
186#define DEC_SOURCE_LINEAR           (1 << 9)
187#define DEC_SOURCE_XY               (0 << 9)
188#define DEC_SOURCE_CONTIG           (1 << 11)
189#define DEC_SOURCE_RECTANGULAR      (0 << 11)
190#define DEC_SOURCE_MONOCHROME       (1 << 12)
191#define DEC_SOURCE_COLOR            (0 << 12)
192#define DEC_SOURCE_TRANSPARENCY     (1 << 13)
193#define DEC_SOURCE_NO_TRANSPARENCY  (0 << 13)
194#define DEC_BITDEPTH_MASK	    (7 << 14)
195#define DEC_BITDEPTH_24             (4 << 14)
196#define DEC_BITDEPTH_32             (3 << 14)
197#define DEC_BITDEPTH_16             (2 << 14)
198#define DEC_BITDEPTH_8              (1 << 14)
199#define DEC_DEST_LINEAR             (1 << 18)
200#define DEC_DEST_XY                 (0 << 18)
201#define DEC_DEST_CONTIG             (1 << 19)
202#define DEC_DEST_RECTANGULAR        (0 << 19)
203#define DEC_DEST_TRANSPARENCY       (1 << 20)
204#define DEC_DEST_NO_TRANSPARENCY    (0 << 20)
205#define DEC_DEST_TRANSP_POLARITY    (1 << 21)
206#define DEC_DEST_TRANSP_POLARITYINV (0 << 21)
207#define DEC_PATTERN_88_8bCOLOR      (3 << 22)
208#define DEC_PATTERN_88_1bMONO       (2 << 22)
209#define DEC_PATTERN_44_4bDITHER     (1 << 22)
210#define DEC_PATTERN_NONE            (0 << 22)
211#define DEC_WIDTH_MASK		    (7 << 24)
212#define DEC_WIDTH_1600              (7 << 24)
213#define DEC_WIDTH_1280              (6 << 24)
214#define DEC_WIDTH_1152              (5 << 24)
215#define DEC_WIDTH_1024              (4 << 24)
216#define DEC_WIDTH_800               (2 << 24)
217#define DEC_WIDTH_640               (1 << 24)
218#define DEC_WIDTH_LINEAR            (0 << 24)
219#define DEC_DEST_UPD_LASTPIX        (3 << 27)
220#define DEC_DEST_UPD_BLCORNER       (2 << 27)
221#define DEC_DEST_UPD_TRCORNER       (1 << 27)
222#define DEC_DEST_UPD_NONE           (0 << 27)
223#define DEC_QUICKSTART_ONDEST       (3 << 29)
224#define DEC_QUICKSTART_ONSOURCE     (2 << 29)
225#define DEC_QUICKSTART_ONDIMX       (1 << 29)
226#define DEC_QUICKSTART_NONE         (0 << 29)
227#define DEC_START                   (1 << 31)
228#define DEC_START_NO                (0 << 31)
229
230#define AT3D_SST_STATUS		0x1F4
231#define		SST_BUSY	1
232