#ifndef MGA_H
#define MGA_H
#include "compiler.h"
#include "xaa.h"
#include "xf86Cursor.h"
#include "vgaHW.h"
#include "colormapst.h"
#include "xf86DDC.h"
#include "xf86xv.h"
#ifdef XF86DRI
#include "xf86drm.h"
#define _XF86DRI_SERVER_
#include "mga_dripriv.h"
#include "dri.h"
#include "GL/glxint.h"
#include "xf86dri.h"
#include "dri.h"
#include "GL/glxint.h"
#include "mga_dri.h"
#endif
#ifdef USEMGAHAL
#include "client.h"
#endif
#include "mga_bios.h"
typedef enum {
OPTION_SW_CURSOR,
OPTION_HW_CURSOR,
OPTION_PCI_RETRY,
OPTION_SYNC_ON_GREEN,
OPTION_NOACCEL,
OPTION_SHOWCACHE,
OPTION_OVERLAY,
OPTION_MGA_SDRAM,
OPTION_SHADOW_FB,
OPTION_FBDEV,
OPTION_COLOR_KEY,
OPTION_SET_MCLK,
OPTION_OVERCLOCK_MEM,
OPTION_VIDEO_KEY,
OPTION_ROTATE,
OPTION_TEXTURED_VIDEO,
OPTION_CRTC2HALF,
OPTION_CRTC2RAM,
OPTION_INT10,
OPTION_AGP_MODE,
OPTION_AGP_SIZE,
OPTION_DIGITAL1,
OPTION_DIGITAL2,
OPTION_TV,
OPTION_TVSTANDARD,
OPTION_CABLETYPE,
OPTION_USEIRQZERO,
OPTION_NOHAL,
OPTION_SWAPPED_HEAD,
OPTION_DRI,
OPTION_MERGEDFB,
OPTION_HSYNC2,
OPTION_VREFRESH2,
OPTION_MONITOR2POS,
OPTION_METAMODES
} MGAOpts;
#if !defined(EXTRADEBUG)
#define INREG8(addr) MMIO_IN8(pMga->IOBase, addr)
#define INREG16(addr) MMIO_IN16(pMga->IOBase, addr)
#define INREG(addr) MMIO_IN32(pMga->IOBase, addr)
#define OUTREG8(addr, val) MMIO_OUT8(pMga->IOBase, addr, val)
#define OUTREG16(addr, val) MMIO_OUT16(pMga->IOBase, addr, val)
#define OUTREG(addr, val) MMIO_OUT32(pMga->IOBase, addr, val)
#else
CARD8 MGAdbg_inreg8(ScrnInfoPtr, int, int, char*);
CARD16 MGAdbg_inreg16(ScrnInfoPtr, int, int, char*);
CARD32 MGAdbg_inreg32(ScrnInfoPtr, int, int, char*);
void MGAdbg_outreg8(ScrnInfoPtr, int, int, char*);
void MGAdbg_outreg16(ScrnInfoPtr, int,int, char*);
void MGAdbg_outreg32(ScrnInfoPtr, int,int, char*);
#ifndef __GNUC__
# define MGA_STRINGIZE(x) #x
# define MGA_STRINGIFY(x) MGA_STRINGIZE(x)
# define __FUNCTION__ MGA_STRINGIFY(__FILE__) ", line " MGA_STRINGIFY(__LINE__)
#endif
#define INREG8(addr) MGAdbg_inreg8(pScrn, addr, 1, __FUNCTION__)
#define INREG16(addr) MGAdbg_inreg16(pScrn, addr, 1, __FUNCTION__)
#define INREG(addr) MGAdbg_inreg32(pScrn, addr, 1, __FUNCTION__)
#define OUTREG8(addr,val) MGAdbg_outreg8(pScrn, addr, val, __FUNCTION__)
#define OUTREG16(addr,val) MGAdbg_outreg16(pScrn, addr, val, __FUNCTION__)
#define OUTREG(addr,val) MGAdbg_outreg32(pScrn, addr, val, __FUNCTION__)
#endif
#define inMGAdreg(reg) INREG8(RAMDAC_OFFSET + (reg))
#define outMGAdreg(reg, val) OUTREG8(RAMDAC_OFFSET + (reg), val)
#define inMGAdac(reg) \
(outMGAdreg(MGA1064_INDEX, reg), inMGAdreg(MGA1064_DATA))
#define outMGAdac(reg, val) \
(outMGAdreg(MGA1064_INDEX, reg), outMGAdreg(MGA1064_DATA, val))
#define outMGAdacmsk(reg, mask, val) \
do { \
unsigned char tmp = (mask) ? (inMGAdac(reg) & (mask)) : 0; \
outMGAdreg(MGA1064_INDEX, reg); \
outMGAdreg(MGA1064_DATA, tmp | (val)); \
} while (0)
#define PORT_OFFSET (0x1F00 - 0x300)
#define MGA_VERSION 4000
#define MGA_NAME "MGA"
#define MGA_C_NAME MGA
#define MGA_MODULE_DATA mgaModuleData
#define MGA_DRIVER_NAME "mga"
#define MGA_MAJOR_VERSION 1
#define MGA_MINOR_VERSION 1
#define MGA_PATCHLEVEL 1
typedef struct {
unsigned char ExtVga[6];
unsigned char DacClk[6];
unsigned char * DacRegs;
unsigned long crtc2[0x58];
unsigned char dac2[0x21];
CARD32 Option;
CARD32 Option2;
CARD32 Option3;
long Clock;
Bool PIXPLLCSaved;
} MGARegRec, *MGARegPtr;
typedef struct {
CARD32 ulDispWidth;
CARD32 ulDispHeight;
CARD32 ulBpp;
CARD32 ulPixClock;
CARD32 ulHFPorch;
CARD32 ulHSync;
CARD32 ulHBPorch;
CARD32 ulVFPorch;
CARD32 ulVSync;
CARD32 ulVBPorch;
CARD32 ulFBPitch;
CARD32 flSignalMode;
} xMODEINFO;
typedef struct {
int brightness;
int contrast;
Bool doubleBuffer;
unsigned char currentBuffer;
FBLinearPtr linear;
RegionRec clip;
CARD32 colorKey;
CARD32 videoStatus;
Time offTime;
Time freeTime;
int lastPort;
} MGAPortPrivRec, *MGAPortPrivPtr;
typedef struct {
Bool isHwCursor;
int CursorMaxWidth;
int CursorMaxHeight;
int CursorFlags;
int CursorOffscreenMemSize;
Bool (*UseHWCursor)(ScreenPtr, CursorPtr);
void (*LoadCursorImage)(ScrnInfoPtr, unsigned char*);
void (*ShowCursor)(ScrnInfoPtr);
void (*HideCursor)(ScrnInfoPtr);
void (*SetCursorPosition)(ScrnInfoPtr, int, int);
void (*SetCursorColors)(ScrnInfoPtr, int, int);
long maxPixelClock;
long MemoryClock;
MessageType ClockFrom;
MessageType MemClkFrom;
Bool SetMemClk;
void (*LoadPalette)(ScrnInfoPtr, int, int*, LOCO*, VisualPtr);
void (*RestorePalette)(ScrnInfoPtr, unsigned char *);
void (*PreInit)(ScrnInfoPtr);
void (*Save)(ScrnInfoPtr, vgaRegPtr, MGARegPtr, Bool);
void (*Restore)(ScrnInfoPtr, vgaRegPtr, MGARegPtr, Bool);
Bool (*ModeInit)(ScrnInfoPtr, DisplayModePtr);
} MGARamdacRec, *MGARamdacPtr;
typedef struct {
int bitsPerPixel;
int depth;
int displayWidth;
rgb weight;
Bool Overlay8Plus24;
DisplayModePtr mode;
} MGAFBLayout;
typedef struct {
Bool update;
unsigned char red;
unsigned char green;
unsigned char blue;
} MGAPaletteInfo;
#define MGAPTR(p) ((MGAPtr)((p)->driverPrivate))
#define ISDIGITAL1(p) (p->pMgaHwInfo && ((p->pMgaHwInfo->ulCapsFirstOutput) & MGAHWINFOCAPS_OUTPUT_DIGITAL))
#define ISDIGITAL2(p) (p->pMgaHwInfo && ((p->pMgaHwInfo->ulCapsSecondOutput) & MGAHWINFOCAPS_OUTPUT_DIGITAL))
#define ISTV1(p) (p->pMgaHwInfo && ((p->pMgaHwInfo->ulCapsFirstOutput) & MGAHWINFOCAPS_OUTPUT_TV))
#define ISTV2(p) (p->pMgaHwInfo && ((p->pMgaHwInfo->ulCapsSecondOutput) & MGAHWINFOCAPS_OUTPUT_TV))
#ifdef DISABLE_VGA_IO
typedef struct mgaSave {
pciVideoPtr pvp;
Bool enable;
} MgaSave, *MgaSavePtr;
#endif
typedef enum {
mgaLeftOf,
mgaRightOf,
mgaAbove,
mgaBelow,
mgaClone
} MgaScrn2Rel;
typedef struct {
int lastInstance;
#ifdef USEMGAHAL
LPCLIENTDATA pClientStruct;
LPBOARDHANDLE pBoard;
LPMGAHWINFO pMgaHwInfo;
#endif
int refCount;
CARD32 masterFbAddress;
long masterFbMapSize;
CARD32 slaveFbAddress;
long slaveFbMapSize;
int mastervideoRam;
int slavevideoRam;
Bool directRenderingEnabled;
ScrnInfoPtr pScrn_1;
ScrnInfoPtr pScrn_2;
} MGAEntRec, *MGAEntPtr;
typedef struct {
#ifdef USEMGAHAL
LPCLIENTDATA pClientStruct;
LPBOARDHANDLE pBoard;
LPMGAMODEINFO pMgaModeInfo;
LPMGAHWINFO pMgaHwInfo;
#endif
EntityInfoPtr pEnt;
MGABiosInfo Bios;
MGABios2Info Bios2;
CARD8 BiosOutputMode;
pciVideoPtr PciInfo;
PCITAG PciTag;
xf86AccessRec Access;
int Chipset;
int ChipRev;
Bool Primary;
Bool Interleave;
int HwBpp;
int Roundings[4];
int BppShifts[4];
Bool HasFBitBlt;
Bool OverclockMem;
int YDstOrg;
int DstOrg;
int SrcOrg;
unsigned long IOAddress;
unsigned long FbAddress;
unsigned long ILOADAddress;
int FbBaseReg;
unsigned long BiosAddress;
MessageType BiosFrom;
unsigned char * IOBase;
unsigned char * FbBase;
unsigned char * ILOADBase;
unsigned char * FbStart;
long FbMapSize;
long FbUsableSize;
long FbCursorOffset;
MGARamdacRec Dac;
Bool HasSDRAM;
Bool NoAccel;
Bool SyncOnGreen;
Bool Dac6Bit;
Bool HWCursor;
Bool UsePCIRetry;
Bool ShowCache;
Bool Overlay8Plus24;
Bool ShadowFB;
unsigned char * ShadowPtr;
int ShadowPitch;
int MemClk;
int MinClock;
int MaxClock;
MGARegRec SavedReg;
MGARegRec ModeReg;
int MaxFastBlitY;
CARD32 BltScanDirection;
CARD32 FilledRectCMD;
CARD32 SolidLineCMD;
CARD32 PatternRectCMD;
CARD32 DashCMD;
CARD32 NiceDashCMD;
CARD32 AccelFlags;
CARD32 PlaneMask;
CARD32 FgColor;
CARD32 BgColor;
CARD32 MAccess;
int FifoSize;
int StyleLen;
XAAInfoRecPtr AccelInfoRec;
xf86CursorInfoPtr CursorInfoRec;
DGAModePtr DGAModes;
int numDGAModes;
Bool DGAactive;
int DGAViewportStatus;
CARD32 *Atype;
CARD32 *AtypeNoBLK;
void (*PreInit)(ScrnInfoPtr pScrn);
void (*Save)(ScrnInfoPtr, vgaRegPtr, MGARegPtr, Bool);
void (*Restore)(ScrnInfoPtr, vgaRegPtr, MGARegPtr, Bool);
Bool (*ModeInit)(ScrnInfoPtr, DisplayModePtr);
void (*PointerMoved)(int index, int x, int y);
CloseScreenProcPtr CloseScreen;
ScreenBlockHandlerProcPtr BlockHandler;
unsigned int (*ddc1Read)(ScrnInfoPtr);
void (*DDC1SetSpeed)(ScrnInfoPtr, xf86ddcSpeed);
Bool (*i2cInit)(ScrnInfoPtr);
I2CBusPtr I2C;
Bool FBDev;
int colorKey;
int videoKey;
int fifoCount;
int Rotate;
MGAFBLayout CurrentLayout;
Bool DrawTransparent;
int MaxBlitDWORDS;
Bool TexturedVideo;
MGAPortPrivPtr portPrivate;
unsigned char *ScratchBuffer;
unsigned char *ColorExpandBase;
int expandRows;
int expandDWORDs;
int expandRemaining;
int expandHeight;
int expandY;
#ifdef XF86DRI
Bool directRenderingEnabled;
DRIInfoPtr pDRIInfo;
int drmFD;
int numVisualConfigs;
__GLXvisualConfig* pVisualConfigs;
MGAConfigPrivPtr pVisualConfigsPriv;
MGADRIServerPrivatePtr DRIServerInfo;
MGARegRec DRContextRegs;
Bool haveQuiescense;
void (*GetQuiescence)(ScrnInfoPtr pScrn);
int agpMode;
int agpSize;
int irq;
CARD32 reg_ien;
#endif
XF86VideoAdaptorPtr adaptor;
Bool DualHeadEnabled;
Bool SecondCrtc;
Bool SecondOutput;
GDevPtr device;
int realSrcOrg;
MGAEntPtr entityPrivate;
void (*SetupForSolidFill)(ScrnInfoPtr pScrn, int color,
int rop, unsigned int planemask);
void (*SubsequentSolidFillRect)(ScrnInfoPtr pScrn,
int x, int y, int w, int h);
void (*RestoreAccelState)(ScrnInfoPtr pScrn);
int allowedWidth;
void (*VideoTimerCallback)(ScrnInfoPtr, Time);
void (*PaletteLoadCallback)(ScrnInfoPtr);
void (*RenderCallback)(ScrnInfoPtr);
Time RenderTime;
MGAPaletteInfo palinfo[256];
FBLinearPtr LinearScratch;
Bool softbooted;
#ifdef USEMGAHAL
Bool HALLoaded;
#endif
OptionInfoPtr Options;
Bool MergedFB;
DisplayModePtr M1modes;
DisplayModePtr M1currentMode;
int M1frameX0;
int M1frameY0;
int M1frameX1;
int M1frameY1;
ScrnInfoPtr pScrn2;
int HALGranularityOffX, HALGranularityOffY;
} MGARec, *MGAPtr;
extern CARD32 MGAAtype[16];
extern CARD32 MGAAtypeNoBLK[16];
#define USE_RECTS_FOR_LINES 0x00000001
#define FASTBLT_BUG 0x00000002
#define CLIPPER_ON 0x00000004
#define BLK_OPAQUE_EXPANSION 0x00000008
#define TRANSC_SOLID_FILL 0x00000010
#define NICE_DASH_PATTERN 0x00000020
#define TWO_PASS_COLOR_EXPAND 0x00000040
#define MGA_NO_PLANEMASK 0x00000080
#define USE_LINEAR_EXPANSION 0x00000100
#define LARGE_ADDRESSES 0x00000200
#define MGAIOMAPSIZE 0x00004000
#define MGAILOADMAPSIZE 0x00400000
#define TRANSPARENCY_KEY 255
#define KEY_COLOR 0
void MGAAdjustFrame(int scrnIndex, int x, int y, int flags);
Bool MGASwitchMode(int scrnIndex, DisplayModePtr mode, int flags);
void MGAFillModeInfoStruct(ScrnInfoPtr pScrn, DisplayModePtr mode);
Bool MGAGetRec(ScrnInfoPtr pScrn);
void MGAProbeDDC(ScrnInfoPtr pScrn, int index);
void MGASoftReset(ScrnInfoPtr pScrn);
void MGAFreeRec(ScrnInfoPtr pScrn);
void MGAReadBios(ScrnInfoPtr pScrn);
void MGADisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode,
int flags);
void MGAAdjustFrameCrtc2(int scrnIndex, int x, int y, int flags);
void MGADisplayPowerManagementSetCrtc2(ScrnInfoPtr pScrn,
int PowerManagementMode,
int flags);
void MGAAdjustGranularity(ScrnInfoPtr pScrn, int* x, int* y);
void MGA2064SetupFuncs(ScrnInfoPtr pScrn);
void MGAGSetupFuncs(ScrnInfoPtr pScrn);
void MGAStormSync(ScrnInfoPtr pScrn);
void MGAStormEngineInit(ScrnInfoPtr pScrn);
Bool MGAStormAccelInit(ScreenPtr pScreen);
Bool MGAHWCursorInit(ScreenPtr pScreen);
Bool Mga8AccelInit(ScreenPtr pScreen);
Bool Mga16AccelInit(ScreenPtr pScreen);
Bool Mga24AccelInit(ScreenPtr pScreen);
Bool Mga32AccelInit(ScreenPtr pScreen);
void Mga8InitSolidFillRectFuncs(MGAPtr pMga);
void Mga16InitSolidFillRectFuncs(MGAPtr pMga);
void Mga24InitSolidFillRectFuncs(MGAPtr pMga);
void Mga32InitSolidFillRectFuncs(MGAPtr pMga);
void MGAPolyArcThinSolid(DrawablePtr, GCPtr, int, xArc*);
Bool MGADGAInit(ScreenPtr pScreen);
void MGARefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
void MGARefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
void MGARefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
void MGARefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
void MGARefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
void Mga8SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir,
int ydir, int rop, unsigned int planemask,
int trans);
void Mga16SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir,
int ydir, int rop, unsigned int planemask,
int trans);
void Mga24SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir,
int ydir, int rop, unsigned int planemask,
int trans);
void Mga32SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir,
int ydir, int rop, unsigned int planemask,
int trans);
void Mga8SetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop,
unsigned int planemask);
void Mga16SetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop,
unsigned int planemask);
void Mga24SetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop,
unsigned int planemask);
void Mga32SetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop,
unsigned int planemask);
void MGAPointerMoved(int index, int x, int y);
void MGAInitVideo(ScreenPtr pScreen);
void MGAResetVideo(ScrnInfoPtr pScrn);
#ifdef XF86DRI
#define MGA_FRONT 0x1
#define MGA_BACK 0x2
#define MGA_DEPTH 0x4
Bool MGADRIScreenInit( ScreenPtr pScreen );
void MGADRICloseScreen( ScreenPtr pScreen );
Bool MGADRIFinishScreenInit( ScreenPtr pScreen );
Bool MGALockUpdate( ScrnInfoPtr pScrn, drmLockFlags flags );
void MGAGetQuiescence( ScrnInfoPtr pScrn );
void MGAGetQuiescenceShared( ScrnInfoPtr pScrn );
void MGASelectBuffer(ScrnInfoPtr pScrn, int which);
Bool MgaCleanupDma(ScrnInfoPtr pScrn);
Bool MgaInitDma(ScrnInfoPtr pScrn, int prim_size);
#define MGA_AGP_1X_MODE 0x01
#define MGA_AGP_2X_MODE 0x02
#define MGA_AGP_4X_MODE 0x04
#define MGA_AGP_MODE_MASK 0x07
#endif
void MGACRTC2Set(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo);
void MGAEnableSecondOutPut(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo);
void MGACRTC2SetPitch(ScrnInfoPtr pSrcn, xMODEINFO *pModeInfo);
void MGACRTC2SetDisplayStart(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo, CARD32 base, CARD32 ulX, CARD32 ulY);
void MGACRTC2Get(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo);
void MGACRTC2GetPitch(ScrnInfoPtr pSrcn, xMODEINFO *pModeInfo);
void MGACRTC2GetDisplayStart(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo, CARD32 base, CARD32 ulX, CARD32 ulY);
double MGAG450SetPLLFreq(ScrnInfoPtr pScrn, long f_out);
#ifdef DEBUG
void MGAG450PrintPLL(ScrnInfoPtr pScrn);
#endif
long MGAG450SavePLLFreq(ScrnInfoPtr pScrn);
void MGAprintDac(ScrnInfoPtr pScrn);
#ifdef USEMGAHAL
typedef struct {
char *function;
void (*funcptr)(ScrnInfoPtr pScrn, unsigned long *param, char *out, DisplayModePtr pMode);
} MGAEscFuncRec, *MGAEscFuncPtr;
typedef struct {
char function[32];
unsigned long parameters[32];
} EscCmdStruct;
extern LPMGAMODEINFO pMgaModeInfo[2];
extern MGAMODEINFO TmpMgaModeInfo[2];
extern void MGAExecuteEscCmd(ScrnInfoPtr pScrn, char *cmdline , char *sResult, DisplayModePtr pMode);
void MGAFillDisplayModeStruct(DisplayModePtr pMode, LPMGAMODEINFO pModeInfo);
#endif
#endif