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