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