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