trident.h revision 95b296d0
1/*
2 * Copyright 1992-2003 by Alan Hourihane, North Wales, UK.
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of Alan Hourihane not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission.  Alan Hourihane makes no representations
11 * about the suitability of this software for any purpose.  It is provided
12 * "as is" without express or implied warranty.
13 *
14 * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 * PERFORMANCE OF THIS SOFTWARE.
21 *
22 * Authors:  Alan Hourihane, <alanh@fairlite.demon.co.uk>
23 */
24/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/trident/trident.h,v 1.59 2003/09/05 22:07:28 alanh Exp $ */
25/*#define VBE_INFO*/
26
27#ifndef _TRIDENT_H_
28#define _TRIDENT_H_
29
30#include <stdio.h>
31#include <string.h>
32#include <math.h>
33
34#include "exa.h"
35#include "xf86Cursor.h"
36#include "xaa.h"
37#include "xf86RamDac.h"
38#include "compiler.h"
39#include "vgaHW.h"
40#include "xf86i2c.h"
41#include "xf86int10.h"
42#include "shadowfb.h"
43#include "shadow.h"
44#include "xf86xv.h"
45#include "xf86Pci.h"
46#include "vbe.h"
47
48#define PCI_CHIP_2200		0x2200
49
50typedef struct {
51	unsigned char tridentRegs3x4[0x100];
52	unsigned char tridentRegs3CE[0x100];
53	unsigned char tridentRegs3C4[0x100];
54	unsigned char tridentRegsDAC[0x01];
55        unsigned char tridentRegsClock[0x05];
56	unsigned char DacRegs[0x300];
57} TRIDENTRegRec, *TRIDENTRegPtr;
58
59#define VGA_REGNUM_ABOUT_TV 19
60#define TRIDENTPTR(p)	((TRIDENTPtr)((p)->driverPrivate))
61
62typedef struct {
63    ScrnInfoPtr		pScrn;
64    pciVideoPtr		PciInfo;
65    PCITAG		PciTag;
66    EntityInfoPtr	pEnt;
67    ExaDriverPtr	EXADriverPtr;
68    int			useEXA;
69    int			Chipset;
70    int			DACtype;
71    int			RamDac;
72    int                 ChipRev;
73    int			HwBpp;
74    int			BppShift;
75    CARD32		IOAddress;
76    unsigned long	FbAddress;
77    unsigned char *     IOBase;
78    unsigned char *	FbBase;
79    long		FbMapSize;
80    IOADDRESS		PIOBase;
81    Bool		NoAccel;
82    Bool		HWCursor;
83    Bool		UsePCIRetry;
84    Bool		UsePCIBurst;
85    Bool		NewClockCode;
86    Bool		Clipping;
87    Bool		DstEnable;
88    Bool		ROP;
89    Bool		HasSGRAM;
90    Bool		MUX;
91    Bool		IsCyber;
92    Bool		CyberShadow;
93    Bool		CyberStretch;
94    Bool		NoMMIO;
95    Bool                MMIOonly;
96    Bool		ShadowFB;
97    Bool		Linear;
98    DGAModePtr		DGAModes;
99    int			numDGAModes;
100    Bool		DGAactive;
101    int			DGAViewportStatus;
102    unsigned char *	ShadowPtr;
103    int			ShadowPitch;
104    RefreshAreaFuncPtr  RefreshArea;
105    void	        (*PointerMoved)(int index, int x, int y);
106    int                 Rotate;
107    float		frequency;
108    unsigned char	REGPCIReg;
109    unsigned char	REGNewMode1;
110    CARD8		SaveClock1;
111    CARD8		SaveClock2;
112    CARD8		SaveClock3;
113    int			MinClock;
114    int			MaxClock;
115    int			MUXThreshold;
116    int                 currentClock;
117    int			MCLK;
118    int			dwords;
119    int			h;
120    int			x;
121    int			w;
122    int			y;
123    int                 lcdMode;
124    Bool                lcdActive;
125    Bool                doInit;
126#ifdef READOUT
127    Bool                DontSetClock;
128#endif
129    TRIDENTRegRec	SavedReg;
130    TRIDENTRegRec	ModeReg;
131    I2CBusPtr		DDC;
132    CARD16		EngineOperation;
133    CARD32		PatternLocation;
134    CARD32		BltScanDirection;
135    CARD32		DrawFlag;
136    CARD16		LinePattern;
137    RamDacRecPtr	RamDacRec;
138    int			CursorOffset;
139    xf86CursorInfoPtr	CursorInfoRec;
140    xf86Int10InfoPtr	Int10;
141    vbeInfoPtr		pVbe;
142#ifdef VBE_INFO
143    vbeModeInfoPtr	vbeModes;
144#endif
145    XAAInfoRecPtr	AccelInfoRec;
146    CloseScreenProcPtr	CloseScreen;
147    ScreenBlockHandlerProcPtr BlockHandler;
148    int                 panelWidth;
149    int                 panelHeight;
150    unsigned int	(*ddc1Read)(ScrnInfoPtr);
151    CARD8*		XAAScanlineColorExpandBuffers[2];
152    CARD8*		XAAImageScanlineBuffer[1];
153    void                (*InitializeAccelerator)(ScrnInfoPtr);
154    void		(*VideoTimerCallback)(ScrnInfoPtr, Time);
155    XF86VideoAdaptorPtr adaptor;
156    int                 videoKey;
157    int			hsync;
158    int			hsync_rskew;
159    int			vsync;
160    int			vsync_bskew;
161    CARD32              videoFlags;
162    int			keyOffset;
163    int                 OverrideHsync;
164    int                 OverrideVsync;
165    int                 OverrideBskew;
166    int                 OverrideRskew;
167    OptionInfoPtr	Options;
168    Bool		shadowNew;
169    int			displaySize;
170    int			dspOverride;
171    Bool		GammaBrightnessOn;
172    int			brightness;
173    double		gamma;
174    int			FPDelay;	/* just for debugging - will go away */
175    int                 TVChipset;    /* 0: None 1: VT1621 2: CH7005C*/
176    int                 TVSignalMode; /* 0: NTSC 1: PAL */
177    Bool                TVRegSet;     /* 0: User not customer TV Reg, 1: User customer TV Reg */
178    unsigned char       TVRegUserSet[2][128]; /*[0][128] for Reg Index, [1][128] for Reg Value */
179    unsigned char       DefaultTVDependVGASetting[VGA_REGNUM_ABOUT_TV+0x62]; /* VGA_REGNUM_ABOUT_TV: VGA Reg, 0x62: TV Reg */
180} TRIDENTRec, *TRIDENTPtr;
181
182typedef struct {
183    CARD8 mode;
184    int display_x;
185    int display_y;
186    int clock;
187    int shadow_0;
188    int shadow_3;
189    int shadow_4;
190    int shadow_5;
191    int shadow_6;
192    int shadow_7;
193    int shadow_10;
194    int shadow_11;
195    int shadow_16;
196    int shadow_HiOrd;
197} tridentLCD;
198
199#define LCD_ACTIVE 0x01
200#define CRT_ACTIVE 0x02
201
202extern tridentLCD LCD[];
203
204typedef struct {
205    int x_res;
206    int y_res;
207    int mode;
208} biosMode;
209
210typedef struct {
211  int x_res;
212  int y_res;
213  CARD8 GR5a;
214  CARD8 GR5c;
215} newModes;
216
217/* Prototypes */
218
219Bool TRIDENTClockSelect(ScrnInfoPtr pScrn, int no);
220Bool TRIDENTSwitchMode(int scrnIndex, DisplayModePtr mode, int flags);
221void TRIDENTAdjustFrame(int scrnIndex, int x, int y, int flags);
222Bool TRIDENTDGAInit(ScreenPtr pScreen);
223Bool TRIDENTI2CInit(ScreenPtr pScreen);
224void TRIDENTInitVideo(ScreenPtr pScreen);
225void TRIDENTResetVideo(ScrnInfoPtr pScrn);
226unsigned int Tridentddc1Read(ScrnInfoPtr pScrn);
227void TVGARestore(ScrnInfoPtr pScrn, TRIDENTRegPtr tridentReg);
228void TVGASave(ScrnInfoPtr pScrn, TRIDENTRegPtr tridentReg);
229Bool TVGAInit(ScrnInfoPtr pScrn, DisplayModePtr mode);
230void TridentRestore(ScrnInfoPtr pScrn, TRIDENTRegPtr tridentReg);
231void TridentSave(ScrnInfoPtr pScrn, TRIDENTRegPtr tridentReg);
232Bool TridentInit(ScrnInfoPtr pScrn, DisplayModePtr mode);
233Bool TridentAccelInit(ScreenPtr pScreen);
234Bool XPAccelInit(ScreenPtr pScreen);
235Bool XP4XaaInit(ScreenPtr pScreen);
236Bool XP4ExaInit(ScreenPtr pScreen);
237Bool ImageAccelInit(ScreenPtr pScreen);
238Bool BladeXaaInit(ScreenPtr pScreen);
239Bool BladeExaInit(ScreenPtr pScreen);
240Bool TridentHWCursorInit(ScreenPtr pScreen);
241int TridentFindMode(int xres, int yres, int depth);
242void TGUISetClock(ScrnInfoPtr pScrn, int clock, unsigned char *a, unsigned char *b);
243void TGUISetMCLK(ScrnInfoPtr pScrn, int clock, unsigned char *a, unsigned char *b);
244void tridentSetModeBIOS(ScrnInfoPtr pScrn, DisplayModePtr mode);
245void TridentOutIndReg(ScrnInfoPtr pScrn,
246		     CARD32 reg, unsigned char mask, unsigned char data);
247unsigned char TridentInIndReg(ScrnInfoPtr pScrn, CARD32 reg);
248void TridentWriteAddress(ScrnInfoPtr pScrn, CARD32 index);
249void TridentReadAddress(ScrnInfoPtr pScrn, CARD32 index);
250void TridentWriteData(ScrnInfoPtr pScrn, unsigned char data);
251unsigned char TridentReadData(ScrnInfoPtr pScrn);
252void TridentLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indicies, LOCO *colors, VisualPtr pVisual);
253void TridentSetOverscan(ScrnInfoPtr pScrn, int overscan);
254int TGUISetRead(ScreenPtr pScreen, int bank);
255int TGUISetWrite(ScreenPtr pScreen, int bank);
256int TGUISetReadWrite(ScreenPtr pScreen, int bank);
257int TVGA8900SetRead(ScreenPtr pScreen, int bank);
258int TVGA8900SetWrite(ScreenPtr pScreen, int bank);
259int TVGA8900SetReadWrite(ScreenPtr pScreen, int bank);
260void TridentFindClock(ScrnInfoPtr pScrn, int clock);
261float CalculateMCLK(ScrnInfoPtr pScrn);
262void TRIDENTRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
263void TRIDENTShadowUpdate (ScreenPtr pScreen, shadowBufPtr pBuf);
264void TRIDENTPointerMoved(int index, int x, int y);
265void TRIDENTRefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
266void TRIDENTRefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
267void TRIDENTRefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
268void TRIDENTRefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
269
270void VIA_TVInit(ScrnInfoPtr pScrn);
271void VIA_SaveTVDepentVGAReg(ScrnInfoPtr pScrn);
272void VIA_RestoreTVDependVGAReg(ScrnInfoPtr pScrn);
273void VIA_DumpReg(ScrnInfoPtr pScrn);
274
275/*
276 * Trident Chipset Definitions
277 */
278
279/* Supported chipsets */
280typedef enum {
281    TVGA8200LX,
282    TVGA8800BR,
283    TVGA8800CS,
284    TVGA8900B,
285    TVGA8900C,
286    TVGA8900CL,
287    TVGA8900D,
288    TVGA9000,
289    TVGA9000i,
290    TVGA9100B,
291    TVGA9200CXr,
292    TGUI9400CXi,
293    TGUI9420DGi,
294    TGUI9430DGi,
295    TGUI9440AGi,
296    CYBER9320,
297    TGUI9660,
298    TGUI9680,
299    PROVIDIA9682,
300    CYBER9382,
301    CYBER9385,
302    PROVIDIA9685,
303    CYBER9388,
304    CYBER9397,
305    CYBER9397DVD,
306    CYBER9520,
307    CYBER9525DVD,
308    IMAGE975,
309    IMAGE985,
310    BLADE3D,
311    CYBERBLADEI7,
312    CYBERBLADEI7D,
313    CYBERBLADEI1,
314    CYBERBLADEI1D,
315    CYBERBLADEAI1,
316    CYBERBLADEAI1D,
317    CYBERBLADEE4,
318    BLADEXP,
319    CYBERBLADEXPAI1,
320    CYBERBLADEXP4,
321    XP5
322} TRIDENTType;
323
324#define UseMMIO		(pTrident->NoMMIO == FALSE)
325
326#define IsPciCard	(pTrident->pEnt->location.type == BUS_PCI)
327
328#define IsPrimaryCard	((xf86IsPrimaryPci(pTrident->PciInfo)) || \
329			 (xf86IsPrimaryIsa()))
330
331#define HAS_DST_TRANS	((pTrident->Chipset == PROVIDIA9682) || \
332			 (pTrident->Chipset == PROVIDIA9685) || \
333			 (pTrident->Chipset == BLADEXP) || \
334			 (pTrident->Chipset == CYBERBLADEXPAI1))
335
336#define Is3Dchip	((pTrident->Chipset == CYBER9397) || \
337			 (pTrident->Chipset == CYBER9397DVD) || \
338			 (pTrident->Chipset == CYBER9520) || \
339			 (pTrident->Chipset == CYBER9525DVD) || \
340			 (pTrident->Chipset == CYBERBLADEE4)  || \
341			 (pTrident->Chipset == IMAGE975)  || \
342			 (pTrident->Chipset == IMAGE985)  || \
343			 (pTrident->Chipset == CYBERBLADEI7)  || \
344			 (pTrident->Chipset == CYBERBLADEI7D)  || \
345			 (pTrident->Chipset == CYBERBLADEI1)  || \
346			 (pTrident->Chipset == CYBERBLADEI1D)  || \
347			 (pTrident->Chipset == CYBERBLADEAI1)  || \
348			 (pTrident->Chipset == CYBERBLADEAI1D)  || \
349			 (pTrident->Chipset == BLADE3D) || \
350			 (pTrident->Chipset == CYBERBLADEXPAI1) || \
351			 (pTrident->Chipset == CYBERBLADEXP4) || \
352			 (pTrident->Chipset == XP5) || \
353			 (pTrident->Chipset == BLADEXP))
354
355/*
356 * Trident DAC's
357 */
358
359#define TKD8001		0
360#define TGUIDAC		1
361
362/*
363 * Video Flags
364 */
365
366#define VID_ZOOM_INV 0x1
367#define VID_ZOOM_MINI 0x2
368#define VID_OFF_SHIFT_4 0x4
369#define VID_ZOOM_NOMINI 0x8
370#define VID_DOUBLE_LINEBUFFER_FOR_WIDE_SRC 0x10
371#endif /* _TRIDENT_H_ */
372
373