SDL-1.2.14
[sdl_omap.git] / src / video / fbcon / riva_mmio.h
CommitLineData
e14743d1 1/***************************************************************************\
2|* *|
3|* Copyright 1993-1999 NVIDIA, Corporation. All rights reserved. *|
4|* *|
5|* NOTICE TO USER: The source code is copyrighted under U.S. and *|
6|* international laws. Users and possessors of this source code are *|
7|* hereby granted a nonexclusive, royalty-free copyright license to *|
8|* use this code in individual and commercial software. *|
9|* *|
10|* Any use of this source code must include, in the user documenta- *|
11|* tion and internal comments to the code, notices to the end user *|
12|* as follows: *|
13|* *|
14|* Copyright 1993-1999 NVIDIA, Corporation. All rights reserved. *|
15|* *|
16|* NVIDIA, CORPORATION MAKES NO REPRESENTATION ABOUT THE SUITABILITY *|
17|* OF THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" *|
18|* WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. NVIDIA, CORPOR- *|
19|* ATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOURCE CODE, *|
20|* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGE- *|
21|* MENT, AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL *|
22|* NVIDIA, CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT, INCI- *|
23|* DENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RE- *|
24|* SULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION *|
25|* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *|
26|* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. *|
27|* *|
28|* U.S. Government End Users. This source code is a "commercial *|
29|* item," as that term is defined at 48 C.F.R. 2.101 (OCT 1995), *|
30|* consisting of "commercial computer software" and "commercial *|
31|* computer software documentation," as such terms are used in *|
32|* 48 C.F.R. 12.212 (SEPT 1995) and is provided to the U.S. Govern- *|
33|* ment only as a commercial end item. Consistent with 48 C.F.R. *|
34|* 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (JUNE 1995), *|
35|* all U.S. Government End Users acquire the source code with only *|
36|* those rights set forth herein. *|
37|* *|
38\***************************************************************************/
39
40#ifndef __RIVA_HW_H__
41#define __RIVA_HW_H__
42#define RIVA_SW_VERSION 0x00010003
43
44/*
45 * Typedefs to force certain sized values.
46 */
47typedef Uint8 U008;
48typedef Uint16 U016;
49typedef Uint32 U032;
50
51/*
52 * HW access macros.
53 */
54#define NV_WR08(p,i,d) (((U008 *)(p))[i]=(d))
55#define NV_RD08(p,i) (((U008 *)(p))[i])
56#define NV_WR16(p,i,d) (((U016 *)(p))[(i)/2]=(d))
57#define NV_RD16(p,i) (((U016 *)(p))[(i)/2])
58#define NV_WR32(p,i,d) (((U032 *)(p))[(i)/4]=(d))
59#define NV_RD32(p,i) (((U032 *)(p))[(i)/4])
60#define VGA_WR08(p,i,d) NV_WR08(p,i,d)
61#define VGA_RD08(p,i) NV_RD08(p,i)
62
63/*
64 * Define supported architectures.
65 */
66#define NV_ARCH_03 0x03
67#define NV_ARCH_04 0x04
68#define NV_ARCH_10 0x10
69/***************************************************************************\
70* *
71* FIFO registers. *
72* *
73\***************************************************************************/
74
75/*
76 * Raster OPeration. Windows style ROP3.
77 */
78typedef volatile struct
79{
80 U032 reserved00[4];
81 U016 FifoFree;
82 U016 Nop;
83 U032 reserved01[0x0BB];
84 U032 Rop3;
85} RivaRop;
86/*
87 * 8X8 Monochrome pattern.
88 */
89typedef volatile struct
90{
91 U032 reserved00[4];
92 U016 FifoFree;
93 U016 Nop;
94 U032 reserved01[0x0BD];
95 U032 Shape;
96 U032 reserved03[0x001];
97 U032 Color0;
98 U032 Color1;
99 U032 Monochrome[2];
100} RivaPattern;
101/*
102 * Scissor clip rectangle.
103 */
104typedef volatile struct
105{
106 U032 reserved00[4];
107 U016 FifoFree;
108 U016 Nop;
109 U032 reserved01[0x0BB];
110 U032 TopLeft;
111 U032 WidthHeight;
112} RivaClip;
113/*
114 * 2D filled rectangle.
115 */
116typedef volatile struct
117{
118 U032 reserved00[4];
119 U016 FifoFree;
120 U016 Nop[1];
121 U032 reserved01[0x0BC];
122 U032 Color;
123 U032 reserved03[0x03E];
124 U032 TopLeft;
125 U032 WidthHeight;
126} RivaRectangle;
127/*
128 * 2D screen-screen BLT.
129 */
130typedef volatile struct
131{
132 U032 reserved00[4];
133 U016 FifoFree;
134 U016 Nop;
135 U032 reserved01[0x0BB];
136 U032 TopLeftSrc;
137 U032 TopLeftDst;
138 U032 WidthHeight;
139} RivaScreenBlt;
140/*
141 * 2D pixel BLT.
142 */
143typedef volatile struct
144{
145 U032 reserved00[4];
146 U016 FifoFree;
147 U016 Nop[1];
148 U032 reserved01[0x0BC];
149 U032 TopLeft;
150 U032 WidthHeight;
151 U032 WidthHeightIn;
152 U032 reserved02[0x03C];
153 U032 Pixels;
154} RivaPixmap;
155/*
156 * Filled rectangle combined with monochrome expand. Useful for glyphs.
157 */
158typedef volatile struct
159{
160 U032 reserved00[4];
161 U016 FifoFree;
162 U016 Nop;
163 U032 reserved01[0x0BB];
164 U032 reserved03[(0x040)-1];
165 U032 Color1A;
166 struct
167 {
168 U032 TopLeft;
169 U032 WidthHeight;
170 } UnclippedRectangle[64];
171 U032 reserved04[(0x080)-3];
172 struct
173 {
174 U032 TopLeft;
175 U032 BottomRight;
176 } ClipB;
177 U032 Color1B;
178 struct
179 {
180 U032 TopLeft;
181 U032 BottomRight;
182 } ClippedRectangle[64];
183 U032 reserved05[(0x080)-5];
184 struct
185 {
186 U032 TopLeft;
187 U032 BottomRight;
188 } ClipC;
189 U032 Color1C;
190 U032 WidthHeightC;
191 U032 PointC;
192 U032 MonochromeData1C;
193 U032 reserved06[(0x080)+121];
194 struct
195 {
196 U032 TopLeft;
197 U032 BottomRight;
198 } ClipD;
199 U032 Color1D;
200 U032 WidthHeightInD;
201 U032 WidthHeightOutD;
202 U032 PointD;
203 U032 MonochromeData1D;
204 U032 reserved07[(0x080)+120];
205 struct
206 {
207 U032 TopLeft;
208 U032 BottomRight;
209 } ClipE;
210 U032 Color0E;
211 U032 Color1E;
212 U032 WidthHeightInE;
213 U032 WidthHeightOutE;
214 U032 PointE;
215 U032 MonochromeData01E;
216} RivaBitmap;
217/*
218 * 3D textured, Z buffered triangle.
219 */
220typedef volatile struct
221{
222 U032 reserved00[4];
223 U016 FifoFree;
224 U016 Nop;
225 U032 reserved01[0x0BC];
226 U032 TextureOffset;
227 U032 TextureFormat;
228 U032 TextureFilter;
229 U032 FogColor;
230/* This is a problem on LynxOS */
231#ifdef Control
232#undef Control
233#endif
234 U032 Control;
235 U032 AlphaTest;
236 U032 reserved02[0x339];
237 U032 FogAndIndex;
238 U032 Color;
239 float ScreenX;
240 float ScreenY;
241 float ScreenZ;
242 float EyeM;
243 float TextureS;
244 float TextureT;
245} RivaTexturedTriangle03;
246typedef volatile struct
247{
248 U032 reserved00[4];
249 U016 FifoFree;
250 U016 Nop;
251 U032 reserved01[0x0BB];
252 U032 ColorKey;
253 U032 TextureOffset;
254 U032 TextureFormat;
255 U032 TextureFilter;
256 U032 Blend;
257/* This is a problem on LynxOS */
258#ifdef Control
259#undef Control
260#endif
261 U032 Control;
262 U032 FogColor;
263 U032 reserved02[0x39];
264 struct
265 {
266 float ScreenX;
267 float ScreenY;
268 float ScreenZ;
269 float EyeM;
270 U032 Color;
271 U032 Specular;
272 float TextureS;
273 float TextureT;
274 } Vertex[16];
275 U032 DrawTriangle3D;
276} RivaTexturedTriangle05;
277/*
278 * 2D line.
279 */
280typedef volatile struct
281{
282 U032 reserved00[4];
283 U016 FifoFree;
284 U016 Nop[1];
285 U032 reserved01[0x0BC];
286 U032 Color; /* source color 0304-0307*/
287 U032 Reserved02[0x03e];
288 struct { /* start aliased methods in array 0400- */
289 U032 point0; /* y_x S16_S16 in pixels 0- 3*/
290 U032 point1; /* y_x S16_S16 in pixels 4- 7*/
291 } Lin[16]; /* end of aliased methods in array -047f*/
292 struct { /* start aliased methods in array 0480- */
293 U032 point0X; /* in pixels, 0 at left 0- 3*/
294 U032 point0Y; /* in pixels, 0 at top 4- 7*/
295 U032 point1X; /* in pixels, 0 at left 8- b*/
296 U032 point1Y; /* in pixels, 0 at top c- f*/
297 } Lin32[8]; /* end of aliased methods in array -04ff*/
298 U032 PolyLin[32]; /* y_x S16_S16 in pixels 0500-057f*/
299 struct { /* start aliased methods in array 0580- */
300 U032 x; /* in pixels, 0 at left 0- 3*/
301 U032 y; /* in pixels, 0 at top 4- 7*/
302 } PolyLin32[16]; /* end of aliased methods in array -05ff*/
303 struct { /* start aliased methods in array 0600- */
304 U032 color; /* source color 0- 3*/
305 U032 point; /* y_x S16_S16 in pixels 4- 7*/
306 } ColorPolyLin[16]; /* end of aliased methods in array -067f*/
307} RivaLine;
308/*
309 * 2D/3D surfaces
310 */
311typedef volatile struct
312{
313 U032 reserved00[4];
314 U016 FifoFree;
315 U016 Nop;
316 U032 reserved01[0x0BE];
317 U032 Offset;
318} RivaSurface;
319typedef volatile struct
320{
321 U032 reserved00[4];
322 U016 FifoFree;
323 U016 Nop;
324 U032 reserved01[0x0BD];
325 U032 Pitch;
326 U032 RenderBufferOffset;
327 U032 ZBufferOffset;
328} RivaSurface3D;
329
330/***************************************************************************\
331* *
332* Virtualized RIVA H/W interface. *
333* *
334\***************************************************************************/
335
336struct _riva_hw_inst;
337struct _riva_hw_state;
338/*
339 * Virtialized chip interface. Makes RIVA 128 and TNT look alike.
340 */
341typedef struct _riva_hw_inst
342{
343 /*
344 * Chip specific settings.
345 */
346 U032 Architecture;
347 U032 Version;
348 U032 CrystalFreqKHz;
349 U032 RamAmountKBytes;
350 U032 MaxVClockFreqKHz;
351 U032 RamBandwidthKBytesPerSec;
352 U032 EnableIRQ;
353 U032 IO;
354 U032 VBlankBit;
355 U032 FifoFreeCount;
356 U032 FifoEmptyCount;
357 /*
358 * Non-FIFO registers.
359 */
360 volatile U032 *PCRTC;
361 volatile U032 *PRAMDAC;
362 volatile U032 *PFB;
363 volatile U032 *PFIFO;
364 volatile U032 *PGRAPH;
365 volatile U032 *PEXTDEV;
366 volatile U032 *PTIMER;
367 volatile U032 *PMC;
368 volatile U032 *PRAMIN;
369 volatile U032 *FIFO;
370 volatile U032 *CURSOR;
371 volatile U032 *CURSORPOS;
372 volatile U032 *VBLANKENABLE;
373 volatile U032 *VBLANK;
374 volatile U008 *PCIO;
375 volatile U008 *PVIO;
376 volatile U008 *PDIO;
377 /*
378 * Common chip functions.
379 */
380 int (*Busy)(struct _riva_hw_inst *);
381 void (*CalcStateExt)(struct _riva_hw_inst *,struct _riva_hw_state *,int,int,int,int,int,int,int,int,int,int,int,int,int);
382 void (*LoadStateExt)(struct _riva_hw_inst *,struct _riva_hw_state *);
383 void (*UnloadStateExt)(struct _riva_hw_inst *,struct _riva_hw_state *);
384 void (*SetStartAddress)(struct _riva_hw_inst *,U032);
385 void (*SetSurfaces2D)(struct _riva_hw_inst *,U032,U032);
386 void (*SetSurfaces3D)(struct _riva_hw_inst *,U032,U032);
387 int (*ShowHideCursor)(struct _riva_hw_inst *,int);
388 void (*LockUnlock)(struct _riva_hw_inst *, int);
389 /*
390 * Current extended mode settings.
391 */
392 struct _riva_hw_state *CurrentState;
393 /*
394 * FIFO registers.
395 */
396 RivaRop *Rop;
397 RivaPattern *Patt;
398 RivaClip *Clip;
399 RivaPixmap *Pixmap;
400 RivaScreenBlt *Blt;
401 RivaBitmap *Bitmap;
402 RivaLine *Line;
403 RivaTexturedTriangle03 *Tri03;
404 RivaTexturedTriangle05 *Tri05;
405} RIVA_HW_INST;
406/*
407 * Extended mode state information.
408 */
409typedef struct _riva_hw_state
410{
411 U032 bpp;
412 U032 width;
413 U032 height;
414 U032 repaint0;
415 U032 repaint1;
416 U032 screen;
417 U032 pixel;
418 U032 horiz;
419 U032 arbitration0;
420 U032 arbitration1;
421 U032 vpll;
422 U032 pllsel;
423 U032 general;
424 U032 config;
425 U032 cursor0;
426 U032 cursor1;
427 U032 cursor2;
428 U032 offset0;
429 U032 offset1;
430 U032 offset2;
431 U032 offset3;
432 U032 pitch0;
433 U032 pitch1;
434 U032 pitch2;
435 U032 pitch3;
436} RIVA_HW_STATE;
437
438/*
439 * FIFO Free Count. Should attempt to yield processor if RIVA is busy.
440 */
441
442#define RIVA_FIFO_FREE(hwptr,cnt) \
443{ \
444 while (FifoFreeCount < (cnt)) \
445 FifoFreeCount = hwptr->FifoFree >> 2; \
446 FifoFreeCount -= (cnt); \
447}
448#endif /* __RIVA_HW_H__ */
449