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