1340e3fbdSmrg/* 2340e3fbdSmrg * Copyright 2001 Ani Joshi <ajoshi@unixbox.com> 3340e3fbdSmrg * 4340e3fbdSmrg * XFree86 4.x driver for S3 chipsets 5340e3fbdSmrg * 6340e3fbdSmrg * 7340e3fbdSmrg * Permission to use, copy, modify, distribute, and sell this software and its 8340e3fbdSmrg * documentation for any purpose is hereby granted without fee, provided that 9340e3fbdSmrg * the above copyright notice appear in all copies and that both that copyright 10340e3fbdSmrg * notice and this permission notice appear in supporting documentation and 11340e3fbdSmrg * that the name of Ani Joshi not be used in advertising or 12340e3fbdSmrg * publicity pertaining to distribution of the software without specific, 13340e3fbdSmrg * written prior permission. Ani Joshi makes no representations 14340e3fbdSmrg * about the suitability of this software for any purpose. It is provided 15340e3fbdSmrg * "as-is" without express or implied warranty. 16340e3fbdSmrg * 17340e3fbdSmrg * ANI JOSHI DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 18340e3fbdSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 19340e3fbdSmrg * EVENT SHALL ANI JOSHI BE LIABLE FOR ANY SPECIAL, INDIRECT OR 20340e3fbdSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 21340e3fbdSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 22340e3fbdSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 23340e3fbdSmrg * PERFORMANCE OF THIS SOFTWARE. 24340e3fbdSmrg * 25340e3fbdSmrg * 26340e3fbdSmrg */ 27340e3fbdSmrg 28340e3fbdSmrg 29340e3fbdSmrg#ifndef _S3_H 30340e3fbdSmrg#define _S3_H 31340e3fbdSmrg 32bd35f0dbSahoka#include "s3_pcirename.h" 33340e3fbdSmrg#include <string.h> 34340e3fbdSmrg 35340e3fbdSmrg#include "xf86.h" 36340e3fbdSmrg#include "xf86Pci.h" 37a7f02474Smrg#if ABI_VIDEODRV_VERSION < SET_ABI_VERSION(25, 2) 38340e3fbdSmrg#include "xf86RamDac.h" 39a7f02474Smrg#else 40a7f02474Smrg#include "xf86Cursor.h" 41a7f02474Smrg#endif 425788ca14Smrg#ifdef HAVE_XAA_H 43340e3fbdSmrg#include "xaa.h" 445788ca14Smrg#endif 455788ca14Smrg#include "xf86fbman.h" 46340e3fbdSmrg#include "vbe.h" 47340e3fbdSmrg#include "vgaHW.h" 48340e3fbdSmrg 49340e3fbdSmrg 50340e3fbdSmrg#include "xf86xv.h" 51340e3fbdSmrg#include <X11/extensions/Xv.h> 52340e3fbdSmrg#include "fourcc.h" 53340e3fbdSmrg 545788ca14Smrg#include "compat-api.h" 55340e3fbdSmrg 565748e6ecSmrg 575748e6ecSmrg#define PCI_VENDOR_S3 0x5333 585748e6ecSmrg 595748e6ecSmrg#define PCI_CHIP_PLATO 0x0551 605748e6ecSmrg#define PCI_CHIP_TRIO 0x8811 615748e6ecSmrg#define PCI_CHIP_AURORA64VP 0x8812 625748e6ecSmrg#define PCI_CHIP_TRIO64UVP 0x8814 635748e6ecSmrg#define PCI_CHIP_868 0x8880 645748e6ecSmrg#define PCI_CHIP_928 0x88B0 655748e6ecSmrg#define PCI_CHIP_864_0 0x88C0 665748e6ecSmrg#define PCI_CHIP_864_1 0x88C1 675748e6ecSmrg#define PCI_CHIP_964_0 0x88D0 685748e6ecSmrg#define PCI_CHIP_964_1 0x88D1 695748e6ecSmrg#define PCI_CHIP_968 0x88F0 705748e6ecSmrg#define PCI_CHIP_TRIO64V2_DXGX 0x8901 715748e6ecSmrg#define PCI_CHIP_PLATO_PX 0x8902 725748e6ecSmrg 735748e6ecSmrg 74340e3fbdSmrgtypedef struct _S3RegRec { 75340e3fbdSmrg unsigned char cr31, cr32, cr33, cr34, cr3a, cr3b, cr3c; 76340e3fbdSmrg unsigned char cr3b2, cr3c2; 77340e3fbdSmrg unsigned char cr40, cr42, cr43, cr44, cr45; 78340e3fbdSmrg unsigned char cr50, cr51, cr53, cr54, cr55, cr58, cr59, cr5a, 79340e3fbdSmrg cr5d, cr5e; 80340e3fbdSmrg unsigned char cr60, cr61, cr62, cr65, cr66, cr67, cr6d; 81340e3fbdSmrg unsigned char s3save[10]; 82340e3fbdSmrg unsigned char s3syssave[46]; 83340e3fbdSmrg unsigned char dacregs[0x101]; 84340e3fbdSmrg unsigned char color_stack[8]; 85340e3fbdSmrg unsigned char clock; 86340e3fbdSmrg} S3RegRec, *S3RegPtr; 87340e3fbdSmrg 88340e3fbdSmrg 89340e3fbdSmrgtypedef struct { 90340e3fbdSmrg unsigned char brightness; 91340e3fbdSmrg unsigned char contrast; 92bd35f0dbSahoka FBLinearPtr area; 93340e3fbdSmrg RegionRec clip; 94340e3fbdSmrg CARD32 colorKey; 95340e3fbdSmrg CARD32 videoStatus; 96340e3fbdSmrg Time offTime; 97340e3fbdSmrg Time freeTime; 98340e3fbdSmrg int lastPort; 99340e3fbdSmrg} S3PortPrivRec, *S3PortPrivPtr; 100340e3fbdSmrg 101340e3fbdSmrg 102340e3fbdSmrgtypedef struct { 103340e3fbdSmrg int bitsPerPixel; 104340e3fbdSmrg int depth; 105340e3fbdSmrg int displayWidth; 106340e3fbdSmrg int pixel_code; 107340e3fbdSmrg int pixel_bytes; 108340e3fbdSmrg DisplayModePtr mode; 109340e3fbdSmrg} S3FBLayout; 110340e3fbdSmrg 111340e3fbdSmrg 112340e3fbdSmrgtypedef struct _S3Rec { 113340e3fbdSmrg pciVideoPtr PciInfo; 114bd35f0dbSahoka#ifndef XSERVER_LIBPCIACCESS 115340e3fbdSmrg PCITAG PciTag; 116bd35f0dbSahoka#endif 117340e3fbdSmrg EntityInfoPtr pEnt; 118340e3fbdSmrg unsigned long IOAddress; 119340e3fbdSmrg unsigned long FBAddress; 120340e3fbdSmrg unsigned char * FBBase; 121340e3fbdSmrg unsigned char * MMIOBase; 122340e3fbdSmrg unsigned long videoRam; 123340e3fbdSmrg OptionInfoPtr Options; 124340e3fbdSmrg unsigned int Flags; 125340e3fbdSmrg Bool NoAccel; 126bd35f0dbSahoka Bool HWCursor; 127340e3fbdSmrg Bool SlowDRAMRefresh; 128340e3fbdSmrg Bool SlowDRAM; 129340e3fbdSmrg Bool SlowEDODRAM; 130340e3fbdSmrg Bool SlowVRAM; 131340e3fbdSmrg Bool S3NewMMIO; 132bd35f0dbSahoka Bool hasStreams; 133bd35f0dbSahoka int Streams_FIFO; 134bd35f0dbSahoka Bool XVideo; 135340e3fbdSmrg Bool PCIRetry; 136340e3fbdSmrg Bool ColorExpandBug; 137340e3fbdSmrg 1385788ca14Smrg#ifdef HAVE_XAA_H 139340e3fbdSmrg XAAInfoRecPtr pXAA; 1405788ca14Smrg#endif 141340e3fbdSmrg xf86CursorInfoPtr pCurs; 142340e3fbdSmrg xf86Int10InfoPtr pInt10; 143340e3fbdSmrg XF86VideoAdaptorPtr adaptor; 144340e3fbdSmrg S3PortPrivPtr portPrivate; 145340e3fbdSmrg 146340e3fbdSmrg DGAModePtr DGAModes; 147340e3fbdSmrg int numDGAModes; 148340e3fbdSmrg Bool DGAactive; 149340e3fbdSmrg int DGAViewportStatus; 150340e3fbdSmrg 151340e3fbdSmrg S3FBLayout CurrentLayout; 152340e3fbdSmrg 153340e3fbdSmrg RamDacHelperRecPtr RamDac; 154340e3fbdSmrg RamDacRecPtr RamDacRec; 155340e3fbdSmrg 156340e3fbdSmrg int vgaCRIndex, vgaCRReg; 157340e3fbdSmrg 158340e3fbdSmrg int s3Bpp, s3BppDisplayWidth, HDisplay; 159340e3fbdSmrg int mclk, MaxClock; 160340e3fbdSmrg int pixMuxShift; 161340e3fbdSmrg 162340e3fbdSmrg int Chipset, ChipRev; 163340e3fbdSmrg int RefClock; 164340e3fbdSmrg 165340e3fbdSmrg int s3ScissB, s3ScissR; 166340e3fbdSmrg unsigned short BltDir; 167340e3fbdSmrg int trans_color; 168340e3fbdSmrg int FBCursorOffset; 169340e3fbdSmrg 170340e3fbdSmrg S3RegRec SavedRegs; 171340e3fbdSmrg S3RegRec ModeRegs; 172340e3fbdSmrg 173340e3fbdSmrg unsigned char SAM256; 174340e3fbdSmrg 175340e3fbdSmrg void (*DacPreInit)(ScrnInfoPtr pScrn); 176340e3fbdSmrg void (*DacInit)(ScrnInfoPtr pScrn, 177340e3fbdSmrg DisplayModePtr mode); 178340e3fbdSmrg void (*DacSave)(ScrnInfoPtr pScrn); 179340e3fbdSmrg void (*DacRestore)(ScrnInfoPtr pScrn); 180340e3fbdSmrg Bool (*CursorInit)(ScreenPtr pScreen); 181340e3fbdSmrg 182340e3fbdSmrg void (*LoadPalette)(ScrnInfoPtr pScrn, int numColors, 183340e3fbdSmrg int *indicies, LOCO *colors, 184340e3fbdSmrg VisualPtr pVisual); 185340e3fbdSmrg 1865788ca14Smrg Bool (*CloseScreen)(CLOSE_SCREEN_ARGS_DECL); 187340e3fbdSmrg 188340e3fbdSmrg unsigned char *imageBuffer; 189340e3fbdSmrg int imageWidth; 190340e3fbdSmrg int imageHeight; 191bd35f0dbSahoka Bool hwCursor; 192776933bfSmrg 193776933bfSmrg Bool shadowFB; 194776933bfSmrg int rotate; 195776933bfSmrg unsigned char * ShadowPtr; 196776933bfSmrg int ShadowPitch; 1975788ca14Smrg void (*PointerMoved)(SCRN_ARG_TYPE arg, int x, int y); 198776933bfSmrg 199340e3fbdSmrg} S3Rec, *S3Ptr; 200340e3fbdSmrg 201340e3fbdSmrg#define S3PTR(p) ((S3Ptr)((p)->driverPrivate)) 202340e3fbdSmrg 203340e3fbdSmrg 204340e3fbdSmrg#define DRIVER_NAME "s3" 2054dab54a5Sahoka#define DRIVER_VERSION PACKAGE_VERSION 2064dab54a5Sahoka#define VERSION_MAJOR PACKAGE_VERSION_MAJOR 2074dab54a5Sahoka#define VERSION_MINOR PACKAGE_VERSION_MINOR 2084dab54a5Sahoka#define PATCHLEVEL PACKAGE_VERSION_PATCHLEVEL 209340e3fbdSmrg#define S3_VERSION ((VERSION_MAJOR << 24) | \ 210340e3fbdSmrg (VERSION_MINOR << 16) | PATCHLEVEL) 211340e3fbdSmrg 212340e3fbdSmrg 213340e3fbdSmrg 214340e3fbdSmrg 215340e3fbdSmrg/* 216340e3fbdSmrg * Prototypes 217340e3fbdSmrg */ 218340e3fbdSmrg 219340e3fbdSmrgBool S3AccelInit(ScreenPtr pScreen); 220340e3fbdSmrgBool S3AccelInitNewMMIO(ScreenPtr pScreen); 221340e3fbdSmrgBool S3AccelInitPIO(ScreenPtr pScreen); 222340e3fbdSmrgBool S3DGAInit(ScreenPtr pScreen); 2235788ca14SmrgBool S3SwitchMode(SWITCH_MODE_ARGS_DECL); 224340e3fbdSmrgint S3GetRefClock(ScrnInfoPtr pScrn); 225340e3fbdSmrg 226340e3fbdSmrgvoid S3InitVideo(ScreenPtr pScreen); 227340e3fbdSmrgvoid S3InitStreams(ScrnInfoPtr pScrn, DisplayModePtr mode); 228340e3fbdSmrg 229340e3fbdSmrg/* IBMRGB */ 230340e3fbdSmrgextern RamDacSupportedInfoRec S3IBMRamdacs[]; 231340e3fbdSmrgBool S3ProbeIBMramdac(ScrnInfoPtr pScrn); 232340e3fbdSmrgvoid S3IBMRGB_PreInit(ScrnInfoPtr pScrn); 233340e3fbdSmrgvoid S3IBMRGB_Init(ScrnInfoPtr pScrn, DisplayModePtr mode); 234340e3fbdSmrgvoid S3IBMRGB_Save(ScrnInfoPtr pScrn); 235340e3fbdSmrgvoid S3IBMRGB_Restore(ScrnInfoPtr pScrn); 236340e3fbdSmrgBool S3IBMRGB_CursorInit(ScreenPtr pScreen); 237340e3fbdSmrg 238340e3fbdSmrg/* TRIO64 */ 239340e3fbdSmrgBool S3Trio64DACProbe(ScrnInfoPtr pScrn); 240340e3fbdSmrgvoid S3Trio64DAC_PreInit(ScrnInfoPtr pScrn); 241340e3fbdSmrgvoid S3Trio64DAC_Init(ScrnInfoPtr pScrn, DisplayModePtr mode); 242340e3fbdSmrgvoid S3Trio64DAC_Save(ScrnInfoPtr pScrn); 243340e3fbdSmrgvoid S3Trio64DAC_Restore(ScrnInfoPtr pScrn); 244340e3fbdSmrg 245340e3fbdSmrg/* Ti */ 246340e3fbdSmrgBool S3TiDACProbe(ScrnInfoPtr pScrn); 247340e3fbdSmrgvoid S3TiDAC_PreInit(ScrnInfoPtr pScrn); 248340e3fbdSmrgvoid S3TiDAC_Init(ScrnInfoPtr pScrn, DisplayModePtr mode); 249340e3fbdSmrgvoid S3TiDAC_Save(ScrnInfoPtr pScrn); 250340e3fbdSmrgvoid S3TiDAC_Restore(ScrnInfoPtr pScrn); 251340e3fbdSmrgvoid S3TiLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indicies, LOCO *colors, 252340e3fbdSmrg VisualPtr pVisual); 253340e3fbdSmrgBool S3Ti_CursorInit(ScreenPtr pScreen); 254340e3fbdSmrgvoid S3OutTiIndReg(ScrnInfoPtr pScrn, CARD32 reg, unsigned char mask, 255340e3fbdSmrg unsigned char data); 256340e3fbdSmrg 25796cdd0b9Skiyohara/* SDAC/GENDAC */ 25896cdd0b9SkiyoharaBool S3SDACProbe(ScrnInfoPtr pScrn); 25996cdd0b9Skiyoharavoid S3GENDAC_PreInit(ScrnInfoPtr pScrn); 26096cdd0b9Skiyoharavoid S3GENDAC_Init(ScrnInfoPtr pScrn, DisplayModePtr mode); 26196cdd0b9Skiyoharavoid S3SDAC_Init(ScrnInfoPtr pScrn, DisplayModePtr mode); 26296cdd0b9Skiyoharavoid S3GENDAC_Save(ScrnInfoPtr pScrn); 26396cdd0b9Skiyoharavoid S3GENDAC_Restore(ScrnInfoPtr pScrn); 26496cdd0b9Skiyohara 265340e3fbdSmrg/* s3 gen cursor */ 266340e3fbdSmrgBool S3_CursorInit(ScreenPtr pScreen); 267340e3fbdSmrg 268776933bfSmrg/* in s3_shadow.c */ 2695788ca14Smrgvoid S3PointerMoved(SCRN_ARG_TYPE arg, int x, int y); 270776933bfSmrgvoid S3RefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 271776933bfSmrgvoid S3RefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 272776933bfSmrgvoid S3RefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 273776933bfSmrgvoid S3RefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 274776933bfSmrgvoid S3RefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox); 275776933bfSmrg 276a9060c92SchristosBool S3GENDACProbe(ScrnInfoPtr pScrn); 277a9060c92Schristos 278776933bfSmrg 279340e3fbdSmrg#define TRIO64_RAMDAC 0x8811 280340e3fbdSmrg#define TI3025_RAMDAC 0x3025 281340e3fbdSmrg#define TI3020_RAMDAC 0x3020 28296cdd0b9Skiyohara#define GENDAC_RAMDAC 0x0708 28396cdd0b9Skiyohara#define SDAC_RAMDAC 0x0716 284340e3fbdSmrg 285340e3fbdSmrg/* 286340e3fbdSmrg * Chip...Sets... 287340e3fbdSmrg */ 288340e3fbdSmrg 28996cdd0b9Skiyohara#define S3_864_SERIES() ((pS3->Chipset == PCI_CHIP_864_0) || \ 29096cdd0b9Skiyohara (pS3->Chipset == PCI_CHIP_864_1)) 291340e3fbdSmrg#define S3_964_SERIES() ((pS3->Chipset == PCI_CHIP_964_0) || \ 292340e3fbdSmrg (pS3->Chipset == PCI_CHIP_964_1)) 293bd35f0dbSahoka 294340e3fbdSmrg#define S3_TRIO_SERIES() ((pS3->Chipset == PCI_CHIP_TRIO) || \ 295340e3fbdSmrg (pS3->Chipset == PCI_CHIP_AURORA64VP) || \ 296340e3fbdSmrg (pS3->Chipset == PCI_CHIP_TRIO64UVP) || \ 297340e3fbdSmrg (pS3->Chipset == PCI_CHIP_TRIO64V2_DXGX)) 298340e3fbdSmrg#endif /* _S3_H */ 299