Home | History | Annotate | Line # | Download | only in src
      1 /*
      2  * Copyright (c) 1993-1999 NVIDIA, Corporation
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the
      6  * "Software"), to deal in the Software without restriction, including
      7  * without limitation the rights to use, copy, modify, merge, publish,
      8  * distribute, sublicense, and/or sell copies of the Software, and to
      9  * permit persons to whom the Software is furnished to do so, subject to
     10  * the following conditions:
     11  *
     12  * The above copyright notice and this permission notice shall be included
     13  * in all copies or substantial portions of the Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     16  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
     18  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
     19  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     20  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     21  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     22  */
     23 
     24 #ifndef __RIVA_HW_H__
     25 #define __RIVA_HW_H__
     26 
     27 /*
     28  * Define supported architectures.
     29  */
     30 /***************************************************************************\
     31 *                                                                           *
     32 *                             FIFO registers.                               *
     33 *                                                                           *
     34 \***************************************************************************/
     35 
     36 /*
     37  * Raster OPeration. Windows style ROP3.
     38  */
     39 typedef volatile struct
     40 {
     41     U032 reserved00[4];
     42     U016 FifoFree;
     43     U016 Nop;
     44     U032 reserved01[0x0BB];
     45     U032 Rop3;
     46 } RivaRop;
     47 /*
     48  * 8X8 Monochrome pattern.
     49  */
     50 typedef volatile struct
     51 {
     52     U032 reserved00[4];
     53     U016 FifoFree;
     54     U016 Nop;
     55     U032 reserved01[0x0BD];
     56     U032 Shape;
     57     U032 reserved03[0x001];
     58     U032 Color0;
     59     U032 Color1;
     60     U032 Monochrome[2];
     61 } RivaPattern;
     62 /*
     63  * Scissor clip rectangle.
     64  */
     65 typedef volatile struct
     66 {
     67     U032 reserved00[4];
     68     U016 FifoFree;
     69     U016 Nop;
     70     U032 reserved01[0x0BB];
     71     U032 TopLeft;
     72     U032 WidthHeight;
     73 } RivaClip;
     74 /*
     75  * 2D filled rectangle.
     76  */
     77 typedef volatile struct
     78 {
     79     U032 reserved00[4];
     80     U016 FifoFree;
     81     U016 Nop[1];
     82     U032 reserved01[0x0BC];
     83     U032 Color;
     84     U032 reserved03[0x03E];
     85     U032 TopLeft;
     86     U032 WidthHeight;
     87 } RivaRectangle;
     88 /*
     89  * 2D screen-screen BLT.
     90  */
     91 typedef volatile struct
     92 {
     93     U032 reserved00[4];
     94     U016 FifoFree;
     95     U016 Nop;
     96     U032 reserved01[0x0BB];
     97     U032 TopLeftSrc;
     98     U032 TopLeftDst;
     99     U032 WidthHeight;
    100 } RivaScreenBlt;
    101 /*
    102  * 2D pixel BLT.
    103  */
    104 typedef volatile struct
    105 {
    106     U032 reserved00[4];
    107     U016 FifoFree;
    108     U016 Nop[1];
    109     U032 reserved01[0x0BC];
    110     U032 TopLeft;
    111     U032 WidthHeight;
    112     U032 WidthHeightIn;
    113     U032 reserved02[0x03C];
    114     U032 Pixels;
    115 } RivaPixmap;
    116 /*
    117  * Filled rectangle combined with monochrome expand.  Useful for glyphs.
    118  */
    119 typedef volatile struct
    120 {
    121     U032 reserved00[4];
    122     U016 FifoFree;
    123     U016 Nop;
    124     U032 reserved01[0x0BB];
    125     U032 reserved03[(0x040)-1];
    126     U032 Color1A;
    127     struct
    128     {
    129         U032 TopLeft;
    130         U032 WidthHeight;
    131     } UnclippedRectangle[64];
    132     U032 reserved04[(0x080)-3];
    133     struct
    134     {
    135         U032 TopLeft;
    136         U032 BottomRight;
    137     } ClipB;
    138     U032 Color1B;
    139     struct
    140     {
    141         U032 TopLeft;
    142         U032 BottomRight;
    143     } ClippedRectangle[64];
    144     U032 reserved05[(0x080)-5];
    145     struct
    146     {
    147         U032 TopLeft;
    148         U032 BottomRight;
    149     } ClipC;
    150     U032 Color1C;
    151     U032 WidthHeightC;
    152     U032 PointC;
    153     U032 MonochromeData1C;
    154     U032 reserved06[(0x080)+121];
    155     struct
    156     {
    157         U032 TopLeft;
    158         U032 BottomRight;
    159     } ClipD;
    160     U032 Color1D;
    161     U032 WidthHeightInD;
    162     U032 WidthHeightOutD;
    163     U032 PointD;
    164     U032 MonochromeData1D;
    165     U032 reserved07[(0x080)+120];
    166     struct
    167     {
    168         U032 TopLeft;
    169         U032 BottomRight;
    170     } ClipE;
    171     U032 Color0E;
    172     U032 Color1E;
    173     U032 WidthHeightInE;
    174     U032 WidthHeightOutE;
    175     U032 PointE;
    176     U032 MonochromeData01E;
    177 } RivaBitmap;
    178 /*
    179  * 2D line.
    180  */
    181 typedef volatile struct
    182 {
    183     U032 reserved00[4];
    184     U016 FifoFree;
    185     U016 Nop[1];
    186     U032 reserved01[0x0BC];
    187     U032 Color;             /* source color               0304-0307*/
    188     U032 Reserved02[0x03e];
    189     struct {                /* start aliased methods in array   0400-    */
    190         U032 point0;        /* y_x S16_S16 in pixels            0-   3*/
    191         U032 point1;        /* y_x S16_S16 in pixels            4-   7*/
    192     } Lin[16];              /* end of aliased methods in array      -047f*/
    193     struct {                /* start aliased methods in array   0480-    */
    194         U032 point0X;       /* in pixels, 0 at left                0-   3*/
    195         U032 point0Y;       /* in pixels, 0 at top                 4-   7*/
    196         U032 point1X;       /* in pixels, 0 at left                8-   b*/
    197         U032 point1Y;       /* in pixels, 0 at top                 c-   f*/
    198     } Lin32[8];             /* end of aliased methods in array      -04ff*/
    199     U032 PolyLin[32];       /* y_x S16_S16 in pixels         0500-057f*/
    200     struct {                /* start aliased methods in array   0580-    */
    201         U032 x;             /* in pixels, 0 at left                0-   3*/
    202         U032 y;             /* in pixels, 0 at top                 4-   7*/
    203     } PolyLin32[16];        /* end of aliased methods in array      -05ff*/
    204     struct {                /* start aliased methods in array   0600-    */
    205         U032 color;         /* source color                     0-   3*/
    206         U032 point;         /* y_x S16_S16 in pixels            4-   7*/
    207     } ColorPolyLin[16];     /* end of aliased methods in array      -067f*/
    208 } RivaLine;
    209 /*
    210  * 2D/3D surfaces
    211  */
    212 typedef volatile struct
    213 {
    214     U032 reserved00[4];
    215     U016 FifoFree;
    216     U016 Nop;
    217     U032 reserved01[0x0BE];
    218     U032 Offset;
    219 } RivaSurface;
    220 typedef volatile struct
    221 {
    222     U032 reserved00[4];
    223     U016 FifoFree;
    224     U016 Nop;
    225     U032 reserved01[0x0BD];
    226     U032 Pitch;
    227     U032 RenderBufferOffset;
    228     U032 ZBufferOffset;
    229 } RivaSurface3D;
    230 
    231 /***************************************************************************\
    232 *                                                                           *
    233 *                        Virtualized RIVA H/W interface.                    *
    234 *                                                                           *
    235 \***************************************************************************/
    236 
    237 #define FP_ENABLE  1
    238 #define FP_DITHER  2
    239 
    240 struct _riva_hw_inst;
    241 struct _riva_hw_state;
    242 /*
    243  * Virtialized chip interface. Makes RIVA 128 and TNT look alike.
    244  */
    245 typedef struct _riva_hw_inst
    246 {
    247     /*
    248      * Chip specific settings.
    249      */
    250     U032 CrystalFreqKHz;
    251     U032 RamAmountKBytes;
    252     U032 MaxVClockFreqKHz;
    253     U032 RamBandwidthKBytesPerSec;
    254     U032 EnableIRQ;
    255     U032 IO;
    256     U032 VBlankBit;
    257     U032 FifoFreeCount;
    258     U032 FifoEmptyCount;
    259     U032 CursorStart;
    260     /*
    261      * Non-FIFO registers.
    262      */
    263     volatile U032 *PCRTC;
    264     volatile U032 *PFB;
    265     volatile U032 *PFIFO;
    266     volatile U032 *PGRAPH;
    267     volatile U032 *PEXTDEV;
    268     volatile U032 *PTIMER;
    269     volatile U032 *PMC;
    270     volatile U032 *PRAMIN;
    271     volatile U032 *FIFO;
    272     volatile U032 *CURSOR;
    273     volatile U008 *PCIO;
    274     volatile U008 *PVIO;
    275     volatile U008 *PDIO;
    276     volatile U032 *PRAMDAC;
    277     /*
    278      * Common chip functions.
    279      */
    280     int  (*Busy)(struct _riva_hw_inst *);
    281     void (*CalcStateExt)(struct _riva_hw_inst *,struct _riva_hw_state *,int,int,int,int,int,int);
    282     void (*LoadStateExt)(struct _riva_hw_inst *,struct _riva_hw_state *);
    283     void (*UnloadStateExt)(struct _riva_hw_inst *,struct _riva_hw_state *);
    284     void (*SetStartAddress)(struct _riva_hw_inst *,U032);
    285     int  (*ShowHideCursor)(struct _riva_hw_inst *,int);
    286     void (*LockUnlock)(struct _riva_hw_inst *, int);
    287     /*
    288      * Current extended mode settings.
    289      */
    290     struct _riva_hw_state *CurrentState;
    291     /*
    292      * FIFO registers.
    293      */
    294     RivaRop                 *Rop;
    295     RivaPattern             *Patt;
    296     RivaClip                *Clip;
    297     RivaPixmap              *Pixmap;
    298     RivaScreenBlt           *Blt;
    299     RivaBitmap              *Bitmap;
    300     RivaLine                *Line;
    301 } RIVA_HW_INST;
    302 /*
    303  * Extended mode state information.
    304  */
    305 typedef struct _riva_hw_state
    306 {
    307     U032 bpp;
    308     U032 width;
    309     U032 height;
    310     U032 interlace;
    311     U032 repaint0;
    312     U032 repaint1;
    313     U032 screen;
    314     U032 extra;
    315     U032 pixel;
    316     U032 horiz;
    317     U032 arbitration0;
    318     U032 arbitration1;
    319     U032 vpll;
    320     U032 pllsel;
    321     U032 general;
    322     U032 config;
    323     U032 cursorConfig;
    324     U032 cursor0;
    325     U032 cursor1;
    326     U032 cursor2;
    327     U032 offset;
    328     U032 pitch;
    329 } RIVA_HW_STATE;
    330 
    331 /*
    332  * FIFO Free Count. Should attempt to yield processor if RIVA is busy.
    333  */
    334 
    335 #define RIVA_FIFO_FREE(hwinst,hwptr,cnt)                           \
    336 {                                                                  \
    337    while ((hwinst).FifoFreeCount < (cnt)) {                          \
    338         mem_barrier(); \
    339         mem_barrier(); \
    340 	(hwinst).FifoFreeCount = (hwinst).hwptr->FifoFree >> 2;        \
    341    } \
    342    (hwinst).FifoFreeCount -= (cnt);                                \
    343 }
    344 #define RIVA_BUSY(hwinst) \
    345 { \
    346    mem_barrier(); \
    347    while ((hwinst).Busy(&(hwinst))); \
    348 }
    349 #endif /* __RIVA_HW_H__ */
    350