#include "xf86.h"
#include "xf86_OSproc.h"
#include "xf86_ansic.h"
#include "compiler.h"
#include "xaa.h"
#include "xaalocal.h"
#include "xf86Cursor.h"
#include "shadowfb.h"
#include "vbe.h"
#include "shadow.h"
#include "xf86Pci.h"
#include "xf86i2c.h"
#include "xf86xv.h"
#include "Xv.h"
#include "neo_reg.h"
#include "neo_macros.h"
typedef enum {
NM2070,
NM2090,
NM2093,
NM2097,
NM2160,
NM2200,
NM2230,
NM2360,
NM2380
} NEOType;
extern Bool NEOSwitchMode(int scrnIndex, DisplayModePtr mode, int flags);
extern void NEOAdjustFrame(int scrnIndex, int x, int y, int flags);
extern Bool Neo2070AccelInit(ScreenPtr pScreen);
extern Bool Neo2090AccelInit(ScreenPtr pScreen);
extern Bool Neo2097AccelInit(ScreenPtr pScreen);
extern Bool Neo2200AccelInit(ScreenPtr pScreen);
extern Bool NeoCursorInit(ScreenPtr pScrn);
extern void NeoShowCursor(ScrnInfoPtr pScrn);
extern void NeoHideCursor(ScrnInfoPtr pScrn);
int NEOSetReadWrite(ScreenPtr pScreen, int bank);
int NEOSetWrite(ScreenPtr pScreen, int bank);
int NEOSetRead(ScreenPtr pScreen, int bank);
extern Bool neo_I2CInit(ScrnInfoPtr pScrn);
void neoShadowUpdate (ScreenPtr pScreen, shadowBufPtr pBuf);
void neoPointerMoved(int index, int x, int y);
void neoRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
void neoRefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
void neoRefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
void neoRefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
void neoRefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
Bool NEODGAInit(ScreenPtr pScreen);
extern void NEOInitVideo(ScreenPtr pScreen);
extern void NEOResetVideo(ScrnInfoPtr pScrn);
#define NEO_EXT_CR_MAX 0x85
#define NEO_EXT_GR_MAX 0xC7
typedef struct {
unsigned char CR[NEO_EXT_CR_MAX+1];
unsigned char GR[NEO_EXT_GR_MAX+1];
} regSaveRec, *regSavePtr;
typedef struct {
unsigned char GeneralLockReg;
unsigned char ExtCRTDispAddr;
unsigned char ExtCRTOffset;
unsigned char SysIfaceCntl1;
unsigned char SysIfaceCntl2;
unsigned char ExtColorModeSelect;
unsigned char SingleAddrPage;
unsigned char DualAddrPage;
unsigned char biosMode;
unsigned char PanelDispCntlReg1;
unsigned char PanelDispCntlReg2;
unsigned char PanelDispCntlReg3;
unsigned char PanelVertCenterReg1;
unsigned char PanelVertCenterReg2;
unsigned char PanelVertCenterReg3;
unsigned char PanelVertCenterReg4;
unsigned char PanelVertCenterReg5;
unsigned char PanelHorizCenterReg1;
unsigned char PanelHorizCenterReg2;
unsigned char PanelHorizCenterReg3;
unsigned char PanelHorizCenterReg4;
unsigned char PanelHorizCenterReg5;
unsigned char Sequencer1;
Bool ProgramVCLK;
unsigned char VCLK3NumeratorLow;
unsigned char VCLK3NumeratorHigh;
unsigned char VCLK3Denominator;
unsigned char VerticalExt;
regSavePtr reg;
} NeoRegRec, *NeoRegPtr;
typedef struct {
unsigned int CursorAddress;
Bool UseHWCursor;
Bool NoCursorMode;
unsigned char CursTemp[1024];
unsigned int cacheStart;
unsigned int cacheEnd;
unsigned int tmpBltCntlFlags;
unsigned int BltCntlFlags;
unsigned int BltModeFlags;
unsigned int ColorShiftAmt;
unsigned int Pitch;
unsigned int PixelWidth;
unsigned int PlaneMask;
int CPUToScreenColorExpandFill_x;
int CPUToScreenColorExpandFill_y;
int CPUToScreenColorExpandFill_w;
int CPUToScreenColorExpandFill_h;
int CPUToScreenColorExpandFill_skipleft;
} NEOACLRec, *NEOACLPtr;
#define NEOACLPTR(p) &((NEOPtr)((p)->driverPrivate))->Accel
typedef struct neoRec
{
int NeoChipset;
pciVideoPtr PciInfo;
PCITAG PciTag;
EntityInfoPtr pEnt;
XAAInfoRecPtr AccelInfoRec;
NEOACLRec Accel;
unsigned long NeoMMIOAddr;
unsigned long NeoLinearAddr;
unsigned char* NeoMMIOBase;
unsigned long NeoMMIOAddr2;
unsigned char* NeoMMIOBase2;
unsigned char* NeoFbBase;
long NeoFbMapSize;
unsigned long vgaIOBase;
DGAModePtr DGAModes;
int numDGAModes;
Bool DGAactive;
int DGAViewportStatus;
int NeoFifoCount;
int NeoCursorMem;
Bool NeoHWCursorShown;
Bool NeoHWCursorInitialized;
xf86CursorInfoPtr CursorInfo;
int NeoCursorOffset;
int NeoCursorPrevX;
int NeoCursorPrevY;
unsigned char *NeoCursorImage;
int NeoPanelWidth;
int NeoPanelHeight;
OptionInfoPtr Options;
Bool noLinear;
Bool noAccel;
Bool noAccelSet;
Bool swCursor;
Bool noMMIO;
Bool internDisp;
Bool externDisp;
Bool noLcdStretch;
Bool shadowFB;
Bool lcdCenter;
Bool onPciBurst;
Bool progLcdRegs;
Bool progLcdStretch;
Bool progLcdStretchOpt;
Bool overrideValidate;
Bool strangeLockups;
NeoRegRec NeoModeReg;
NeoRegRec NeoSavedReg;
CloseScreenProcPtr CloseScreen;
I2CBusPtr I2C;
vbeInfoPtr pVbe;
unsigned char * ShadowPtr;
int ShadowPitch;
RefreshAreaFuncPtr refreshArea;
void (*PointerMoved)(int index, int x, int y);
int rotate;
Bool showcache;
Bool video;
double videoHZoom;
double videoVZoom;
XF86VideoAdaptorPtr overlayAdaptor;
int overlay;
int overlay_offset;
int videoKey;
int interlace;
} NEORec, *NEOPtr;
typedef struct {
int x_res;
int y_res;
int mode;
} biosMode;
#define NEOPTR(p) ((NEOPtr)((p)->driverPrivate))
#define GRAX 0x3CE
#define VGArCR(index) (*hwp->readCrtc)(hwp, index)
#define VGAwCR(index, val) (*hwp->writeCrtc)(hwp, index, val)
#define VGArGR(index) (*hwp->readGr)(hwp, index)
#define VGAwGR(index, val) (*hwp->writeGr)(hwp, index, val)
#define VGArSR(index) (*hwp->readSeq)(hwp, index)
#define VGAwSR(index, val) (*hwp->writeSeq)(hwp, index, val)
#define INREG8(addr) MMIO_IN8(nPtr->NeoMMIOBase, addr)
#define INREG16(addr) MMIO_IN16(nPtr->NeoMMIOBase, addr)
#define INREG(addr) MMIO_IN32(nPtr->NeoMMIOBase, addr)
#define OUTREG8(addr, val) MMIO_OUT8(nPtr->NeoMMIOBase, addr, val)
#define OUTREG16(addr, val) MMIO_OUT16(nPtr->NeoMMIOBase, addr, val)
#define OUTREG(addr, val) MMIO_OUT32(nPtr->NeoMMIOBase, addr, val)
#define SWIZZLE32(__b) { \
((unsigned char *)&__b)[0] = byte_reversed[((unsigned char *)&__b)[0]]; \
((unsigned char *)&__b)[1] = byte_reversed[((unsigned char *)&__b)[1]]; \
((unsigned char *)&__b)[2] = byte_reversed[((unsigned char *)&__b)[2]]; \
((unsigned char *)&__b)[3] = byte_reversed[((unsigned char *)&__b)[3]]; \
}
#define PROBED_NM2070 0x01
#define PROBED_NM2090 0x42
#define PROBED_NM2093 0x43
#define PROBED_NM2097 0x83
#define PROBED_NM2160 0x44
#define PROBED_NM2200 0x45