xref: /openbmc/linux/drivers/video/fbdev/riva/riva_hw.h (revision 552c69b36ebd966186573b9c7a286b390935cce1)
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  /*
41   * GPL licensing note -- nVidia is allowing a liberal interpretation of
42   * the documentation restriction above, to merely say that this nVidia's
43   * copyright and disclaimer should be included with all code derived
44   * from this source.  -- Jeff Garzik <jgarzik@pobox.com>, 01/Nov/99
45   */
46  
47  /* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nv/riva_hw.h,v 1.21 2002/10/14 18:22:46 mvojkovi Exp $ */
48  #ifndef __RIVA_HW_H__
49  #define __RIVA_HW_H__
50  #define RIVA_SW_VERSION 0x00010003
51  
52  #ifndef Bool
53  typedef int Bool;
54  #endif
55  
56  #ifndef TRUE
57  #define TRUE 1
58  #endif
59  #ifndef FALSE
60  #define FALSE 0
61  #endif
62  #ifndef NULL
63  #define NULL 0
64  #endif
65  
66  /*
67   * Typedefs to force certain sized values.
68   */
69  typedef unsigned char  U008;
70  typedef unsigned short U016;
71  typedef unsigned int   U032;
72  
73  /*
74   * HW access macros.
75   */
76  #include <asm/io.h>
77  
78  #define NV_WR08(p,i,d)  (__raw_writeb((d), (void __iomem *)(p) + (i)))
79  #define NV_RD08(p,i)    (__raw_readb((void __iomem *)(p) + (i)))
80  #define NV_WR16(p,i,d)  (__raw_writew((d), (void __iomem *)(p) + (i)))
81  #define NV_RD16(p,i)    (__raw_readw((void __iomem *)(p) + (i)))
82  #define NV_WR32(p,i,d)  (__raw_writel((d), (void __iomem *)(p) + (i)))
83  #define NV_RD32(p,i)    (__raw_readl((void __iomem *)(p) + (i)))
84  
85  #define VGA_WR08(p,i,d) (writeb((d), (void __iomem *)(p) + (i)))
86  #define VGA_RD08(p,i)   (readb((void __iomem *)(p) + (i)))
87  
88  /*
89   * Define different architectures.
90   */
91  #define NV_ARCH_03  0x03
92  #define NV_ARCH_04  0x04
93  #define NV_ARCH_10  0x10
94  #define NV_ARCH_20  0x20
95  #define NV_ARCH_30  0x30
96  #define NV_ARCH_40  0x40
97  
98  /***************************************************************************\
99  *                                                                           *
100  *                             FIFO registers.                               *
101  *                                                                           *
102  \***************************************************************************/
103  
104  /*
105   * Raster OPeration. Windows style ROP3.
106   */
107  typedef volatile struct
108  {
109      U032 reserved00[4];
110  #ifdef __BIG_ENDIAN
111      U032 FifoFree;
112  #else
113      U016 FifoFree;
114      U016 Nop;
115  #endif
116      U032 reserved01[0x0BB];
117      U032 Rop3;
118  } RivaRop;
119  /*
120   * 8X8 Monochrome pattern.
121   */
122  typedef volatile struct
123  {
124      U032 reserved00[4];
125  #ifdef __BIG_ENDIAN
126      U032 FifoFree;
127  #else
128      U016 FifoFree;
129      U016 Nop;
130  #endif
131      U032 reserved01[0x0BD];
132      U032 Shape;
133      U032 reserved03[0x001];
134      U032 Color0;
135      U032 Color1;
136      U032 Monochrome[2];
137  } RivaPattern;
138  /*
139   * Scissor clip rectangle.
140   */
141  typedef volatile struct
142  {
143      U032 reserved00[4];
144  #ifdef __BIG_ENDIAN
145      U032 FifoFree;
146  #else
147      U016 FifoFree;
148      U016 Nop;
149  #endif
150      U032 reserved01[0x0BB];
151      U032 TopLeft;
152      U032 WidthHeight;
153  } RivaClip;
154  /*
155   * 2D filled rectangle.
156   */
157  typedef volatile struct
158  {
159      U032 reserved00[4];
160  #ifdef __BIG_ENDIAN
161      U032 FifoFree;
162  #else
163      U016 FifoFree;
164      U016 Nop[1];
165  #endif
166      U032 reserved01[0x0BC];
167      U032 Color;
168      U032 reserved03[0x03E];
169      U032 TopLeft;
170      U032 WidthHeight;
171  } RivaRectangle;
172  /*
173   * 2D screen-screen BLT.
174   */
175  typedef volatile struct
176  {
177      U032 reserved00[4];
178  #ifdef __BIG_ENDIAN
179      U032 FifoFree;
180  #else
181      U016 FifoFree;
182      U016 Nop;
183  #endif
184      U032 reserved01[0x0BB];
185      U032 TopLeftSrc;
186      U032 TopLeftDst;
187      U032 WidthHeight;
188  } RivaScreenBlt;
189  /*
190   * 2D pixel BLT.
191   */
192  typedef volatile struct
193  {
194      U032 reserved00[4];
195  #ifdef __BIG_ENDIAN
196      U032 FifoFree;
197  #else
198      U016 FifoFree;
199      U016 Nop[1];
200  #endif
201      U032 reserved01[0x0BC];
202      U032 TopLeft;
203      U032 WidthHeight;
204      U032 WidthHeightIn;
205      U032 reserved02[0x03C];
206      U032 Pixels;
207  } RivaPixmap;
208  /*
209   * Filled rectangle combined with monochrome expand.  Useful for glyphs.
210   */
211  typedef volatile struct
212  {
213      U032 reserved00[4];
214  #ifdef __BIG_ENDIAN
215      U032 FifoFree;
216  #else
217      U016 FifoFree;
218      U016 Nop;
219  #endif
220      U032 reserved01[0x0BB];
221      U032 reserved03[(0x040)-1];
222      U032 Color1A;
223      struct
224      {
225          U032 TopLeft;
226          U032 WidthHeight;
227      } UnclippedRectangle[64];
228      U032 reserved04[(0x080)-3];
229      struct
230      {
231          U032 TopLeft;
232          U032 BottomRight;
233      } ClipB;
234      U032 Color1B;
235      struct
236      {
237          U032 TopLeft;
238          U032 BottomRight;
239      } ClippedRectangle[64];
240      U032 reserved05[(0x080)-5];
241      struct
242      {
243          U032 TopLeft;
244          U032 BottomRight;
245      } ClipC;
246      U032 Color1C;
247      U032 WidthHeightC;
248      U032 PointC;
249      U032 MonochromeData1C;
250      U032 reserved06[(0x080)+121];
251      struct
252      {
253          U032 TopLeft;
254          U032 BottomRight;
255      } ClipD;
256      U032 Color1D;
257      U032 WidthHeightInD;
258      U032 WidthHeightOutD;
259      U032 PointD;
260      U032 MonochromeData1D;
261      U032 reserved07[(0x080)+120];
262      struct
263      {
264          U032 TopLeft;
265          U032 BottomRight;
266      } ClipE;
267      U032 Color0E;
268      U032 Color1E;
269      U032 WidthHeightInE;
270      U032 WidthHeightOutE;
271      U032 PointE;
272      U032 MonochromeData01E;
273  } RivaBitmap;
274  /*
275   * 3D textured, Z buffered triangle.
276   */
277  typedef volatile struct
278  {
279      U032 reserved00[4];
280  #ifdef __BIG_ENDIAN
281      U032 FifoFree;
282  #else
283      U016 FifoFree;
284      U016 Nop;
285  #endif
286      U032 reserved01[0x0BC];
287      U032 TextureOffset;
288      U032 TextureFormat;
289      U032 TextureFilter;
290      U032 FogColor;
291  /* This is a problem on LynxOS */
292  #ifdef Control
293  #undef Control
294  #endif
295      U032 Control;
296      U032 AlphaTest;
297      U032 reserved02[0x339];
298      U032 FogAndIndex;
299      U032 Color;
300      float ScreenX;
301      float ScreenY;
302      float ScreenZ;
303      float EyeM;
304      float TextureS;
305      float TextureT;
306  } RivaTexturedTriangle03;
307  typedef volatile struct
308  {
309      U032 reserved00[4];
310  #ifdef __BIG_ENDIAN
311      U032 FifoFree;
312  #else
313      U016 FifoFree;
314      U016 Nop;
315  #endif
316      U032 reserved01[0x0BB];
317      U032 ColorKey;
318      U032 TextureOffset;
319      U032 TextureFormat;
320      U032 TextureFilter;
321      U032 Blend;
322  /* This is a problem on LynxOS */
323  #ifdef Control
324  #undef Control
325  #endif
326      U032 Control;
327      U032 FogColor;
328      U032 reserved02[0x39];
329      struct
330      {
331          float ScreenX;
332          float ScreenY;
333          float ScreenZ;
334          float EyeM;
335          U032 Color;
336          U032 Specular;
337          float TextureS;
338          float TextureT;
339      } Vertex[16];
340      U032 DrawTriangle3D;
341  } RivaTexturedTriangle05;
342  /*
343   * 2D line.
344   */
345  typedef volatile struct
346  {
347      U032 reserved00[4];
348  #ifdef __BIG_ENDIAN
349      U032 FifoFree;
350  #else
351      U016 FifoFree;
352      U016 Nop[1];
353  #endif
354      U032 reserved01[0x0BC];
355      U032 Color;             /* source color               0304-0307*/
356      U032 Reserved02[0x03e];
357      struct {                /* start aliased methods in array   0400-    */
358          U032 point0;        /* y_x S16_S16 in pixels            0-   3*/
359          U032 point1;        /* y_x S16_S16 in pixels            4-   7*/
360      } Lin[16];              /* end of aliased methods in array      -047f*/
361      struct {                /* start aliased methods in array   0480-    */
362          U032 point0X;       /* in pixels, 0 at left                0-   3*/
363          U032 point0Y;       /* in pixels, 0 at top                 4-   7*/
364          U032 point1X;       /* in pixels, 0 at left                8-   b*/
365          U032 point1Y;       /* in pixels, 0 at top                 c-   f*/
366      } Lin32[8];             /* end of aliased methods in array      -04ff*/
367      U032 PolyLin[32];       /* y_x S16_S16 in pixels         0500-057f*/
368      struct {                /* start aliased methods in array   0580-    */
369          U032 x;             /* in pixels, 0 at left                0-   3*/
370          U032 y;             /* in pixels, 0 at top                 4-   7*/
371      } PolyLin32[16];        /* end of aliased methods in array      -05ff*/
372      struct {                /* start aliased methods in array   0600-    */
373          U032 color;         /* source color                     0-   3*/
374          U032 point;         /* y_x S16_S16 in pixels            4-   7*/
375      } ColorPolyLin[16];     /* end of aliased methods in array      -067f*/
376  } RivaLine;
377  /*
378   * 2D/3D surfaces
379   */
380  typedef volatile struct
381  {
382      U032 reserved00[4];
383  #ifdef __BIG_ENDIAN
384      U032 FifoFree;
385  #else
386      U016 FifoFree;
387      U016 Nop;
388  #endif
389      U032 reserved01[0x0BE];
390      U032 Offset;
391  } RivaSurface;
392  typedef volatile struct
393  {
394      U032 reserved00[4];
395  #ifdef __BIG_ENDIAN
396      U032 FifoFree;
397  #else
398      U016 FifoFree;
399      U016 Nop;
400  #endif
401      U032 reserved01[0x0BD];
402      U032 Pitch;
403      U032 RenderBufferOffset;
404      U032 ZBufferOffset;
405  } RivaSurface3D;
406  
407  /***************************************************************************\
408  *                                                                           *
409  *                        Virtualized RIVA H/W interface.                    *
410  *                                                                           *
411  \***************************************************************************/
412  
413  #define FP_ENABLE  1
414  #define FP_DITHER  2
415  
416  struct _riva_hw_inst;
417  struct _riva_hw_state;
418  /*
419   * Virtialized chip interface. Makes RIVA 128 and TNT look alike.
420   */
421  typedef struct _riva_hw_inst
422  {
423      /*
424       * Chip specific settings.
425       */
426      U032 Architecture;
427      U032 Version;
428      U032 Chipset;
429      U032 CrystalFreqKHz;
430      U032 RamAmountKBytes;
431      U032 MaxVClockFreqKHz;
432      U032 RamBandwidthKBytesPerSec;
433      U032 EnableIRQ;
434      U032 IO;
435      U032 VBlankBit;
436      U032 FifoFreeCount;
437      U032 FifoEmptyCount;
438      U032 CursorStart;
439      U032 flatPanel;
440      Bool twoHeads;
441      /*
442       * Non-FIFO registers.
443       */
444      volatile U032 __iomem *PCRTC0;
445      volatile U032 __iomem *PCRTC;
446      volatile U032 __iomem *PRAMDAC0;
447      volatile U032 __iomem *PFB;
448      volatile U032 __iomem *PFIFO;
449      volatile U032 __iomem *PGRAPH;
450      volatile U032 __iomem *PEXTDEV;
451      volatile U032 __iomem *PTIMER;
452      volatile U032 __iomem *PMC;
453      volatile U032 __iomem *PRAMIN;
454      volatile U032 __iomem *FIFO;
455      volatile U032 __iomem *CURSOR;
456      volatile U008 __iomem *PCIO0;
457      volatile U008 __iomem *PCIO;
458      volatile U008 __iomem *PVIO;
459      volatile U008 __iomem *PDIO0;
460      volatile U008 __iomem *PDIO;
461      volatile U032 __iomem *PRAMDAC;
462      /*
463       * Common chip functions.
464       */
465      int  (*Busy)(struct _riva_hw_inst *);
466      void (*LoadStateExt)(struct _riva_hw_inst *,struct _riva_hw_state *);
467      void (*UnloadStateExt)(struct _riva_hw_inst *,struct _riva_hw_state *);
468      void (*SetStartAddress)(struct _riva_hw_inst *,U032);
469      void (*SetSurfaces2D)(struct _riva_hw_inst *,U032,U032);
470      void (*SetSurfaces3D)(struct _riva_hw_inst *,U032,U032);
471      int  (*ShowHideCursor)(struct _riva_hw_inst *,int);
472      void (*LockUnlock)(struct _riva_hw_inst *, int);
473      /*
474       * Current extended mode settings.
475       */
476      struct _riva_hw_state *CurrentState;
477      /*
478       * FIFO registers.
479       */
480      RivaRop                 __iomem *Rop;
481      RivaPattern             __iomem *Patt;
482      RivaClip                __iomem *Clip;
483      RivaPixmap              __iomem *Pixmap;
484      RivaScreenBlt           __iomem *Blt;
485      RivaBitmap              __iomem *Bitmap;
486      RivaLine                __iomem *Line;
487      RivaTexturedTriangle03  __iomem *Tri03;
488      RivaTexturedTriangle05  __iomem *Tri05;
489  } RIVA_HW_INST;
490  /*
491   * Extended mode state information.
492   */
493  typedef struct _riva_hw_state
494  {
495      U032 bpp;
496      U032 width;
497      U032 height;
498      U032 interlace;
499      U032 repaint0;
500      U032 repaint1;
501      U032 screen;
502      U032 scale;
503      U032 dither;
504      U032 extra;
505      U032 pixel;
506      U032 horiz;
507      U032 arbitration0;
508      U032 arbitration1;
509      U032 vpll;
510      U032 vpll2;
511      U032 pllsel;
512      U032 general;
513      U032 crtcOwner;
514      U032 head;
515      U032 head2;
516      U032 config;
517      U032 cursorConfig;
518      U032 cursor0;
519      U032 cursor1;
520      U032 cursor2;
521      U032 offset0;
522      U032 offset1;
523      U032 offset2;
524      U032 offset3;
525      U032 pitch0;
526      U032 pitch1;
527      U032 pitch2;
528      U032 pitch3;
529  } RIVA_HW_STATE;
530  
531  /*
532   * function prototypes
533   */
534  
535  extern int CalcStateExt
536  (
537      RIVA_HW_INST  *chip,
538      RIVA_HW_STATE *state,
539      struct pci_dev *pdev,
540      int            bpp,
541      int            width,
542      int            hDisplaySize,
543      int            height,
544      int            dotClock
545  );
546  
547  /*
548   * External routines.
549   */
550  int RivaGetConfig(RIVA_HW_INST *chip, struct pci_dev *pdev, unsigned int c);
551  /*
552   * FIFO Free Count. Should attempt to yield processor if RIVA is busy.
553   */
554  
555  #define RIVA_FIFO_FREE(hwinst,hwptr,cnt)                            \
556  {                                                                   \
557      while ((hwinst).FifoFreeCount < (cnt)) {                        \
558  	mb();mb();						    \
559          (hwinst).FifoFreeCount = NV_RD32(&(hwinst).hwptr->FifoFree, 0) >> 2;     \
560      }								    \
561      (hwinst).FifoFreeCount -= (cnt);                                \
562  }
563  #endif /* __RIVA_HW_H__ */
564  
565