102be438aSmrg/* 202be438aSmrg Voodoo Banshee driver version 1.0.2 302be438aSmrg 402be438aSmrg Author: Daryll Strauss 502be438aSmrg 602be438aSmrg Copyright: 1998,1999 702be438aSmrg*/ 802be438aSmrg 902be438aSmrg#ifndef _TDFX_H_ 1002be438aSmrg#define _TDFX_H_ 1102be438aSmrg 1202be438aSmrg#include <string.h> 1302be438aSmrg#include <stdio.h> 1402be438aSmrg 1502be438aSmrg#include "xf86Pci.h" 16880ed95aSmrg#include "xf86DDC.h" 1702be438aSmrg#include "xf86xv.h" 1802be438aSmrg#include "tdfxdefs.h" 1902be438aSmrg 20909209eeSmrg#ifndef XF86DRI 21909209eeSmrg#undef TDFXDRI 22909209eeSmrg#endif 23909209eeSmrg 24909209eeSmrg#ifdef TDFXDRI 2502be438aSmrg#include "xf86drm.h" 2602be438aSmrg#include "sarea.h" 2702be438aSmrg#define _XF86DRI_SERVER_ 2802be438aSmrg#include "dri.h" 2902be438aSmrg#include "tdfx_dri.h" 3002be438aSmrg#include "tdfx_dripriv.h" 3102be438aSmrg#endif 3202be438aSmrg 3302be438aSmrg#define TDFX_VERSION 4000 3402be438aSmrg#define TDFX_NAME "TDFX" 3502be438aSmrg#define TDFX_DRIVER_NAME "tdfx" 36880ed95aSmrg#define TDFX_MAJOR_VERSION PACKAGE_VERSION_MAJOR 37880ed95aSmrg#define TDFX_MINOR_VERSION PACKAGE_VERSION_MINOR 38880ed95aSmrg#define TDFX_PATCHLEVEL PACKAGE_VERSION_PATCHLEVEL 39880ed95aSmrg 40880ed95aSmrg/* Macros to aid source compatibilty between pci-rework and "classic" builds. 41880ed95aSmrg */ 42880ed95aSmrg#ifdef XSERVER_LIBPCIACCESS 43880ed95aSmrg#include <pciaccess.h> 44880ed95aSmrg 45880ed95aSmrg#define DEVICE_ID(p) (p)->device_id 46880ed95aSmrg 47880ed95aSmrg#define PCI_READ_LONG(value, offset, card_index) \ 48880ed95aSmrg pci_device_cfg_read_u32(pTDFX->PciInfo[(card_index)], & (value), (offset)) 49880ed95aSmrg 50880ed95aSmrg#define PCI_WRITE_LONG(value, offset, card_index) \ 51880ed95aSmrg pci_device_cfg_write_u32(pTDFX->PciInfo[(card_index)], (value), (offset)) 52880ed95aSmrg 53880ed95aSmrg#define PCI_IO_BASE(p, region) \ 54880ed95aSmrg (p)->regions[region].base_addr 55880ed95aSmrg 56880ed95aSmrg#define PCI_MEM_BASE(p, region) \ 57880ed95aSmrg (p)->regions[region].base_addr 58880ed95aSmrg#else 59880ed95aSmrg#define DEVICE_ID(p) (p)->chipType 60880ed95aSmrg 61880ed95aSmrg#define PCI_READ_LONG(value, offset, card_index) \ 62880ed95aSmrg (value) = pciReadLong(pTDFX->PciTag[(card_index)], (offset)) 63880ed95aSmrg 64880ed95aSmrg#define PCI_WRITE_LONG(value, offset, card_index) \ 65880ed95aSmrg pciWriteLong(pTDFX->PciTag[(card_index)], (offset), (value)) 66880ed95aSmrg 67880ed95aSmrg#define PCI_IO_BASE(p, region) \ 68880ed95aSmrg (p)->ioBase[region] 69880ed95aSmrg 70880ed95aSmrg#define PCI_MEM_BASE(p, region) \ 71880ed95aSmrg (p)->memBase[region] 72880ed95aSmrg#endif 7302be438aSmrg 74e2463426Smrg#define PCI_VENDOR_3DFX 0x121A 75e2463426Smrg 76e2463426Smrg#define PCI_CHIP_VOODOO_GRAPHICS 0x0001 77e2463426Smrg#define PCI_CHIP_VOODOO2 0x0002 78e2463426Smrg#define PCI_CHIP_BANSHEE 0x0003 79e2463426Smrg#define PCI_CHIP_VELOCITY 0x0004 80e2463426Smrg#define PCI_CHIP_VOODOO3 0x0005 81e2463426Smrg#define PCI_CHIP_VOODOO4 0x0007 82e2463426Smrg#define PCI_CHIP_VOODOO5 0x0009 83e2463426Smrg 84e2463426Smrg#define PCI_CARD_VOODOO3_2000 0x0036 85e2463426Smrg#define PCI_CARD_VOODOO3_3000 0x003A 86e2463426Smrg 8702be438aSmrgstruct _TDFXRec; 8802be438aSmrgtypedef struct _TDFXRec *TDFXPtr; 8902be438aSmrg 9002be438aSmrg#include "tdfx_priv.h" 9102be438aSmrgextern void TDFXSwapContextFifo(ScreenPtr pScreen); 9202be438aSmrgextern void TDFXLostContext(ScreenPtr pScreen); 9302be438aSmrgextern Bool TDFXSetupSLI(ScrnInfoPtr pScrn, Bool sliEnable, int aaSamples); 9402be438aSmrgextern Bool TDFXDisableSLI(TDFXPtr pTDFX); 9502be438aSmrg 96909209eeSmrg#ifdef TDFXDRI 9702be438aSmrgextern void FillPrivateDRI(TDFXPtr pTDFX, TDFXDRIPtr pTDFXDRI); 9802be438aSmrg#endif 9902be438aSmrg 10002be438aSmrg#if 0 10102be438aSmrg/* These are not normally turned on. They are only included for debugging. */ 10202be438aSmrg#define TRACE 1 10302be438aSmrg#define TRACEACCEL 1 10402be438aSmrg#define TDFX_DEBUG_CMDS 10502be438aSmrg#define TRACECURS 1 10602be438aSmrg#define REGDEBUG 1 10702be438aSmrg#define TRACEREG 10802be438aSmrg#endif 10902be438aSmrg 11002be438aSmrg#ifdef TRACE 11102be438aSmrg#define TDFXTRACE ErrorF 11202be438aSmrg#else 11302be438aSmrg#define TDFXTRACE if(0) ErrorF 11402be438aSmrg#endif 11502be438aSmrg 11602be438aSmrg#ifdef TRACEACCEL 11702be438aSmrg#define TDFXTRACEACCEL ErrorF 11802be438aSmrg#else 11902be438aSmrg#define TDFXTRACEACCEL if(0) ErrorF 12002be438aSmrg#endif 12102be438aSmrg 12202be438aSmrg#ifdef TRACECURS 12302be438aSmrg#define TDFXTRACECURS ErrorF 12402be438aSmrg#else 12502be438aSmrg#define TDFXTRACECURS if(0) ErrorF 12602be438aSmrg#endif 12702be438aSmrg 12802be438aSmrg#ifdef TRACEREG 12902be438aSmrg#define TDFXTRACEREG ErrorF 13002be438aSmrg#else 13102be438aSmrg#define TDFXTRACEREG if(0) ErrorF 13202be438aSmrg#endif 13302be438aSmrg 134909209eeSmrg#ifdef HAVE_XAA_H 13502be438aSmrg#include "xaa.h" 136909209eeSmrg#endif 137909209eeSmrg#include "xf86fbman.h" 13802be438aSmrg#include "xf86Cursor.h" 139909209eeSmrg#include "compat-api.h" 14002be438aSmrg 14102be438aSmrgtypedef void (*TDFXWriteIndexedByteFunc)(TDFXPtr pTDFX, int addr, 14202be438aSmrg char index, char value); 14302be438aSmrgtypedef char (*TDFXReadIndexedByteFunc)(TDFXPtr pTDFX, int addr, 14402be438aSmrg char index); 14502be438aSmrgtypedef void (*TDFXWriteWordFunc)(TDFXPtr pTDFX, int addr, int value); 14602be438aSmrgtypedef int (*TDFXReadWordFunc)(TDFXPtr pTDFX, int addr); 14702be438aSmrgtypedef void (*TDFXWriteChipIndexedByteFunc)(TDFXPtr pTDFX, int chip, 14802be438aSmrg int addr, char index, char value); 14902be438aSmrgtypedef char (*TDFXReadChipIndexedByteFunc)(TDFXPtr pTDFX, int chip, 15002be438aSmrg int addr, char index); 15102be438aSmrgtypedef void (*TDFXWriteChipWordFunc)(TDFXPtr pTDFX, int chip, 15202be438aSmrg int addr, int value); 15302be438aSmrgtypedef int (*TDFXReadChipWordFunc)(TDFXPtr pTDFX, int chip, 15402be438aSmrg int addr); 15502be438aSmrgtypedef void (*TDFXSyncFunc)(ScrnInfoPtr pScrn); 15602be438aSmrgtypedef void (*TDFXBufferFunc)(TDFXPtr pTDFX, int which); 15702be438aSmrg#if X_BYTE_ORDER == X_BIG_ENDIAN 15802be438aSmrgtypedef void (*TDFXWriteFifoFunc)(TDFXPtr pTDFX, int val); 15902be438aSmrg#endif 16002be438aSmrg 16102be438aSmrg 16202be438aSmrgtypedef struct { 16302be438aSmrg unsigned int vidcfg; 16402be438aSmrg unsigned int vidpll; 16502be438aSmrg unsigned int dacmode; 16602be438aSmrg unsigned int vgainit0; 16702be438aSmrg unsigned int vgainit1; 16802be438aSmrg unsigned int miscinit0; 16902be438aSmrg unsigned int miscinit1; 17002be438aSmrg unsigned int screensize; 17102be438aSmrg unsigned int stride; 17202be438aSmrg unsigned int cursloc; 17302be438aSmrg unsigned int startaddr; 17402be438aSmrg unsigned int clip0min; 17502be438aSmrg unsigned int clip0max; 17602be438aSmrg unsigned int clip1min; 17702be438aSmrg unsigned int clip1max; 17802be438aSmrg unsigned int srcbaseaddr; 17902be438aSmrg unsigned int dstbaseaddr; 18002be438aSmrg unsigned char ExtVga[2]; 18102be438aSmrg unsigned int dactable[512]; 18202be438aSmrg} TDFXRegRec, *TDFXRegPtr; 18302be438aSmrg 18402be438aSmrgtypedef struct TextureData_t { 18502be438aSmrg int contextid; 18602be438aSmrg void *data; 18702be438aSmrg struct TextureData_t *next; 18802be438aSmrg} TextureData; 18902be438aSmrg 19002be438aSmrg#define MAXCHIPS 4 19102be438aSmrg 192880ed95aSmrg#ifdef XSERVER_LIBPCIACCESS 193880ed95aSmrgenum tdfx_chips { 194880ed95aSmrg Banshee = 0, 195880ed95aSmrg Voodoo3_2000, 196880ed95aSmrg Voodoo3_3000, 197880ed95aSmrg Voodoo3_Unknown, 198880ed95aSmrg Voodoo5, 199880ed95aSmrg MAX_VOODOO_CARDS 200880ed95aSmrg}; 201880ed95aSmrg#endif 202880ed95aSmrg 20302be438aSmrgtypedef struct _TDFXRec { 204880ed95aSmrg#ifdef XSERVER_LIBPCIACCESS 205880ed95aSmrg enum tdfx_chips match_id; 206880ed95aSmrg void *MMIOBase[MAXCHIPS]; 207880ed95aSmrg void *FbBase; 208880ed95aSmrg#else 20902be438aSmrg unsigned char *MMIOBase[MAXCHIPS]; 21002be438aSmrg unsigned char *FbBase; 21102be438aSmrg unsigned char *myFbBase; 212880ed95aSmrg#endif 213909209eeSmrg unsigned long PIOBase[MAXCHIPS]; 21402be438aSmrg long FbMapSize; 21502be438aSmrg int pixelFormat; 21602be438aSmrg int stride; 21702be438aSmrg int cpp; 21802be438aSmrg int maxClip; 21902be438aSmrg int MaxClock; 22002be438aSmrg int ChipType; 221880ed95aSmrg#ifdef XSERVER_LIBPCIACCESS 222880ed95aSmrg struct pci_device *PciInfo[MAXCHIPS]; 223880ed95aSmrg#else 22402be438aSmrg pciVideoPtr PciInfo; 225880ed95aSmrg#endif 22602be438aSmrg unsigned long LinearAddr[MAXCHIPS]; 22702be438aSmrg unsigned long MMIOAddr[MAXCHIPS]; 22802be438aSmrg EntityInfoPtr pEnt; 22902be438aSmrg int numChips; 230e2463426Smrg#ifndef XSERVER_LIBPCIACCESS 23102be438aSmrg PCITAG PciTag[MAXCHIPS]; 232880ed95aSmrg#endif 23302be438aSmrg Bool Primary; 23402be438aSmrg int HasSGRAM; 23502be438aSmrg int PciCnt; 23602be438aSmrg int PrevDrawState; 23702be438aSmrg int DrawState; 23802be438aSmrg int Cmd; 23902be438aSmrg int DashedLineSize; 24002be438aSmrg BoxRec prevBlitDest; 24102be438aSmrg TDFXRegRec SavedReg; 24202be438aSmrg TDFXRegRec ModeReg; 243909209eeSmrg#ifdef HAVE_XAA_H 24402be438aSmrg XAAInfoRecPtr AccelInfoRec; 245909209eeSmrg#endif 24602be438aSmrg xf86CursorInfoPtr CursorInfoRec; 24702be438aSmrg CloseScreenProcPtr CloseScreen; 24802be438aSmrg Bool usePIO; 24902be438aSmrg Bool NoAccel; 25002be438aSmrg DGAModePtr DGAModes; 25102be438aSmrg Bool DGAactive; 25202be438aSmrg Bool initDone; 25302be438aSmrg int DGAViewportStatus; 25402be438aSmrg int cursorOffset; 25502be438aSmrg int fbOffset; 25602be438aSmrg int backOffset; 25702be438aSmrg int depthOffset; 25802be438aSmrg int texOffset; 25902be438aSmrg int texSize; 26002be438aSmrg TDFXWriteIndexedByteFunc writeControl; 26102be438aSmrg TDFXReadIndexedByteFunc readControl; 26202be438aSmrg TDFXWriteWordFunc writeLong; 26302be438aSmrg TDFXReadWordFunc readLong; 26402be438aSmrg TDFXWriteChipWordFunc writeChipLong; 26502be438aSmrg TDFXReadChipWordFunc readChipLong; 26602be438aSmrg TDFXSyncFunc sync; 26702be438aSmrg#if X_BYTE_ORDER == X_BIG_ENDIAN 26802be438aSmrg TDFXWriteFifoFunc writeFifo; 26902be438aSmrg#endif 27002be438aSmrg int syncDone; 27102be438aSmrg int scanlineWidth; 27202be438aSmrg unsigned char *scanlineColorExpandBuffers[2]; 27302be438aSmrg PROPDATA 274909209eeSmrg#ifdef TDFXDRI 27502be438aSmrg Bool directRenderingEnabled; 27602be438aSmrg DRIInfoPtr pDRIInfo; 27702be438aSmrg int drmSubFD; 27802be438aSmrg TDFXRegRec DRContextRegs; 27902be438aSmrg#endif 28002be438aSmrg /* State for video */ 28102be438aSmrg FBAreaPtr offscreenYUVBuf; 28202be438aSmrg int offscreenYUVBufWidth; 28302be438aSmrg int offscreenYUVBufHeight; 28402be438aSmrg 28502be438aSmrg /* This is a small register shadow. I'm only shadowing 28602be438aSmrg * sst2dDstFmt 28702be438aSmrg * sst2dSrcFmt 28802be438aSmrg * If a real register shadow is ever needed we should probably 28902be438aSmrg * shadow everything and make it happen automatically for every write. */ 29002be438aSmrg INT32 sst2DSrcFmtShadow; 29102be438aSmrg INT32 sst2DDstFmtShadow; 29202be438aSmrg int pixmapCacheLinesMin; 29302be438aSmrg int pixmapCacheLinesMax; 29402be438aSmrg FBAreaPtr reservedArea; 29502be438aSmrg Bool ShowCache; 29602be438aSmrg int videoKey; 29702be438aSmrg void (*VideoTimerCallback)(ScrnInfoPtr, Time); 29802be438aSmrg FBLinearPtr overlayBuffer; 29902be438aSmrg FBLinearPtr overlayBuffer2; /* for double-buffering */ 30002be438aSmrg int whichOverlayBuffer; /* flip-flop */ 30102be438aSmrg FBAreaPtr textureBuffer; 30202be438aSmrg Bool TextureXvideo; 30302be438aSmrg XF86VideoAdaptorPtr overlayAdaptor; 30402be438aSmrg XF86VideoAdaptorPtr textureAdaptor; 30502be438aSmrg ScreenBlockHandlerProcPtr BlockHandler; 30602be438aSmrg OptionInfoPtr Options; 30702be438aSmrg 30802be438aSmrg ScreenWakeupHandlerProcPtr coreWakeupHandler; 30902be438aSmrg ScreenBlockHandlerProcPtr coreBlockHandler; 31002be438aSmrg 311880ed95aSmrg I2CBusPtr pI2CBus; 312880ed95aSmrg 31302be438aSmrg} TDFXRec; 31402be438aSmrg 31502be438aSmrgtypedef struct { 31602be438aSmrg RegionRec clip; 31702be438aSmrg CARD32 colorKey; 31802be438aSmrg int filterQuality; 31902be438aSmrg CARD32 videoStatus; 32002be438aSmrg Time offTime; 32102be438aSmrg Time freeTime; 32202be438aSmrg} TDFXPortPrivRec, *TDFXPortPrivPtr; 32302be438aSmrg 32402be438aSmrgtypedef struct { 32502be438aSmrg PROPSAREADATA 32602be438aSmrg int fifoOwner; 32702be438aSmrg int CtxOwner; 32802be438aSmrg int TexOwner; 32902be438aSmrg} TDFXSAREAPriv; 33002be438aSmrg 33102be438aSmrg#define TDFXPTR(p) ((TDFXPtr)((p)->driverPrivate)) 33202be438aSmrg 33302be438aSmrg#define DRAW_STATE_CLIPPING 0x1 33402be438aSmrg#define DRAW_STATE_TRANSPARENT 0x2 33502be438aSmrg#define DRAW_STATE_CLIP1CHANGED 0x4 33602be438aSmrg 33702be438aSmrg#define TDFX_FRONT 0 33802be438aSmrg#define TDFX_BACK 1 33902be438aSmrg#define TDFX_DEPTH 2 34002be438aSmrg 34102be438aSmrg#define TDFX2XCUTOFF 135000 34202be438aSmrg 34302be438aSmrgextern Bool TDFXAccelInit(ScreenPtr pScreen); 34402be438aSmrgextern Bool TDFXCursorInit(ScreenPtr pScreen); 34502be438aSmrgextern void TDFXSync(ScrnInfoPtr pScrn); 34602be438aSmrgextern Bool TDFXDRIScreenInit(ScreenPtr pScreen); 34702be438aSmrgextern void TDFXDRICloseScreen(ScreenPtr pScreen); 34802be438aSmrgextern Bool TDFXDRIFinishScreenInit(ScreenPtr pScreen); 34902be438aSmrgextern Bool TDFXDGAInit(ScreenPtr pScreen); 35002be438aSmrgextern void TDFXCursorGrabMemory(ScreenPtr pScreen); 35102be438aSmrgextern void TDFXSetLFBConfig(TDFXPtr pTDFX); 35202be438aSmrgextern void TDFXSendNOPFifo(ScrnInfoPtr pScrn); 35302be438aSmrg 354909209eeSmrgextern Bool TDFXSwitchMode(SWITCH_MODE_ARGS_DECL); 355909209eeSmrgextern void TDFXAdjustFrame(ADJUST_FRAME_ARGS_DECL); 35602be438aSmrg 35702be438aSmrgextern void TDFXSetPIOAccess(TDFXPtr pTDFX); 35802be438aSmrgextern void TDFXSetMMIOAccess(TDFXPtr pTDFX); 35902be438aSmrgextern void TDFXWriteLongMMIO(TDFXPtr pTDFX, int addr, int val); 36002be438aSmrgextern int TDFXReadLongMMIO(TDFXPtr pTDFX, int addr); 36102be438aSmrgextern void TDFXWriteChipLongMMIO(TDFXPtr pTDFX, int chip, int addr, int val); 36202be438aSmrg 36302be438aSmrgextern void TDFXNeedSync(ScrnInfoPtr pScrn); 36402be438aSmrgextern void TDFXCheckSync(ScrnInfoPtr pScrn); 36502be438aSmrgextern void TDFXFirstSync(ScrnInfoPtr pScrn); 36602be438aSmrg 36702be438aSmrgextern void TDFXSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, 36802be438aSmrg int ydir, int rop, 36902be438aSmrg unsigned int planemask, 37002be438aSmrg int trans_color); 37102be438aSmrgextern void TDFXSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int srcX, 37202be438aSmrg int srcY, int dstX, int dstY, 37302be438aSmrg int w, int h); 37402be438aSmrgextern void TDFXSetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop, 37502be438aSmrg unsigned int planemask); 37602be438aSmrgextern void TDFXSubsequentSolidFillRect(ScrnInfoPtr pScrn, int x, int y, 37702be438aSmrg int w, int h); 37802be438aSmrg 37902be438aSmrgextern void TDFXSelectBuffer(TDFXPtr pTDFX, int which); 38002be438aSmrg 38102be438aSmrgextern void TDFXInitVideo(ScreenPtr pScreen); 38202be438aSmrgextern void TDFXCloseVideo(ScreenPtr pScreen); 38302be438aSmrg 38402be438aSmrg#endif 385