#ifndef _S3V_H
#define _S3V_H
#include "xf86.h"
#include "xf86_OSproc.h"
#include "xf86_ansic.h"
#include "compiler.h"
#include "xf86PciInfo.h"
#include "xf86Pci.h"
#include "xf86Cursor.h"
#include "vgaHW.h"
#include "s3v_macros.h"
#include "mipointer.h"
#include "micmap.h"
#define PSZ 8
#include "cfb.h"
#undef PSZ
#include "cfb16.h"
#include "cfb24.h"
#include "cfb32.h"
#include "cfb24_32.h"
#include "fb.h"
#include "xaa.h"
#include "xaalocal.h"
#include "xf86cmap.h"
#include "xf86i2c.h"
#include "vbe.h"
#include "xf86xv.h"
#include "Xv.h"
#include "fourcc.h"
#ifndef _S3V_VGAHWMMIO_H
#define _S3V_VGAHWMMIO_H
#define VGAIN8(addr) MMIO_IN8(ps3v->MapBase,(S3V_MMIO_REGSIZE + (addr)))
#define VGAIN16(addr) MMIO_IN16(ps3v->MapBase,(S3V_MMIO_REGSIZE + (addr)))
#define VGAIN(addr) MMIO_IN32(ps3v->MapBase,(S3V_MMIO_REGSIZE + (addr)))
#define VGAOUT8(addr,val) MMIO_OUT8(ps3v->MapBase,(S3V_MMIO_REGSIZE + (addr)),\
val)
#define VGAOUT16(addr,val) MMIO_OUT16(ps3v->MapBase,\
(S3V_MMIO_REGSIZE + (addr)), val)
#define VGAOUT(addr, val) MMIO_OUT32(ps3v->MapBase,\
(S3V_MMIO_REGSIZE + (addr)), val)
#define INREG(addr) MMIO_IN32(ps3v->MapBase, addr)
#define OUTREG(addr, val) MMIO_OUT32(ps3v->MapBase, addr, val)
#define NEW_INREG(addr) MMIO_IN32(s3vMmioMem, addr)
#define NEW_OUTREG(addr, val) MMIO_OUT32(s3vMmioMem, addr, val)
#endif
Bool S3V_I2CInit(ScrnInfoPtr pScrn);
void S3VGEReset(ScrnInfoPtr pScrn, int from_timeout, int line, char *file);
#include "newmmio.h"
#include "regs3v.h"
typedef struct {
unsigned char SR08, SR0A, SR0F;
unsigned char SR10, SR11, SR12, SR13, SR15, SR18;
unsigned char SR29;
unsigned char SR54, SR55, SR56, SR57;
unsigned char Clock;
unsigned char s3DacRegs[0x101];
unsigned char CR31, CR33, CR34, CR36, CR3A, CR3B, CR3C;
unsigned char CR40, CR41, CR42, CR43, CR45;
unsigned char CR51, CR53, CR54, CR55, CR58, CR5D, CR5E;
unsigned char CR63, CR65, CR66, CR67, CR68, CR69, CR6D;
unsigned char CR7B, CR7D;
unsigned char CR85, CR86, CR87;
unsigned char CR90, CR91, CR92, CR93;
unsigned char ColorStack[8];
unsigned int STREAMS[22];
unsigned int MMPR0, MMPR1, MMPR2, MMPR3;
} S3VRegRec, *S3VRegPtr;
typedef struct {
unsigned char brightness;
unsigned char contrast;
FBAreaPtr area;
RegionRec clip;
CARD32 colorKey;
CARD32 videoStatus;
Time offTime;
Time freeTime;
int lastPort;
} S3VPortPrivRec, *S3VPortPrivPtr;
typedef struct tagS3VRec {
CARD32 AccelFlags;
CARD32 AccelCmd;
CARD32 SrcBaseY, DestBaseY;
CARD32 Stride;
CARD32 CommonCmd;
CARD32 FullPlaneMask;
GCPtr CurrentGC;
DrawablePtr CurrentDrawable;
XF86VideoAdaptorPtr adaptor;
S3VPortPrivPtr portPrivate;
S3VRegRec SavedReg;
S3VRegRec ModeReg;
xf86CursorInfoPtr CursorInfoRec;
Bool ModeStructInit;
Bool NeedSTREAMS;
Bool STREAMSRunning;
int vgaCRIndex, vgaCRReg;
int Width, Bpp,Bpl, ScissB;
unsigned PlaneMask;
int bltbug_width1, bltbug_width2;
int videoRambytes;
int videoRamKbytes;
int MemOffScreen;
unsigned char * MapBase;
unsigned char * MapBaseDense;
unsigned char * FBBase;
unsigned char * FBStart;
CARD32 FBCursorOffset;
unsigned char EnableMmioCR53;
unsigned char CR38,CR39,CR40;
Bool PrimaryVidMapped;
int dacSpeedBpp;
int minClock;
int maxClock;
int HorizScaleFactor;
Bool bankedMono;
int MCLK;
int REFCLK;
int LCDClk;
double refclk_fact;
int GEResetCnt;
void (*pWaitFifo)(struct tagS3VRec *, int);
void (*pWaitCmd)(struct tagS3VRec *);
OptionInfoPtr Options;
Bool pci_burst;
Bool NoPCIRetry;
Bool fifo_conservative;
Bool fifo_moderate;
Bool fifo_aggressive;
Bool slow_edodram;
Bool slow_dram;
Bool fast_dram;
Bool fpm_vram;
Bool NoAccel;
Bool ShowCache;
Bool early_ras_precharge;
Bool late_ras_precharge;
Bool lcd_center;
Bool hwcursor;
Bool UseFB;
Bool mx_cr3a_fix;
Bool XVideo;
CloseScreenProcPtr CloseScreen;
XAAInfoRecPtr AccelInfoRec;
pciVideoPtr PciInfo;
PCITAG PciTag;
int Chipset;
int ChipRev;
DGAModePtr DGAModes;
int numDGAModes;
Bool DGAactive;
int DGAViewportStatus;
I2CBusPtr I2C;
vbeInfoPtr pVbe;
Bool shadowFB;
int rotate;
unsigned char * ShadowPtr;
int ShadowPitch;
void (*PointerMoved)(int index, int x, int y);
} S3VRec, *S3VPtr;
#define S3VPTR(p) ((S3VPtr)((p)->driverPrivate))
#ifdef S3V_DEBUG
#define PVERB5(arg) ErrorF(arg)
#define VERBLEV 1
#else
#define PVERB5(arg) xf86ErrorFVerb(5, arg)
#define VERBLEV 5
#endif
#define VertDebug 1
#if !defined (MetroLink) && !defined (VertDebug)
#define VerticalRetraceWait() do { \
VGAOUT8(vgaCRIndex, 0x17); \
if ( VGAIN8(vgaCRReg) & 0x80 ) { \
while ((VGAIN8(vgaIOBase + 0x0A) & 0x08) == 0x00) ; \
while ((VGAIN8(vgaIOBase + 0x0A) & 0x08) == 0x08) ; \
while ((VGAIN8(vgaIOBase + 0x0A) & 0x08) == 0x00) ; \
}\
} while (0)
#else
#define SPIN_LIMIT 1000000
#define VerticalRetraceWait() do { \
VGAOUT8(vgaCRIndex, 0x17); \
if ( VGAIN8(vgaCRReg) & 0x80 ) { \
volatile unsigned long _spin_me; \
for (_spin_me = 0; \
((VGAIN8(vgaIOBase + 0x0A) & 0x08) == 0x00) && _spin_me <= SPIN_LIMIT; \
_spin_me++) ; \
if (_spin_me > SPIN_LIMIT) \
ErrorF("s3v: warning: VerticalRetraceWait timed out(1:3).\n"); \
for (_spin_me = 0; \
((VGAIN8(vgaIOBase + 0x0A) & 0x08) == 0x08) && _spin_me <= SPIN_LIMIT; \
_spin_me++) ; \
if (_spin_me > SPIN_LIMIT) \
ErrorF("s3v: warning: VerticalRetraceWait timed out(2:3).\n"); \
for (_spin_me = 0; \
((VGAIN8(vgaIOBase + 0x0A) & 0x08) == 0x00) && _spin_me <= SPIN_LIMIT; \
_spin_me++) ; \
if (_spin_me > SPIN_LIMIT) \
ErrorF("s3v: warning: VerticalRetraceWait timed out(3:3).\n"); \
} \
} while (0)
#endif
#define NO_MONO_FILL 0x00
#define NEED_MONO_FILL 0x01
#define MONO_TRANSPARENCY 0x02
extern void S3VCommonCalcClock(ScrnInfoPtr pScrn, DisplayModePtr mode,
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);
extern Bool S3VAccelInit(ScreenPtr pScreen);
extern Bool S3VAccelInit32(ScreenPtr pScreen);
void S3VAccelSync(ScrnInfoPtr);
void S3VWaitFifoGX2(S3VPtr ps3v, int slots );
void S3VWaitFifoMain(S3VPtr ps3v, int slots );
void S3VWaitCmdGX2(S3VPtr ps3v);
void S3VWaitDummy(S3VPtr ps3v);
extern Bool S3VHWCursorInit(ScreenPtr pScreen);
void S3VAdjustFrame(int scrnIndex, int x, int y, int flags);
Bool S3VSwitchMode(int scrnIndex, DisplayModePtr mode, int flags);
Bool S3VDGAInit(ScreenPtr pScreen);
void s3vPointerMoved(int index, int x, int y);
void s3vRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
void s3vRefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
void s3vRefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
void s3vRefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
void s3vRefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
void S3VInitVideo(ScreenPtr pScreen);
int S3VQueryXvCapable(ScrnInfoPtr);
#endif