savage_regs.h revision ab47cfaa
1ab47cfaaSmrg/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/savage/savage_regs.h,v 1.11 2002/05/14 20:19:52 alanh Exp $ */
2ab47cfaaSmrg
3ab47cfaaSmrg#ifndef _SAVAGE_REGS_H
4ab47cfaaSmrg#define _SAVAGE_REGS_H
5ab47cfaaSmrg
6ab47cfaaSmrg/* Copied and renamed from radeon_reg.h for AGP/PCI detection. */
7ab47cfaaSmrg#define SAVAGE_STATUS_PCI_CONFIG            0x06
8ab47cfaaSmrg#       define SAVAGE_CAP_LIST              0x100000
9ab47cfaaSmrg#define SAVAGE_CAPABILITIES_PTR_PCI_CONFIG  0x34 /* offset in PCI config*/
10ab47cfaaSmrg#       define SAVAGE_CAP_PTR_MASK          0xfc /* mask off reserved bits of CAP_PTR */
11ab47cfaaSmrg#       define SAVAGE_CAP_ID_NULL           0x00 /* End of capability list */
12ab47cfaaSmrg#       define SAVAGE_CAP_ID_AGP            0x02 /* AGP capability ID */
13ab47cfaaSmrg
14ab47cfaaSmrg#define S3_SAVAGE3D_SERIES(chip)  ((chip>=S3_SAVAGE3D) && (chip<=S3_SAVAGE_MX))
15ab47cfaaSmrg
16ab47cfaaSmrg#define S3_SAVAGE4_SERIES(chip)  ((chip==S3_SAVAGE4)            \
17ab47cfaaSmrg                                  || (chip==S3_PROSAVAGE)       \
18ab47cfaaSmrg                                  || (chip==S3_TWISTER)         \
19ab47cfaaSmrg                                  || (chip==S3_PROSAVAGEDDR))
20ab47cfaaSmrg
21ab47cfaaSmrg#define	S3_SAVAGE_MOBILE_SERIES(chip)	((chip==S3_SAVAGE_MX) || (chip==S3_SUPERSAVAGE))
22ab47cfaaSmrg
23ab47cfaaSmrg#define S3_SAVAGE_SERIES(chip)    ((chip>=S3_SAVAGE3D) && (chip<=S3_SAVAGE2000))
24ab47cfaaSmrg
25ab47cfaaSmrg#define S3_MOBILE_TWISTER_SERIES(chip)   ((chip==S3_TWISTER)    \
26ab47cfaaSmrg                                          ||(chip==S3_PROSAVAGEDDR))
27ab47cfaaSmrg
28ab47cfaaSmrg/* Chip tags.  These are used to group the adapters into
29ab47cfaaSmrg * related families.
30ab47cfaaSmrg */
31ab47cfaaSmrg
32ab47cfaaSmrgenum S3CHIPTAGS {
33ab47cfaaSmrg    S3_UNKNOWN = 0,
34ab47cfaaSmrg    S3_SAVAGE3D,
35ab47cfaaSmrg    S3_SAVAGE_MX,
36ab47cfaaSmrg    S3_SAVAGE4,
37ab47cfaaSmrg    S3_PROSAVAGE,
38ab47cfaaSmrg    S3_TWISTER,
39ab47cfaaSmrg    S3_PROSAVAGEDDR,
40ab47cfaaSmrg    S3_SUPERSAVAGE,
41ab47cfaaSmrg    S3_SAVAGE2000,
42ab47cfaaSmrg    S3_LAST
43ab47cfaaSmrg};
44ab47cfaaSmrg
45ab47cfaaSmrg#define BIOS_BSIZE			1024
46ab47cfaaSmrg#define BIOS_BASE			0xc0000
47ab47cfaaSmrg
48ab47cfaaSmrg#define SAVAGE_NEWMMIO_REGBASE_S3	0x1000000  /* 16MB */
49ab47cfaaSmrg#define SAVAGE_NEWMMIO_REGBASE_S4	0x0000000
50ab47cfaaSmrg#define SAVAGE_NEWMMIO_REGSIZE		0x0080000	/* 512kb */
51ab47cfaaSmrg#define SAVAGE_NEWMMIO_VGABASE		0x8000
52ab47cfaaSmrg
53ab47cfaaSmrg#define BASE_FREQ			14.31818
54ab47cfaaSmrg
55ab47cfaaSmrg#define FIFO_CONTROL_REG		0x8200
56ab47cfaaSmrg#define MIU_CONTROL_REG			0x8204
57ab47cfaaSmrg#define STREAMS_TIMEOUT_REG		0x8208
58ab47cfaaSmrg#define MISC_TIMEOUT_REG		0x820c
59ab47cfaaSmrg
60ab47cfaaSmrg#define ADVANCED_FUNC_CTRL		0x850C
61ab47cfaaSmrg
62ab47cfaaSmrg/*
63ab47cfaaSmrg * CR/SR registers MMIO offset
64ab47cfaaSmrg * MISC Output Register(W:0x3c2,R:0x3cc) controls CR is 0X83Cx or 0X83Bx
65ab47cfaaSmrg * but do we need to set MISC Output Register ???
66ab47cfaaSmrg * (Note that CRT_ADDRESS_REG and CRT_DATA_REG are assumed to be COLOR)???
67ab47cfaaSmrg */
68ab47cfaaSmrg#define MMIO_BASE_OF_VGA3C0             0X83C0
69ab47cfaaSmrg#define MMIO_BASE_OF_VGA3D0             0X83D0
70ab47cfaaSmrg
71ab47cfaaSmrg#define ATTR_ADDRESS_REG        \
72ab47cfaaSmrg    (MMIO_BASE_OF_VGA3C0 + (0x03C0 - 0x03C0))
73ab47cfaaSmrg#define ATTR_DATA_WRITE_REG     \
74ab47cfaaSmrg    (MMIO_BASE_OF_VGA3C0 + (0x03C0 - 0x03C0))
75ab47cfaaSmrg#define ATTR_DATA_READ_REG      \
76ab47cfaaSmrg    (MMIO_BASE_OF_VGA3C0 + (0x03C1 - 0x03C0))
77ab47cfaaSmrg#define VIDEO_SUBSYSTEM_ENABLE  \
78ab47cfaaSmrg    (MMIO_BASE_OF_VGA3C0 + (0x03C3 - 0x03C0))
79ab47cfaaSmrg#define SEQ_ADDRESS_REG         \
80ab47cfaaSmrg    (MMIO_BASE_OF_VGA3C0 + (0x03C4 - 0x03C0))
81ab47cfaaSmrg#define SEQ_DATA_REG            \
82ab47cfaaSmrg    (MMIO_BASE_OF_VGA3C0 + (0x03C5 - 0x03C0))
83ab47cfaaSmrg#define DAC_PIXEL_MASK_REG      \
84ab47cfaaSmrg    (MMIO_BASE_OF_VGA3C0 + (0x03C6 - 0x03C0))
85ab47cfaaSmrg#define DAC_PEL_MASK            \
86ab47cfaaSmrg    (MMIO_BASE_OF_VGA3C0 + (0x03C6 - 0x03C0))
87ab47cfaaSmrg#define DAC_STATUS_REG          \
88ab47cfaaSmrg    (MMIO_BASE_OF_VGA3C0 + (0x03C7 - 0x03C0))
89ab47cfaaSmrg#define DAC_ADDRESS_READ_REG    \
90ab47cfaaSmrg    (MMIO_BASE_OF_VGA3C0 + (0x03C7 - 0x03C0))
91ab47cfaaSmrg#define DAC_ADDRESS_WRITE_REG   \
92ab47cfaaSmrg    (MMIO_BASE_OF_VGA3C0 + (0x03C8 - 0x03C0))
93ab47cfaaSmrg#define DAC_DATA_REG            \
94ab47cfaaSmrg    (MMIO_BASE_OF_VGA3C0 + (0x03C9 - 0x03C0))
95ab47cfaaSmrg#define DAC_DATA_REG_PORT       \
96ab47cfaaSmrg    (MMIO_BASE_OF_VGA3C0 + (0x03C9 - 0x03C0))
97ab47cfaaSmrg#define MISC_OUTPUT_REG_WRITE   \
98ab47cfaaSmrg    (MMIO_BASE_OF_VGA3C0 + (0x03C2 - 0x03C0))
99ab47cfaaSmrg#define MISC_OUTPUT_REG_READ    \
100ab47cfaaSmrg    (MMIO_BASE_OF_VGA3C0 + (0x03CC - 0x03C0))
101ab47cfaaSmrg#define GR_ADDRESS_REG          \
102ab47cfaaSmrg    (MMIO_BASE_OF_VGA3C0 + (0x03CE - 0x03C0))
103ab47cfaaSmrg#define GR_DATA_REG             \
104ab47cfaaSmrg    (MMIO_BASE_OF_VGA3C0 + (0x03CF - 0x03C0))
105ab47cfaaSmrg#define WAKEUP_REG              \
106ab47cfaaSmrg    (MMIO_BASE_OF_VGA3C0 + (0x0510 - 0x03C0))
107ab47cfaaSmrg
108ab47cfaaSmrg#define CRT_ADDRESS_REG         \
109ab47cfaaSmrg    (MMIO_BASE_OF_VGA3D0 + (0x03D4 - 0x03D0))
110ab47cfaaSmrg#define CRT_DATA_REG            \
111ab47cfaaSmrg    (MMIO_BASE_OF_VGA3D0 + (0x03D5 - 0x03D0))
112ab47cfaaSmrg#define SYSTEM_CONTROL_REG      \
113ab47cfaaSmrg    (MMIO_BASE_OF_VGA3D0 + (0x03DA - 0x03D0))
114ab47cfaaSmrg
115ab47cfaaSmrg/* GX-3 Configuration/Status Registers */
116ab47cfaaSmrg#define S3_SHADOW_STATUS              0x48C0C
117ab47cfaaSmrg#define S3_BUFFER_THRESHOLD           0x48C10
118ab47cfaaSmrg#define S3_OVERFLOW_BUFFER            0x48C14
119ab47cfaaSmrg#define S3_OVERFLOW_BUFFER_PTR        0x48C18
120ab47cfaaSmrg
121ab47cfaaSmrg#define ENABLE_BCI                        0x08   /* MM48C18_3 */
122ab47cfaaSmrg#define ENABLE_COMMAND_OVERFLOW_BUF       0x04   /* MM48C18_2 */
123ab47cfaaSmrg#define ENABLE_COMMAND_BUF_STATUS_UPDATE  0x02   /* MM48C18_1 */
124ab47cfaaSmrg#define ENABLE_SHADOW_STATUS_UPDATE       0x01   /* MM48C0C_0 */
125ab47cfaaSmrg
126ab47cfaaSmrg
127ab47cfaaSmrg#define MEMORY_CTRL0_REG            0xCA
128ab47cfaaSmrg#define MEMORY_CTRL1_REG            0xCB
129ab47cfaaSmrg#define MEMORY_CTRL2_REG            0xCC
130ab47cfaaSmrg
131ab47cfaaSmrg#define MEMORY_CONFIG_REG           0x31
132ab47cfaaSmrg
133ab47cfaaSmrg/* bitmap descriptor register */
134ab47cfaaSmrg#define S3_GLB_BD_LOW                      0X8168
135ab47cfaaSmrg#define S3_GLB_BD_HIGH                     0X816C
136ab47cfaaSmrg#define S3_PRI_BD_LOW                      0X8170
137ab47cfaaSmrg#define S3_PRI_BD_HIGH                     0X8174
138ab47cfaaSmrg#define S3_SEC_BD_LOW                      0X8178
139ab47cfaaSmrg#define S3_SEC_BD_HIGH                     0X817c
140ab47cfaaSmrg
141ab47cfaaSmrg/* duoview */
142ab47cfaaSmrg
143ab47cfaaSmrg#define SELECT_IGA1                 0x4026
144ab47cfaaSmrg#define SELECT_IGA2_READS_WRITES    0x4f26
145ab47cfaaSmrg
146ab47cfaaSmrg#define SelectIGA1()                 \
147ab47cfaaSmrgdo {                                    \
148ab47cfaaSmrg    OUTREG16(SEQ_ADDRESS_REG,SELECT_IGA1); \
149ab47cfaaSmrg} while (0)
150ab47cfaaSmrg
151ab47cfaaSmrg#define SelectIGA2()                 \
152ab47cfaaSmrgdo {                                    \
153ab47cfaaSmrg    OUTREG16(SEQ_ADDRESS_REG,SELECT_IGA2_READS_WRITES); \
154ab47cfaaSmrg} while (0)
155ab47cfaaSmrg
156ab47cfaaSmrg#define MEM_PS1                     0x10    /*CRCA_4 :Primary stream 1*/
157ab47cfaaSmrg#define MEM_PS2                     0x20    /*CRCA_5 :Primary stream 2*/
158ab47cfaaSmrg#define MEM_SS1                     0x40    /*CRCA_6 :Secondary stream 1*/
159ab47cfaaSmrg#define MEM_SS2                     0x80    /*CRCA_7 :Secondary stream 2*/
160ab47cfaaSmrg
161ab47cfaaSmrg#define SUBSYS_STAT_REG			0x8504
162ab47cfaaSmrg
163ab47cfaaSmrg#define SRC_BASE			0xa4d4
164ab47cfaaSmrg#define DEST_BASE			0xa4d8
165ab47cfaaSmrg#define CLIP_L_R			0xa4dc
166ab47cfaaSmrg#define CLIP_T_B			0xa4e0
167ab47cfaaSmrg#define DEST_SRC_STR			0xa4e4
168ab47cfaaSmrg#define MONO_PAT_0			0xa4e8
169ab47cfaaSmrg#define MONO_PAT_1			0xa4ec
170ab47cfaaSmrg
171ab47cfaaSmrg#define TILED_SURFACE_REGISTER_0        0x48c40
172ab47cfaaSmrg#define TILED_SURFACE_REGISTER_1        0x48c44
173ab47cfaaSmrg#define TILED_SURFACE_REGISTER_2        0x48c48
174ab47cfaaSmrg#define TILED_SURFACE_REGISTER_3        0x48c4c
175ab47cfaaSmrg#define TILED_SURFACE_REGISTER_4        0x48c50
176ab47cfaaSmrg
177ab47cfaaSmrg#define TILED_SURF_BPP4    0x00000000  /* bits 31-30=00 for  4 bits/pixel */
178ab47cfaaSmrg#define TILED_SURF_BPP8    0x40000000  /* bits 31-30=01 for  8 bits/pixel */
179ab47cfaaSmrg#define TILED_SURF_BPP16   0x80000000	/* bits 31-30=10 for 16 bits/pixel */
180ab47cfaaSmrg#define TILED_SURF_BPP32   0xC0000000  /* bits 31-30=11 for 32 bits/pixel */
181ab47cfaaSmrg
182ab47cfaaSmrg#define TILED_SURF_BPP16_2000   0x00000000   /* bit 31=0 for 16 bits/pixel */
183ab47cfaaSmrg#define TILED_SURF_BPP32_2000   0x80000000  /* bit 31=1 for 32 bits/pixel */
184ab47cfaaSmrg
185ab47cfaaSmrg/*
186ab47cfaaSmrg * CR88_4 =1 : disable block write
187ab47cfaaSmrg * the "2D" is partly to set this apart from "BLOCK_WRITE_DISABLE"
188ab47cfaaSmrg * constant used for bitmap  descriptor
189ab47cfaaSmrg */
190ab47cfaaSmrg#define DISABLE_BLOCK_WRITE_2D      0x10
191ab47cfaaSmrg#define BLOCK_WRITE_DISABLE         0x0
192ab47cfaaSmrg
193ab47cfaaSmrg/* CR31[0] set = Enable 8MB display memory through 64K window at A0000H. */
194ab47cfaaSmrg#define ENABLE_CPUA_BASE_A0000      0x01
195ab47cfaaSmrg
196ab47cfaaSmrg/* Constants for CR69. */
197ab47cfaaSmrg
198ab47cfaaSmrg#define CRT_ACTIVE	0x01
199ab47cfaaSmrg#define LCD_ACTIVE	0x02
200ab47cfaaSmrg#define TV_ACTIVE	0x04
201ab47cfaaSmrg#define CRT_ATTACHED	0x10
202ab47cfaaSmrg#define LCD_ATTACHED	0x20
203ab47cfaaSmrg#define TV_ATTACHED	0x40
204ab47cfaaSmrg
205ab47cfaaSmrg
206ab47cfaaSmrg/*
207ab47cfaaSmrg * reads from SUBSYS_STAT
208ab47cfaaSmrg */
209ab47cfaaSmrg#define STATUS_WORD0            (INREG(0x48C00))
210ab47cfaaSmrg#define ALT_STATUS_WORD0        (INREG(0x48C60))
211ab47cfaaSmrg#define MAXLOOP			0xffffff
212ab47cfaaSmrg#define IN_SUBSYS_STAT()	(INREG(SUBSYS_STAT_REG))
213ab47cfaaSmrg
214ab47cfaaSmrg#define MAXFIFO		0x7f00
215ab47cfaaSmrg
216ab47cfaaSmrg#define inStatus1() (VGAHWPTR(pScrn))->readST01( VGAHWPTR(pScrn) )
217ab47cfaaSmrg
218ab47cfaaSmrg
219ab47cfaaSmrg/*
220ab47cfaaSmrg * unprotect CRTC[0-7]
221ab47cfaaSmrg * CR11_7 = 0: Writing to all CRT Controller registers enabled
222ab47cfaaSmrg *        = 1: Writing to all bits of CR0~CR7 except CR7_4 disabled
223ab47cfaaSmrg */
224ab47cfaaSmrg#define UnProtectCRTC()                 \
225ab47cfaaSmrgdo {                                    \
226ab47cfaaSmrg    unsigned char byte;                 \
227ab47cfaaSmrg    OUTREG8(CRT_ADDRESS_REG,0x11);      \
228ab47cfaaSmrg    byte = INREG8(CRT_DATA_REG) & 0X7F; \
229ab47cfaaSmrg    OUTREG16(CRT_ADDRESS_REG,byte << 8 | 0x11); \
230ab47cfaaSmrg} while (0)
231ab47cfaaSmrg
232ab47cfaaSmrg/*
233ab47cfaaSmrg * unlock extended regs
234ab47cfaaSmrg * CR38:unlock CR20~CR3F
235ab47cfaaSmrg * CR39:unlock CR40~CRFF
236ab47cfaaSmrg * SR08:unlock SR09~SRFF
237ab47cfaaSmrg */
238ab47cfaaSmrg#define UnLockExtRegs()                 \
239ab47cfaaSmrgdo {                                    \
240ab47cfaaSmrg    OUTREG16(CRT_ADDRESS_REG,0X4838);   \
241ab47cfaaSmrg    OUTREG16(CRT_ADDRESS_REG,0XA039);   \
242ab47cfaaSmrg    OUTREG16(SEQ_ADDRESS_REG,0X0608);   \
243ab47cfaaSmrg} while (0)
244ab47cfaaSmrg
245ab47cfaaSmrg#define VerticalRetraceWait()           \
246ab47cfaaSmrgdo {                                    \
247ab47cfaaSmrg	INREG8(CRT_ADDRESS_REG);            \
248ab47cfaaSmrg	OUTREG8(CRT_ADDRESS_REG, 0x17);     \
249ab47cfaaSmrg	if (INREG8(CRT_DATA_REG) & 0x80) {  \
250ab47cfaaSmrg		int i = 0x10000;                \
251ab47cfaaSmrg		while ((INREG8(SYSTEM_CONTROL_REG) & 0x08) == 0x08 && i--) ; \
252ab47cfaaSmrg		i = 0x10000;                                                  \
253ab47cfaaSmrg		while ((INREG8(SYSTEM_CONTROL_REG) & 0x08) == 0x00 && i--) ; \
254ab47cfaaSmrg	} \
255ab47cfaaSmrg} while (0)
256ab47cfaaSmrg
257ab47cfaaSmrg/*
258ab47cfaaSmrg * Jiayo Hsu, Mar 21, 2002
259ab47cfaaSmrg * modify this to scalable schema,because different chips have differnt regs,
260ab47cfaaSmrg * besides add in patch code for  Paramount(SuperSavage) from 2K
261ab47cfaaSmrg */
262ab47cfaaSmrg#define InI2CREG(a,reg)                                 \
263ab47cfaaSmrgdo {                                                    \
264ab47cfaaSmrg	OUTREG8(CRT_ADDRESS_REG, reg);                      \
265ab47cfaaSmrg	if (psav->Chipset == S3_SUPERSAVAGE)                \
266ab47cfaaSmrg	   OUTREG8(CRT_DATA_REG, INREG8(CRT_DATA_REG)); 	\
267ab47cfaaSmrg	a = INREG8(CRT_DATA_REG);                           \
268ab47cfaaSmrg} while (0)
269ab47cfaaSmrg
270ab47cfaaSmrg#define OutI2CREG(a,reg)                        \
271ab47cfaaSmrgdo {                                            \
272ab47cfaaSmrg	OUTREG8(CRT_ADDRESS_REG, reg);				\
273ab47cfaaSmrg	if (psav->Chipset == S3_SUPERSAVAGE)		\
274ab47cfaaSmrg	   OUTREG8(CRT_DATA_REG, a); 				\
275ab47cfaaSmrg	OUTREG8(CRT_DATA_REG, a);                   \
276ab47cfaaSmrg} while (0)
277ab47cfaaSmrg
278ab47cfaaSmrg#define HZEXP_COMP_1		0x54
279ab47cfaaSmrg#define HZEXP_BORDER		0x58
280ab47cfaaSmrg#define HZEXP_FACTOR_IGA1	0x59
281ab47cfaaSmrg
282ab47cfaaSmrg#define VTEXP_COMP_1		0x56
283ab47cfaaSmrg#define VTEXP_BORDER		0x5a
284ab47cfaaSmrg#define VTEXP_FACTOR_IGA1	0x5b
285ab47cfaaSmrg
286ab47cfaaSmrg#define EC1_CENTER_ON	0x10
287ab47cfaaSmrg#define EC1_EXPAND_ON	0x0c
288ab47cfaaSmrg
289ab47cfaaSmrg#endif /* _SAVAGE_REGS_H */
290