Home | History | Annotate | Line # | Download | only in src
      1 /*
      2    Voodoo Banshee driver version 1.0.2
      3 
      4    Author: Daryll Strauss
      5 
      6    Copyright: 1998,1999
      7 */
      8 
      9 #ifndef _TDFX_H_
     10 #define _TDFX_H_
     11 
     12 #include <string.h>
     13 #include <stdio.h>
     14 
     15 #include "xf86Pci.h"
     16 #include "xf86DDC.h"
     17 #include "xf86xv.h"
     18 #include "tdfxdefs.h"
     19 
     20 #ifndef XF86DRI
     21 #undef TDFXDRI
     22 #endif
     23 
     24 #ifdef TDFXDRI
     25 #include "xf86drm.h"
     26 #include "sarea.h"
     27 #define _XF86DRI_SERVER_
     28 #include "dri.h"
     29 #include "tdfx_dri.h"
     30 #include "tdfx_dripriv.h"
     31 #endif
     32 
     33 #define TDFX_VERSION 4000
     34 #define TDFX_NAME "TDFX"
     35 #define TDFX_DRIVER_NAME "tdfx"
     36 #define TDFX_MAJOR_VERSION PACKAGE_VERSION_MAJOR
     37 #define TDFX_MINOR_VERSION PACKAGE_VERSION_MINOR
     38 #define TDFX_PATCHLEVEL PACKAGE_VERSION_PATCHLEVEL
     39 
     40 /* Macros to aid source compatibilty between pci-rework and "classic" builds.
     41  */
     42 #ifdef XSERVER_LIBPCIACCESS
     43 #include <pciaccess.h>
     44 
     45 #define DEVICE_ID(p) (p)->device_id
     46 
     47 #define PCI_READ_LONG(value, offset, card_index) \
     48     pci_device_cfg_read_u32(pTDFX->PciInfo[(card_index)], & (value), (offset))
     49 
     50 #define PCI_WRITE_LONG(value, offset, card_index) \
     51     pci_device_cfg_write_u32(pTDFX->PciInfo[(card_index)], (value), (offset))
     52 
     53 #define PCI_IO_BASE(p, region) \
     54     (p)->regions[region].base_addr
     55 
     56 #define PCI_MEM_BASE(p, region) \
     57     (p)->regions[region].base_addr
     58 #else
     59 #define DEVICE_ID(p) (p)->chipType
     60 
     61 #define PCI_READ_LONG(value, offset, card_index) \
     62     (value) = pciReadLong(pTDFX->PciTag[(card_index)], (offset))
     63 
     64 #define PCI_WRITE_LONG(value, offset, card_index) \
     65     pciWriteLong(pTDFX->PciTag[(card_index)], (offset), (value))
     66 
     67 #define PCI_IO_BASE(p, region) \
     68     (p)->ioBase[region]
     69 
     70 #define PCI_MEM_BASE(p, region) \
     71     (p)->memBase[region]
     72 #endif
     73 
     74 #define PCI_VENDOR_3DFX			0x121A
     75 
     76 #define PCI_CHIP_VOODOO_GRAPHICS	0x0001
     77 #define PCI_CHIP_VOODOO2		0x0002
     78 #define PCI_CHIP_BANSHEE		0x0003
     79 #define PCI_CHIP_VELOCITY		0x0004
     80 #define PCI_CHIP_VOODOO3		0x0005
     81 #define PCI_CHIP_VOODOO4		0x0007
     82 #define PCI_CHIP_VOODOO5		0x0009
     83 
     84 #define PCI_CARD_VOODOO3_2000		0x0036
     85 #define PCI_CARD_VOODOO3_3000		0x003A
     86 
     87 struct _TDFXRec;
     88 typedef struct _TDFXRec *TDFXPtr;
     89 
     90 #include "tdfx_priv.h"
     91 extern void TDFXSwapContextFifo(ScreenPtr pScreen);
     92 extern void TDFXLostContext(ScreenPtr pScreen);
     93 extern Bool TDFXSetupSLI(ScrnInfoPtr pScrn, Bool sliEnable, int aaSamples);
     94 extern Bool TDFXDisableSLI(TDFXPtr pTDFX);
     95 
     96 #ifdef TDFXDRI
     97 extern void FillPrivateDRI(TDFXPtr pTDFX, TDFXDRIPtr pTDFXDRI);
     98 #endif
     99 
    100 #if 0
    101 /* These are not normally turned on. They are only included for debugging. */
    102 #define TRACE 1
    103 #define TRACEACCEL 1
    104 #define TDFX_DEBUG_CMDS
    105 #define TRACECURS 1
    106 #define REGDEBUG 1
    107 #define TRACEREG
    108 #endif
    109 
    110 #ifdef TRACE
    111 #define TDFXTRACE ErrorF
    112 #else
    113 #define TDFXTRACE if(0) ErrorF
    114 #endif
    115 
    116 #ifdef TRACEACCEL
    117 #define TDFXTRACEACCEL ErrorF
    118 #else
    119 #define TDFXTRACEACCEL if(0) ErrorF
    120 #endif
    121 
    122 #ifdef TRACECURS
    123 #define TDFXTRACECURS ErrorF
    124 #else
    125 #define TDFXTRACECURS if(0) ErrorF
    126 #endif
    127 
    128 #ifdef TRACEREG
    129 #define TDFXTRACEREG ErrorF
    130 #else
    131 #define TDFXTRACEREG if(0) ErrorF
    132 #endif
    133 
    134 #ifdef HAVE_XAA_H
    135 #include "xaa.h"
    136 #endif
    137 #include "xf86fbman.h"
    138 #include "xf86Cursor.h"
    139 #include "compat-api.h"
    140 
    141 typedef void (*TDFXWriteIndexedByteFunc)(TDFXPtr pTDFX, int addr,
    142 					 char index, char value);
    143 typedef char (*TDFXReadIndexedByteFunc)(TDFXPtr pTDFX, int addr,
    144 					char index);
    145 typedef void (*TDFXWriteWordFunc)(TDFXPtr pTDFX, int addr, int value);
    146 typedef int (*TDFXReadWordFunc)(TDFXPtr pTDFX, int addr);
    147 typedef void (*TDFXWriteChipIndexedByteFunc)(TDFXPtr pTDFX, int chip,
    148 					     int addr, char index, char value);
    149 typedef char (*TDFXReadChipIndexedByteFunc)(TDFXPtr pTDFX, int chip,
    150 					    int addr, char index);
    151 typedef void (*TDFXWriteChipWordFunc)(TDFXPtr pTDFX, int chip,
    152 				      int addr, int value);
    153 typedef int (*TDFXReadChipWordFunc)(TDFXPtr pTDFX, int chip,
    154 				    int addr);
    155 typedef void (*TDFXSyncFunc)(ScrnInfoPtr pScrn);
    156 typedef void (*TDFXBufferFunc)(TDFXPtr pTDFX, int which);
    157 #if X_BYTE_ORDER == X_BIG_ENDIAN
    158 typedef void (*TDFXWriteFifoFunc)(TDFXPtr pTDFX, int val);
    159 #endif
    160 
    161 
    162 typedef struct {
    163   unsigned int vidcfg;
    164   unsigned int vidpll;
    165   unsigned int dacmode;
    166   unsigned int vgainit0;
    167   unsigned int vgainit1;
    168   unsigned int miscinit0;
    169   unsigned int miscinit1;
    170   unsigned int screensize;
    171   unsigned int stride;
    172   unsigned int cursloc;
    173   unsigned int startaddr;
    174   unsigned int clip0min;
    175   unsigned int clip0max;
    176   unsigned int clip1min;
    177   unsigned int clip1max;
    178   unsigned int srcbaseaddr;
    179   unsigned int dstbaseaddr;
    180   unsigned char ExtVga[2];
    181   unsigned int dactable[512];
    182 } TDFXRegRec, *TDFXRegPtr;
    183 
    184 typedef struct TextureData_t {
    185   int contextid;
    186   void *data;
    187   struct TextureData_t *next;
    188 } TextureData;
    189 
    190 #define MAXCHIPS 4
    191 
    192 #ifdef XSERVER_LIBPCIACCESS
    193 enum tdfx_chips {
    194     Banshee = 0,
    195     Voodoo3_2000,
    196     Voodoo3_3000,
    197     Voodoo3_Unknown,
    198     Voodoo5,
    199     MAX_VOODOO_CARDS
    200 };
    201 #endif
    202 
    203 typedef struct _TDFXRec {
    204 #ifdef XSERVER_LIBPCIACCESS
    205     enum tdfx_chips match_id;
    206     void *MMIOBase[MAXCHIPS];
    207     void *FbBase;
    208 #else
    209   unsigned char *MMIOBase[MAXCHIPS];
    210   unsigned char *FbBase;
    211   unsigned char *myFbBase;
    212 #endif
    213   unsigned long PIOBase[MAXCHIPS];
    214   long FbMapSize;
    215   int pixelFormat;
    216   int stride;
    217   int cpp;
    218   int maxClip;
    219   int MaxClock;
    220   int ChipType;
    221 #ifdef XSERVER_LIBPCIACCESS
    222     struct pci_device *PciInfo[MAXCHIPS];
    223 #else
    224   pciVideoPtr PciInfo;
    225 #endif
    226   unsigned long LinearAddr[MAXCHIPS];
    227   unsigned long MMIOAddr[MAXCHIPS];
    228   EntityInfoPtr pEnt;
    229   int numChips;
    230 #ifndef XSERVER_LIBPCIACCESS
    231   PCITAG PciTag[MAXCHIPS];
    232 #endif
    233   Bool Primary;
    234   int HasSGRAM;
    235   int PciCnt;
    236   int PrevDrawState;
    237   int DrawState;
    238   int Cmd;
    239   int DashedLineSize;
    240   BoxRec prevBlitDest;
    241   TDFXRegRec SavedReg;
    242   TDFXRegRec ModeReg;
    243 #ifdef HAVE_XAA_H
    244   XAAInfoRecPtr AccelInfoRec;
    245 #endif
    246   xf86CursorInfoPtr CursorInfoRec;
    247   CloseScreenProcPtr CloseScreen;
    248   Bool usePIO;
    249   Bool NoAccel;
    250   DGAModePtr DGAModes;
    251   Bool DGAactive;
    252   Bool initDone;
    253   int DGAViewportStatus;
    254   int cursorOffset;
    255   int fbOffset;
    256   int backOffset;
    257   int depthOffset;
    258   int texOffset;
    259   int texSize;
    260   TDFXWriteIndexedByteFunc writeControl;
    261   TDFXReadIndexedByteFunc readControl;
    262   TDFXWriteWordFunc writeLong;
    263   TDFXReadWordFunc readLong;
    264   TDFXWriteChipWordFunc writeChipLong;
    265   TDFXReadChipWordFunc readChipLong;
    266   TDFXSyncFunc sync;
    267 #if X_BYTE_ORDER == X_BIG_ENDIAN
    268   TDFXWriteFifoFunc writeFifo;
    269 #endif
    270   int syncDone;
    271   int scanlineWidth;
    272   unsigned char *scanlineColorExpandBuffers[2];
    273   PROPDATA
    274 #ifdef TDFXDRI
    275   Bool directRenderingEnabled;
    276   DRIInfoPtr pDRIInfo;
    277   int drmSubFD;
    278   TDFXRegRec DRContextRegs;
    279 #endif
    280   /* State for video */
    281   FBAreaPtr offscreenYUVBuf;
    282   int offscreenYUVBufWidth;
    283   int offscreenYUVBufHeight;
    284 
    285   /* This is a small register shadow.  I'm only shadowing
    286    *   sst2dDstFmt
    287    *   sst2dSrcFmt
    288    * If a real register shadow is ever needed we should probably
    289    * shadow everything and make it happen automatically for every write. */
    290   INT32 sst2DSrcFmtShadow;
    291   INT32 sst2DDstFmtShadow;
    292   int pixmapCacheLinesMin;
    293   int pixmapCacheLinesMax;
    294   FBAreaPtr reservedArea;
    295   Bool ShowCache;
    296   int videoKey;
    297   void (*VideoTimerCallback)(ScrnInfoPtr, Time);
    298   FBLinearPtr overlayBuffer;
    299   FBLinearPtr overlayBuffer2;	/* for double-buffering */
    300   int whichOverlayBuffer;	/* flip-flop */
    301   FBAreaPtr textureBuffer;
    302   Bool TextureXvideo;
    303   XF86VideoAdaptorPtr overlayAdaptor;
    304   XF86VideoAdaptorPtr textureAdaptor;
    305   ScreenBlockHandlerProcPtr BlockHandler;
    306   OptionInfoPtr Options;
    307 
    308   ScreenWakeupHandlerProcPtr coreWakeupHandler;
    309   ScreenBlockHandlerProcPtr coreBlockHandler;
    310 
    311   I2CBusPtr pI2CBus;
    312 
    313 } TDFXRec;
    314 
    315 typedef struct {
    316   RegionRec	clip;
    317   CARD32	colorKey;
    318   int		filterQuality;
    319   CARD32	videoStatus;
    320   Time		offTime;
    321   Time		freeTime;
    322 } TDFXPortPrivRec, *TDFXPortPrivPtr;
    323 
    324 typedef struct {
    325   PROPSAREADATA
    326   int fifoOwner;
    327   int CtxOwner;
    328   int TexOwner;
    329 } TDFXSAREAPriv;
    330 
    331 #define TDFXPTR(p) ((TDFXPtr)((p)->driverPrivate))
    332 
    333 #define DRAW_STATE_CLIPPING 0x1
    334 #define DRAW_STATE_TRANSPARENT 0x2
    335 #define DRAW_STATE_CLIP1CHANGED 0x4
    336 
    337 #define TDFX_FRONT 0
    338 #define TDFX_BACK 1
    339 #define TDFX_DEPTH 2
    340 
    341 #define TDFX2XCUTOFF 135000
    342 
    343 extern Bool TDFXAccelInit(ScreenPtr pScreen);
    344 extern Bool TDFXCursorInit(ScreenPtr pScreen);
    345 extern void TDFXSync(ScrnInfoPtr pScrn);
    346 extern Bool TDFXDRIScreenInit(ScreenPtr pScreen);
    347 extern void TDFXDRICloseScreen(ScreenPtr pScreen);
    348 extern Bool TDFXDRIFinishScreenInit(ScreenPtr pScreen);
    349 extern Bool TDFXDGAInit(ScreenPtr pScreen);
    350 extern void TDFXCursorGrabMemory(ScreenPtr pScreen);
    351 extern void TDFXSetLFBConfig(TDFXPtr pTDFX);
    352 extern void TDFXSendNOPFifo(ScrnInfoPtr pScrn);
    353 
    354 extern Bool TDFXSwitchMode(SWITCH_MODE_ARGS_DECL);
    355 extern void TDFXAdjustFrame(ADJUST_FRAME_ARGS_DECL);
    356 
    357 extern void TDFXSetPIOAccess(TDFXPtr pTDFX);
    358 extern void TDFXSetMMIOAccess(TDFXPtr pTDFX);
    359 extern void TDFXWriteLongMMIO(TDFXPtr pTDFX, int addr, int val);
    360 extern int TDFXReadLongMMIO(TDFXPtr pTDFX, int addr);
    361 extern void TDFXWriteChipLongMMIO(TDFXPtr pTDFX, int chip, int addr, int val);
    362 
    363 extern void TDFXNeedSync(ScrnInfoPtr pScrn);
    364 extern void TDFXCheckSync(ScrnInfoPtr pScrn);
    365 extern void TDFXFirstSync(ScrnInfoPtr pScrn);
    366 
    367 extern void TDFXSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir,
    368 					   int ydir, int rop,
    369 					   unsigned int planemask,
    370 					   int trans_color);
    371 extern void TDFXSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int srcX,
    372 					     int srcY, int dstX, int dstY,
    373 					     int w, int h);
    374 extern void TDFXSetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop,
    375 				  unsigned int planemask);
    376 extern void TDFXSubsequentSolidFillRect(ScrnInfoPtr pScrn, int x, int y,
    377 					int w, int h);
    378 
    379 extern void TDFXSelectBuffer(TDFXPtr pTDFX, int which);
    380 
    381 extern void TDFXInitVideo(ScreenPtr pScreen);
    382 extern void TDFXCloseVideo(ScreenPtr pScreen);
    383 
    384 #endif
    385