#ifndef _SMI_H
#define _SMI_H
#define USE_FB
#include "xf86.h"
#include "xf86_OSproc.h"
#include "xf86_ansic.h"
#include "xf86PciInfo.h"
#include "xf86Pci.h"
#include "xf86Cursor.h"
#include "vgaHW.h"
#include "compiler.h"
#include "mipointer.h"
#include "micmap.h"
#ifdef USE_FB
#include "fb.h"
#else
#define PSZ 8
#include "cfb.h"
#undef PSZ
#include "cfb16.h"
#include "cfb24.h"
#endif
#include "xaa.h"
#include "xf86cmap.h"
#include "xf86i2c.h"
#include "xf86int10.h"
#include "vbe.h"
#include "xf86xv.h"
#include "Xv.h"
#ifndef SMI_DEBUG
# define SMI_DEBUG 0
#endif
#define SMI_USE_IMAGE_WRITES 0
#define SMI_USE_VIDEO 1
#define SMI_USE_CAPTURE 1
typedef struct
{
Bool modeInit;
CARD16 mode;
CARD8 SR17, SR18, SR21, SR31, SR32, SR6A, SR6B, SR81, SRA0;
CARD8 CR33, CR33_2, CR3A;
CARD8 CR40[14], CR40_2[14];
CARD8 CR90[16], CR9F_2;
CARD8 CRA0[14];
CARD8 smiDACMask, smiDacRegs[256][3];
CARD8 CCR66;
CARD8 smiFont[8192];
CARD32 DPR10, DPR1C, DPR20, DPR24, DPR28, DPR2C, DPR30, DPR3C, DPR40,
DPR44;
CARD32 VPR00, VPR0C, VPR10;
CARD32 CPR00;
CARD32 FPR00_, FPR0C_, FPR10_;
} SMIRegRec, *SMIRegPtr;
typedef struct
{
CARD32 AccelCmd;
CARD32 Stride;
CARD32 ScissorsLeft;
CARD32 ScissorsRight;
Bool ClipTurnedOn;
CARD8 SR18Value;
CARD8 SR21Value;
SMIRegRec SavedReg;
SMIRegRec ModeReg;
xf86CursorInfoPtr CursorInfoRec;
Bool ModeStructInit;
int vgaCRIndex, vgaCRReg;
int width, height;
int Bpp;
int videoRAMBytes;
int videoRAMKBytes;
unsigned char * MapBase;
int MapSize;
CARD8 * DPRBase;
CARD8 * VPRBase;
CARD8 * CPRBase;
CARD8 * FPRBase;
CARD8 * DataPortBase;
int DataPortSize;
CARD8 * IOBase;
IOADDRESS PIOBase;
unsigned char * FBBase;
CARD32 FBOffset;
CARD32 FBCursorOffset;
CARD32 FBReserved;
Bool PrimaryVidMapped;
int dacSpeedBpp;
int minClock;
int maxClock;
int MCLK;
int GEResetCnt;
Bool pci_burst;
Bool NoPCIRetry;
Bool fifo_conservative;
Bool fifo_moderate;
Bool fifo_aggressive;
Bool NoAccel;
Bool hwcursor;
Bool ShowCache;
Bool useBIOS;
Bool zoomOnLCD;
CloseScreenProcPtr CloseScreen;
XAAInfoRecPtr AccelInfoRec;
pciVideoPtr PciInfo;
PCITAG PciTag;
int Chipset;
int ChipRev;
DGAModePtr DGAModes;
int numDGAModes;
Bool DGAactive;
int DGAViewportStatus;
int CurrentDPMS;
unsigned char DPMS_SR20;
unsigned char DPMS_SR21;
unsigned char DPMS_SR31;
unsigned char DPMS_SR34;
Bool lcd;
int lcdWidth;
int lcdHeight;
I2CBusPtr I2C;
xf86Int10InfoPtr pInt10;
Bool shadowFB;
int rotate;
int ShadowPitch;
int ShadowWidthBytes;
int ShadowWidth;
int ShadowHeight;
CARD32 saveBufferSize;
void * pSaveBuffer;
CARD32 savedFBOffset;
CARD32 savedFBReserved;
CARD8 * paletteBuffer;
ValidateGCProcPtr ValidatePolylines;
Bool polyLines;
void (*PointerMoved)(int index, int x, int y);
int videoKey;
Bool ByteSwap;
Bool interlaced;
XF86VideoAdaptorPtr ptrAdaptor;
void (*BlockHandler)(int i, pointer blockData, pointer pTimeout,
pointer pReadMask);
GCPtr videoGC;
OptionInfoPtr Options;
CARD8 DACmask;
} SMIRec, *SMIPtr;
#define SMIPTR(p) ((SMIPtr)((p)->driverPrivate))
#if SMI_DEBUG
# define VERBLEV 1
# define ENTER_PROC(PROCNAME) xf86ErrorFVerb(VERBLEV, "ENTER\t" PROCNAME \
"(%d)\n", __LINE__); xf86Break1()
# define DEBUG_PROC(PROCNAME) xf86ErrorFVerb(VERBLEV, "DEBUG\t" PROCNAME \
"(%d)\n", __LINE__); xf86Break2()
# define LEAVE_PROC(PROCNAME) xf86ErrorFVerb(VERBLEV, "LEAVE\t" PROCNAME \
"(%d)\n", __LINE__); xf86Break1()
# define DEBUG(arg) xf86ErrorFVerb arg
#else
# define VERBLEV 4
# define ENTER_PROC(PROCNAME)
# define DEBUG_PROC(PROCNAME)
# define LEAVE_PROC(PROCNAME)
# define DEBUG(arg)
#endif
#include "regsmi.h"
#if !defined (MetroLink) && !defined (VertDebug)
#define VerticalRetraceWait() \
do \
{ \
if (VGAIN8_INDEX(pSmi, vgaCRIndex, vgaCRData, 0x17) & 0x80) \
{ \
while ((VGAIN8(pSmi, vgaIOBase + 0x0A) & 0x08) == 0x00); \
while ((VGAIN8(pSmi, vgaIOBase + 0x0A) & 0x08) == 0x08); \
while ((VGAIN8(pSmi, vgaIOBase + 0x0A) & 0x08) == 0x00); \
} \
} while (0)
#else
#define SPIN_LIMIT 1000000
#define VerticalRetraceWait() \
do \
{ \
if (VGAIN8_INDEX(pSmi, vgaCRIndex, vgaCRData, 0x17) & 0x80) \
{ \
volatile unsigned long _spin_me; \
for (_spin_me = SPIN_LIMIT; \
((VGAIN8(pSmi, vgaIOBase + 0x0A) & 0x08) == 0x00) && \
_spin_me; \
_spin_me--); \
if (!_spin_me) \
ErrorF("smi: warning: VerticalRetraceWait timed out.\n"); \
for (_spin_me = SPIN_LIMIT; \
((VGAIN8(pSmi, vgaIOBase + 0x0A) & 0x08) == 0x08) && \
_spin_me; \
_spin_me--); \
if (!_spin_me) \
ErrorF("smi: warning: VerticalRetraceWait timed out.\n"); \
for (_spin_me = SPIN_LIMIT; \
((VGAIN8(pSmi, vgaIOBase + 0x0A) & 0x08) == 0x00) && \
_spin_me; \
_spin_me--); \
if (!_spin_me) \
ErrorF("smi: warning: VerticalRetraceWait timed out.\n"); \
} \
} while (0)
#endif
void SMI_CommonCalcClock(int scrnIndex, long freq, int min_m, int min_n1,
int max_n1, int min_n2, int max_n2, long freq_min,
long freq_max, unsigned char * mdiv,
unsigned char * ndiv);
Bool SMI_I2CInit(ScrnInfoPtr pScrn);
Bool SMI_AccelInit(ScreenPtr pScrn);
void SMI_AccelSync(ScrnInfoPtr pScrn);
void SMI_GEReset(ScrnInfoPtr pScrn, int from_timeout, int line, char *file);
void SMI_EngineReset(ScrnInfoPtr);
Bool SMI_HWCursorInit(ScreenPtr pScrn);
void SMI_AdjustFrame(int scrnIndex, int x, int y, int flags);
Bool SMI_SwitchMode(int scrnIndex, DisplayModePtr mode, int flags);
Bool SMI_DGAInit(ScreenPtr pScrn);
void SMI_PointerMoved(int index, int x, int y);
void SMI_RefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
void SMI_RefreshArea730(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
void SMI_InitVideo(ScreenPtr pScreen);
#endif