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
450