summaryrefslogtreecommitdiffstats
path: root/src/s3v.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/s3v.h')
-rw-r--r--src/s3v.h427
1 files changed, 427 insertions, 0 deletions
diff --git a/src/s3v.h b/src/s3v.h
new file mode 100644
index 0000000..62436ff
--- /dev/null
+++ b/src/s3v.h
@@ -0,0 +1,427 @@
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/s3virge/s3v.h,v 1.31 2003/02/04 02:20:49 dawes Exp $ */
+
+/*
+Copyright (C) 1994-1999 The XFree86 Project, Inc. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
+NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the XFree86 Project shall not
+be used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from the XFree86 Project.
+*/
+
+#ifndef _S3V_H
+#define _S3V_H
+
+/* All drivers should typically include these */
+#include "xf86.h"
+#include "xf86_OSproc.h"
+
+/* All drivers need this */
+#include "xf86_ansic.h"
+
+/* Everything using inb/outb, etc needs "compiler.h" */
+#include "compiler.h"
+
+/* Drivers for PCI hardware need this */
+#include "xf86PciInfo.h"
+
+/* Drivers that need to access the PCI config space directly need this */
+#include "xf86Pci.h"
+
+#include "xf86Cursor.h"
+
+#include "vgaHW.h"
+
+#include "s3v_macros.h"
+
+/* All drivers initialising the SW cursor need this */
+#include "mipointer.h"
+
+/* All drivers using the mi colormap manipulation need this */
+#include "micmap.h"
+
+/* fb support */
+
+#include "fb.h"
+
+/* Drivers using the XAA interface ... */
+#include "xaa.h"
+#include "xaalocal.h"
+#include "xf86cmap.h"
+#include "xf86i2c.h"
+
+#include "vbe.h"
+
+/* Drivers using the EXA interface ... */
+#include "exa.h"
+
+#include "xf86xv.h"
+#include <X11/extensions/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 /*_S3V_VGAHWMMIO_H*/
+
+/******************* s3v_i2c ****************************/
+
+Bool S3V_I2CInit(ScrnInfoPtr pScrn);
+
+/******************* s3v_accel ****************************/
+
+void S3VGEReset(ScrnInfoPtr pScrn, int from_timeout, int line, char *file);
+
+
+/*********************************************/
+/* locals */
+
+/* Some S3 ViRGE structs */
+#include "newmmio.h"
+
+/* More ViRGE defines */
+#include "regs3v.h"
+
+/*********************************************/
+
+
+
+/* Driver data structure; this should contain all needed info for a mode */
+/* used to be in s3v_driver.h for pre 4.0 */
+typedef struct {
+ unsigned char SR08, SR0A, SR0F;
+ unsigned char SR10, SR11, SR12, SR13, SR15, SR18; /* SR9-SR1C, ext seq. */
+ 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; /* Video attrib. */
+ unsigned char CR7B, CR7D;
+ unsigned char CR85, CR86, CR87;
+ unsigned char CR90, CR91, CR92, CR93;
+ unsigned char ColorStack[8]; /* S3 hw cursor color stack CR4A/CR4B */
+ unsigned int STREAMS[22]; /* Streams regs */
+ unsigned int MMPR0, MMPR1, MMPR2, MMPR3; /* MIU regs */
+} S3VRegRec, *S3VRegPtr;
+
+
+/*********************************/
+/* S3VPortPrivRec */
+/*********************************/
+
+typedef struct {
+ unsigned char brightness;
+ unsigned char contrast;
+ FBAreaPtr area;
+ RegionRec clip;
+ CARD32 colorKey;
+ CARD32 videoStatus;
+ Time offTime;
+ Time freeTime;
+ int lastPort;
+} S3VPortPrivRec, *S3VPortPrivPtr;
+
+
+/*************************/
+/* S3VRec */
+/*************************/
+
+typedef struct _S3V {
+ /* S3V console saved mode registers */
+ S3VRegRec SavedReg;
+ /* XServer video state mode registers */
+ S3VRegRec ModeReg;
+ /* HW Cursor info */
+ xf86CursorInfoPtr CursorInfoRec;
+ /* Flag indicating ModeReg has been */
+ /* duped from console state. */
+ Bool ModeStructInit;
+ /* Is STREAMS processor needed for */
+ /* this mode? */
+ Bool NeedSTREAMS;
+ /* Is STREAMS running now ? */
+ Bool STREAMSRunning;
+ int Width, Bpp,Bpl, ScissB;
+ unsigned PlaneMask;
+ I2CBusPtr I2C;
+ /* In units as noted, set in PreInit */
+ int videoRambytes;
+ int videoRamKbytes;
+ /* In Kbytes, set in PreInit */
+ int MemOffScreen;
+
+ /* These are linear addresses */
+ unsigned char* MapBase;
+ unsigned char* MapBaseDense;
+ /* Same as MapBase, except framebuffer*/
+ unsigned char* FBBase;
+ /* Current visual FB starting location */
+ unsigned char* FBStart;
+
+ /* Flag indicating if vgaHWMapMem was */
+ /* used successfully for this screen */
+ Bool PrimaryVidMapped;
+ int HorizScaleFactor;
+ Bool bankedMono;
+ /* Memory Clock, input reference Clock and MX LCD clock */
+ int MCLK, REFCLK, LCDClk;
+ /* MX reference clock scale */
+ double refclk_fact;
+ /* Limit the number of errors */
+ /* printed using a counter */
+ int GEResetCnt;
+
+ /* ViRGE options */
+ OptionInfoPtr Options;
+ /* Enable PCI burst mode for reads? */
+ Bool pci_burst;
+ /* Diasable PCI retries */
+ Bool NoPCIRetry;
+ /* Adjust fifo for acceleration? */
+ Bool fifo_conservative;
+ Bool fifo_moderate;
+ Bool fifo_aggressive;
+ /* Set memory options */
+ Bool slow_edodram;
+ Bool slow_dram;
+ Bool fast_dram;
+ Bool fpm_vram;
+ /* Disable Acceleration */
+ Bool NoAccel;
+ /* Adjust memory ras precharge */
+ /* timing */
+ Bool ShowCache;
+ Bool early_ras_precharge;
+ Bool late_ras_precharge;
+ /* MX LCD centering */
+ Bool lcd_center;
+ /* hardware cursor enabled */
+ Bool hwcursor;
+ Bool UseFB;
+ Bool mx_cr3a_fix;
+ Bool XVideo;
+
+ /* Pointer used to save wrapped */
+ /* CloseScreen function. */
+ CloseScreenProcPtr CloseScreen;
+
+ /* accel additions */
+ CARD32 AccelFlags;
+ CARD32 AccelCmd;
+ CARD32 SrcBaseY, DestBaseY;
+ CARD32 Stride;
+ CARD32 CommonCmd;
+ CARD32 FullPlaneMask;
+ GCPtr CurrentGC;
+ /* fb support */
+ DrawablePtr CurrentDrawable;
+ /* end accel stuff */
+ /* ViRGE specifics -start- */
+ /* Xv support */
+ XF86VideoAdaptorPtr adaptor;
+ S3VPortPrivPtr portPrivate;
+
+ /* Compatibility variables */
+ int vgaCRIndex, vgaCRReg;
+ /* XAA */
+ int bltbug_width1, bltbug_width2;
+ /* Cursor storage location */
+ CARD32 FBCursorOffset;
+ /* Saved CR53 value */
+ unsigned char EnableMmioCR53;
+ /* Extended reg unlock storage */
+ unsigned char CR38,CR39,CR40;
+
+ /* Accel WaitFifo function */
+ void (*pWaitFifo)(struct _S3V *, int);
+ /* Accel WaitCmd function */
+ void (*pWaitCmd)(struct _S3V *);
+ void (*WaitForEmpty)(void);
+
+ /* Used by ViRGE driver, but generic */
+
+ /* PCI info vars. */
+ pciVideoPtr PciInfo;
+ PCITAG PciTag;
+ /* Chip info, set using PCI */
+ /* above. */
+ int Chipset;
+ int ChipRev;
+
+ /* support for EXA */
+ ExaDriverPtr EXADriverPtr;
+ Bool useEXA;
+ unsigned long EXAendfb;
+ unsigned long dst_offset;
+ unsigned long src_offset;
+ unsigned long dst_stride;
+ unsigned long src_stride;
+
+ /* XAA info Rec */
+ XAAInfoRecPtr AccelInfoRec;
+ /* DGA2 */
+ DGAModePtr DGAModes;
+ int numDGAModes;
+ Bool DGAactive;
+ int DGAViewportStatus;
+ vbeInfoPtr pVbe;
+
+ /* Support for shadowFB and rotation */
+ 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))
+
+
+/* #define S3V_DEBUG */
+
+#ifdef S3V_DEBUG
+#define PVERB5(arg) ErrorF(arg)
+#define VERBLEV 1
+#else
+#define PVERB5(arg) xf86ErrorFVerb(5, arg)
+#define VERBLEV 5
+#endif
+
+
+/******************* regs3v *******************************/
+
+/* cep kjb */
+#define VertDebug 1
+
+/* #ifndef MetroLink */
+#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
+
+
+/*********************************************************/
+
+
+/* Various defines which are used to pass flags between the Setup and
+ * Subsequent functions.
+ */
+
+#define NO_MONO_FILL 0x00
+#define NEED_MONO_FILL 0x01
+#define MONO_TRANSPARENCY 0x02
+
+/* prototypes */
+/* s3v_dac.c */
+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);
+
+/* s3v_accel.c */
+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);
+
+/* XAA and EXA */
+Bool S3VXAAInit(ScreenPtr);
+Bool S3VEXAInit(ScreenPtr);
+
+/* s3v_hwcurs.c */
+extern Bool S3VHWCursorInit(ScreenPtr pScreen);
+
+/* s3v_driver.c */
+void S3VAdjustFrame(int scrnIndex, int x, int y, int flags);
+Bool S3VSwitchMode(int scrnIndex, DisplayModePtr mode, int flags);
+
+/* s3v_dga.c */
+Bool S3VDGAInit(ScreenPtr pScreen);
+
+/* in s3v_shadow.c */
+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);
+
+/* s3v_xv.c X Video Extension support */
+void S3VInitVideo(ScreenPtr pScreen);
+int S3VQueryXvCapable(ScrnInfoPtr);
+
+#endif /*_S3V_H*/
+
+
+/*EOF*/
+
+