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
308
309
|
/*
Copyright (C) 1994-1999 The XFree86 Project, Inc. All Rights Reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Except as contained in this notice, the name of the XFree86 Project shall not
be used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from the XFree86 Project.
*/
/*
* regs3v.h
*
* Port to 4.0 design level
*
* S3 ViRGE driver
*
* Portions based on code containing the following notices:
**********************************************************
*
* Written by Jake Richter Copyright (c) 1989, 1990 Panacea Inc., Londonderry,
* NH - All Rights Reserved
*
* This code may be freely incorporated in any program without royalty, as long
* as the copyright notice stays intact.
*
* Additions by Kevin E. Martin (martin@cs.unc.edu)
*
* KEVIN E. MARTIN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL KEVIN E. MARTIN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
*/
/* Taken from accel/s3_virge code */
/* 23/03/97 S. Marineau: fixed bug with first Doubleword Offset macros
* and added macro CommandWaitIdle to wait for the command FIFO to empty
*/
#ifndef _REGS3V_H
#define _REGS3V_H
#define S3_ViRGE_SERIES(chip) ((chip&0xfff0)==0x31e0)
#define S3_ViRGE_GX2_SERIES(chip) (chip == S3_ViRGE_GX2 || chip == S3_TRIO_3D_2X)
#define S3_ViRGE_MX_SERIES(chip) (chip == S3_ViRGE_MX || chip == S3_ViRGE_MXP)
#define S3_ViRGE_MXP_SERIES(chip) (chip == S3_ViRGE_MXP)
#define S3_ViRGE_VX_SERIES(chip) ((chip&0xfff0)==0x3de0)
#define S3_TRIO_3D_SERIES(chip) (chip == S3_TRIO_3D)
#define S3_TRIO_3D_2X_SERIES(chip) (chip == S3_TRIO_3D_2X)
/* Chip tags */
#define PCI_S3_VENDOR_ID PCI_VENDOR_S3
#define S3_UNKNOWN 0
#define S3_ViRGE PCI_CHIP_VIRGE
#define S3_ViRGE_VX PCI_CHIP_VIRGE_VX
#define S3_ViRGE_DXGX PCI_CHIP_VIRGE_DXGX
#define S3_ViRGE_GX2 PCI_CHIP_VIRGE_GX2
#define S3_ViRGE_MX PCI_CHIP_VIRGE_MX
#define S3_ViRGE_MXP PCI_CHIP_VIRGE_MXP
#define S3_TRIO_3D PCI_CHIP_Trio3D
#define S3_TRIO_3D_2X PCI_CHIP_Trio3D_2X
/* Subsystem Control Register */
#define GPCTRL_NC 0x0000
#define GPCTRL_ENAB 0x4000
#define GPCTRL_RESET 0x8000
/* Command Register */
#define CMD_OP_MSK (0xf << 27)
#define CMD_BITBLT (0x0 << 27)
#define CMD_RECT ((0x2 << 27) | 0x0100)
#define CMD_LINE (0x3 << 27)
#define CMD_POLYFILL (0x5 << 27)
#define CMD_NOP (0xf << 27)
#define BYTSEQ 0
#define _16BIT 0
#define PCDATA 0x80
#define INC_Y CMD_YP
#define YMAJAXIS 0
#define INC_X CMD_XP
#define DRAW 0x0020
#define LINETYPE 0x0008
#define LASTPIX 0
#define PLANAR 0 /* MIX_MONO_SRC */
#define WRTDATA 0
/*
* Short Stroke Vector Transfer Register (The angular Defs also apply to the
* Command Register
*/
#define VECDIR_000 0x0000
#define VECDIR_045 0x0020
#define VECDIR_090 0x0040
#define VECDIR_135 0x0060
#define VECDIR_180 0x0080
#define VECDIR_225 0x00a0
#define VECDIR_270 0x00c0
#define VECDIR_315 0x00e0
#define SSVDRAW 0x0010
/* Command AutoExecute */
#define CMD_AUTOEXEC 0x01
/* Command Hardware Clipping Enable */
#define CMD_HWCLIP 0x02
/* Destination Color Format */
#define DST_8BPP 0x00
#define DST_16BPP 0x04
#define DST_24BPP 0x08
/* BLT Mix modes */
#define MIX_BITBLT 0x0000
#define MIX_MONO_SRC 0x0040
#define MIX_CPUDATA 0x0080
#define MIX_MONO_PATT 0x0100
#define MIX_COLOR_PATT 0x0000
#define MIX_MONO_TRANSP 0x0200
/* Image Transfer Alignments */
#define CMD_ITA_BYTE 0x0000
#define CMD_ITA_WORD 0x0400
#define CMD_ITA_DWORD 0x0800
/* First Doubleword Offset (Image Transfer) */
#define CMD_FDO_BYTE0 0x00000
#define CMD_FDO_BYTE1 0x01000
#define CMD_FDO_BYTE2 0x02000
#define CMD_FDO_BYTE3 0x03000
/* X Positive, Y Positive (Bit BLT) */
#define CMD_XP 0x2000000
#define CMD_YP 0x4000000
/* 2D or 3D Select */
#define CMD_2D 0x00000000
#define CMD_3D 0x80000000
/* The Mix ROPs (selected ones, not all 256) */
#if 0
#define ROP_0 (0x00<<17)
#define ROP_DSon (0x11<<17)
#define ROP_DSna (0x22<<17)
#define ROP_Sn (0x33<<17)
#define ROP_SDna (0x44<<17)
#define ROP_Dn (0x55<<17)
#define ROP_DSx (0x66<<17)
#define ROP_DSan (0x77<<17)
#define ROP_DSa (0x88<<17)
#define ROP_DSxn (0x99<<17)
#define ROP_D (0xaa<<17)
#define ROP_DSno (0xbb<<17)
#define ROP_S (0xcc<<17)
#define ROP_SDno (0xdd<<17)
#define ROP_DSo (0xee<<17)
#define ROP_1 (0xff<<17)
/* ROP -> (ROP & P) | (D & ~P) */
#define ROP_0_PaDPnao /* DPna */ (0x0a<<17)
#define ROP_DSon_PaDPnao /* PDSPaox */ (0x1a<<17)
#define ROP_DSna_PaDPnao /* DPSana */ (0x2a<<17)
#define ROP_Sn_PaDPnao /* SPDSxox */ (0x3a<<17)
#define ROP_SDna_PaDPnao /* DPSDoax */ (0x4a<<17)
#define ROP_Dn_PaDPnao /* DPx */ (0x5a<<17)
#define ROP_DSx_PaDPnao /* DPSax */ (0x6a<<17)
#define ROP_DSan_PaDPnao /* DPSDnoax */ (0x7a<<17)
#define ROP_DSa_PaDPnao /* DSPnoa */ (0x8a<<17)
#define ROP_DSxn_PaDPnao /* DPSnax */ (0x9a<<17)
#define ROP_D_PaDPnao /* D */ (0xaa<<17)
#define ROP_DSno_PaDPnao /* DPSnao */ (0xba<<17)
#define ROP_S_PaDPnao /* DPSDxax */ (0xca<<17)
#define ROP_SDno_PaDPnao /* DPSDanax */ (0xda<<17)
#define ROP_DSo_PaDPnao /* DPSao */ (0xea<<17)
#define ROP_1_PaDPnao /* DPo */ (0xfa<<17)
/* S -> P */
#define ROP_DPon (0x05<<17)
#define ROP_DPna (0x0a<<17)
#define ROP_Pn (0x0f<<17)
#define ROP_PDna (0x50<<17)
#define ROP_DPx (0x5a<<17)
#define ROP_DPan (0x5f<<17)
#define ROP_DPa (0xa0<<17)
#define ROP_DPxn (0xa5<<17)
#define ROP_DPno (0xaf<<17)
#define ROP_P (0xf0<<17)
#define ROP_PDno (0xf5<<17)
#define ROP_DPo (0xfa<<17)
/* ROP -> (ROP & S) | (~ROP & D) */
#define ROP_DPSDxax (0xca<<17)
#define ROP_DSPnoa (0x8a<<17)
#define ROP_DPSao (0xea<<17)
#define ROP_DPSoa (0xa8<<17)
#define ROP_DSa (0x88<<17)
#define ROP_SSPxDSxax (0xe8<<17)
#define ROP_SDPoa (0xc8<<17)
#define ROP_DSPnao (0xae<<17)
#define ROP_SSDxPDxax (0x8e<<17)
#define ROP_DSo (0xee<<17)
#define ROP_SDPnao (0xce<<17)
#define ROP_SPDSxax (0xac<<17)
#define ROP_SDPnoa (0x8c<<17)
#define ROP_SDPao (0xec<<17)
/* ROP_sp -> (ROP_sp & S) | (D & ~S) */
#define ROP_0_SaDSnao /* DSna */ (0x22<<17)
#define ROP_DPa_SaDSnao /* DPSnoa */ (0xa2<<17)
#define ROP_PDna_SaDSnao /* DSPDoax */ (0x62<<17)
#define ROP_P_SaDSnao /* DSPDxax */ (0xe2<<17)
#define ROP_DPna_SaDSnao /* DPSana */ (0x2a<<17)
#define ROP_D_SaDSnao /* D */ (0xaa<<17)
#define ROP_DPx_SaDSnao /* DPSax */ (0x6a<<17)
#define ROP_DPo_SaDSnao /* DPSao */ (0xea<<17)
#define ROP_DPon_SaDSnao /* SDPSaox */ (0x26<<17)
#define ROP_DPxn_SaDSnao /* DSPnax */ (0xa6<<17)
#define ROP_Dn_SaDSnao /* DSx */ (0x66<<17)
#define ROP_PDno_SaDSnao /* SDPSanax */ (0xe6<<17)
#define ROP_Pn_SaDSnao /* PSDPxox */ (0x2e<<17)
#define ROP_DPno_SaDSnao /* DSPnao */ (0xae<<17)
#define ROP_DPan_SaDSnao /* SDPSnoax */ (0x6e<<17)
#define ROP_1_SaDSnao /* DSo */ (0xee<<17)
#endif
#define MAXLOOP 0x0fffff /* timeout value for engine waits, 0.5 secs */
/* Wait until "v" queue entries are free */
#define WaitQueue(v) \
if (ps3v->NoPCIRetry) { \
do { int loop=0; mem_barrier(); \
while ((((IN_SUBSYS_STAT()) & 0x1f00) < (((v)+2) << 8)) && (loop++<MAXLOOP)); \
if (loop >= MAXLOOP) S3VGEReset(pScrn,1,__LINE__,__FILE__); \
} while (0); }
/* Wait until GP is idle and queue is empty */
#define WaitIdleEmpty() \
do { int loop=0; mem_barrier(); \
if(S3_TRIO_3D_SERIES(ps3v->Chipset)) \
while (((IN_SUBSYS_STAT() & 0x3f802000 & 0x20002000) != 0x20002000) && \
(loop++<MAXLOOP)); \
else \
while (((IN_SUBSYS_STAT() & 0x3f00) != 0x3000) && (loop++<MAXLOOP)); \
if (loop >= MAXLOOP) S3VGEReset(pScrn,1,__LINE__,__FILE__); \
} while (0)
/* Wait until GP is idle */
#define WaitIdle() \
do { int loop=0; mem_barrier(); \
while ((!(IN_SUBSYS_STAT() & 0x2000)) && (loop++<MAXLOOP)); \
if (loop >= MAXLOOP) S3VGEReset(pScrn,1,__LINE__,__FILE__); \
} while (0)
/* Wait until Command FIFO is empty */
#define WaitCommandEmpty() do { int loop=0; mem_barrier(); \
if (S3_ViRGE_GX2_SERIES(S3_ViRGE_GX2) || S3_ViRGE_MX_SERIES(ps3v->Chipset)) \
while ((!(((((mmtr)s3vMmioMem)->subsys_regs.regs.adv_func_cntl)) & 0x400)) && (loop++<MAXLOOP)); \
else if (S3_TRIO_3D_SERIES(ps3v->Chipset)) \
while (((IN_SUBSYS_STAT() & 0x5f00) != 0x5f00) && (loop++<MAXLOOP)); \
else \
while ((!(((((mmtr)s3vMmioMem)->subsys_regs.regs.adv_func_cntl)) & 0x200)) && (loop++<MAXLOOP)); \
if (loop >= MAXLOOP) S3VGEReset(pScrn,1,__LINE__,__FILE__); \
} while (0)
/* Wait until a DMA transfer is done */
#define WaitDMAEmpty() \
do { int loop=0; mem_barrier(); \
while (((((mmtr)s3vMmioMem)->dma_regs.regs.cmd.write_pointer) != (((mmtr)s3vMmioMem)->dma_regs.regs.cmd.read_pointer)) && (loop++<MAXLOOP)); \
if (loop >= MAXLOOP) S3VGEReset(pScrn,1,__LINE__,__FILE__); \
} while(0)
#define RGB8_PSEUDO (-1)
#define RGB16_565 0
#define RGB16_555 1
#define RGB32_888 2
#endif /* _REGS3V_H */
|