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