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