ct_driver.h revision d51ac6bd
1c06b6b69Smrg/*
2c06b6b69Smrg * Modified 1996 by Egbert Eich <eich@xfree86.org>
3c06b6b69Smrg * Modified 1996 by David Bateman <dbateman@club-internet.fr>
4c06b6b69Smrg *
5c06b6b69Smrg * Permission to use, copy, modify, distribute, and sell this software and its
6c06b6b69Smrg * documentation for any purpose is hereby granted without fee, provided that
7c06b6b69Smrg * the above copyright notice appear in all copies and that both that
8c06b6b69Smrg * copyright notice and this permission notice appear in supporting
9c06b6b69Smrg * documentation, and that the name of the authors not be used in
10c06b6b69Smrg * advertising or publicity pertaining to distribution of the software without
11c06b6b69Smrg * specific, written prior permission.  The authors makes no representations
12c06b6b69Smrg * about the suitability of this software for any purpose.  It is provided
13c06b6b69Smrg * "as is" without express or implied warranty.
14c06b6b69Smrg *
15c06b6b69Smrg * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16c06b6b69Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
17c06b6b69Smrg * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
18c06b6b69Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
19c06b6b69Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
20c06b6b69Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
21c06b6b69Smrg * PERFORMANCE OF THIS SOFTWARE.
22c06b6b69Smrg */
23c06b6b69Smrg
24c06b6b69Smrg
25c06b6b69Smrg
26c06b6b69Smrg#ifndef _CT_DRIVER_H_
27c06b6b69Smrg#define _CT_DRIVER_H_
28c06b6b69Smrg
299f4658d1Smrg#include "ct_pcirename.h"
30d51ac6bdSmrg#ifdef HAVE_XAA_H
31c06b6b69Smrg#include "xaa.h"
32c06b6b69Smrg#include "xaalocal.h"		/* XAA internals as we replace some of XAA */
33d51ac6bdSmrg#endif
34d51ac6bdSmrg#include "vbe.h"
35c06b6b69Smrg#include "xf86Cursor.h"
36c06b6b69Smrg#include "xf86i2c.h"
37c06b6b69Smrg#include "xf86DDC.h"
38c06b6b69Smrg#include "xf86xv.h"
39c06b6b69Smrg#include "vgaHW.h"
40c06b6b69Smrg#include <string.h>
419f4658d1Smrg#include <unistd.h>
42c06b6b69Smrg
43d51ac6bdSmrg#include "compat-api.h"
44d51ac6bdSmrg
45c06b6b69Smrg/* Supported chipsets */
46c06b6b69Smrgtypedef enum {
47c06b6b69Smrg    CHIPS_CT65520,
48c06b6b69Smrg    CHIPS_CT65525,
49c06b6b69Smrg    CHIPS_CT65530,
50c06b6b69Smrg    CHIPS_CT65535,
51c06b6b69Smrg    CHIPS_CT65540,
52c06b6b69Smrg    CHIPS_CT65545,
53c06b6b69Smrg    CHIPS_CT65546,
54c06b6b69Smrg    CHIPS_CT65548,
55c06b6b69Smrg    CHIPS_CT65550,
56c06b6b69Smrg    CHIPS_CT65554,
57c06b6b69Smrg    CHIPS_CT65555,
58c06b6b69Smrg    CHIPS_CT68554,
59c06b6b69Smrg    CHIPS_CT69000,
60c06b6b69Smrg    CHIPS_CT69030,
61c06b6b69Smrg    CHIPS_CT64200,
62c06b6b69Smrg    CHIPS_CT64300
63c06b6b69Smrg} CHIPSType;
64c06b6b69Smrg
65c06b6b69Smrg/* Clock related */
66c06b6b69Smrgtypedef struct {
67c06b6b69Smrg    unsigned char msr;		/* Dot Clock Related */
68c06b6b69Smrg    unsigned char fcr;
69c06b6b69Smrg    unsigned char xr02;
70c06b6b69Smrg    unsigned char xr03;
71c06b6b69Smrg    unsigned char xr33;
72c06b6b69Smrg    unsigned char xr54;
73c06b6b69Smrg    unsigned char fr03;
74c06b6b69Smrg    int Clock;
75c06b6b69Smrg    int FPClock;
76c06b6b69Smrg} CHIPSClockReg, *CHIPSClockPtr;
77c06b6b69Smrg
78c06b6b69Smrgtypedef struct {
79c06b6b69Smrg    unsigned int ProbedClk;
80c06b6b69Smrg    unsigned int Max;		/* Memory Clock Related */
81c06b6b69Smrg    unsigned int Clk;
82c06b6b69Smrg    unsigned char M;
83c06b6b69Smrg    unsigned char N;
84c06b6b69Smrg    unsigned char P;
85c06b6b69Smrg    unsigned char PSN;
86c06b6b69Smrg    unsigned char xrCC;
87c06b6b69Smrg    unsigned char xrCD;
88c06b6b69Smrg    unsigned char xrCE;
89c06b6b69Smrg} CHIPSMemClockReg, *CHIPSMemClockPtr;
90c06b6b69Smrg
91c06b6b69Smrg#define TYPE_HW 0x01
92c06b6b69Smrg#define TYPE_PROGRAMMABLE 0x02
93c06b6b69Smrg#define GET_TYPE 0x0F
94c06b6b69Smrg#define OLD_STYLE 0x10
95c06b6b69Smrg#define NEW_STYLE 0x20
96c06b6b69Smrg#define HiQV_STYLE 0x30
97c06b6b69Smrg#define WINGINE_1_STYLE 0x40        /* 64300: external clock; 4 clocks    */
98c06b6b69Smrg#define WINGINE_2_STYLE 0x50        /* 64300: internal clock; 2 hw-clocks */
99c06b6b69Smrg#define GET_STYLE 0xF0
100c06b6b69Smrg#define LCD_TEXT_CLK_FREQ 25000	    /* lcd textclock if TYPE_PROGRAMMABLE */
101c06b6b69Smrg#define CRT_TEXT_CLK_FREQ 28322     /* crt textclock if TYPE_PROGRAMMABLE */
102c06b6b69Smrg#define Fref 14318180               /* The reference clock in Hertz       */
103c06b6b69Smrg
104c06b6b69Smrg/* The capability flags for the C&T chipsets */
105c06b6b69Smrg#define ChipsLinearSupport	0x00000001
106c06b6b69Smrg#define ChipsAccelSupport	0x00000002
107c06b6b69Smrg#define ChipsFullMMIOSupport	0x00000004
108c06b6b69Smrg#define ChipsMMIOSupport	0x00000008
109c06b6b69Smrg#define ChipsHDepthSupport	0x00000010
110c06b6b69Smrg#define ChipsDPMSSupport	0x00000020
111c06b6b69Smrg#define ChipsTMEDSupport	0x00000040
112c06b6b69Smrg#define ChipsGammaSupport	0x00000080
113c06b6b69Smrg#define ChipsVideoSupport	0x00000100
114c06b6b69Smrg#define ChipsDualChannelSupport	0x00000200
115c06b6b69Smrg#define ChipsDualRefresh	0x00000400
116c06b6b69Smrg#define Chips64BitMemory	0x00000800
117c06b6b69Smrg
118c06b6b69Smrg/* Options flags for the C&T chipsets */
119c06b6b69Smrg#define ChipsHWCursor		0x00001000
120c06b6b69Smrg#define ChipsShadowFB		0x00002000
121c06b6b69Smrg#define ChipsUseNewFB		0x00008000
122c06b6b69Smrg
123c06b6b69Smrg/* Architecture type flags */
124c06b6b69Smrg#define ChipsHiQV		0x00010000
125c06b6b69Smrg#define ChipsWingine		0x00020000
126c06b6b69Smrg#define IS_Wingine(x)		((x->Flags) & ChipsWingine)
127c06b6b69Smrg#define IS_HiQV(x)		((x->Flags) & ChipsHiQV)
128c06b6b69Smrg
129c06b6b69Smrg/* Acceleration flags for the C&T chipsets */
130c06b6b69Smrg#define ChipsColorTransparency	0x0100000
131c06b6b69Smrg#define ChipsImageReadSupport	0x0200000
132c06b6b69Smrg
133c06b6b69Smrg/* Overlay Transparency Key */
134c06b6b69Smrg#define TRANSPARENCY_KEY 255
135c06b6b69Smrg
136c06b6b69Smrg/* Flag Bus Types */
137c06b6b69Smrg#define ChipsUnknown	0
138c06b6b69Smrg#define ChipsISA	1
139c06b6b69Smrg#define ChipsVLB	2
140c06b6b69Smrg#define ChipsPCI	3
141c06b6b69Smrg#define ChipsCPUDirect	4
142c06b6b69Smrg#define ChipsPIB	5
143c06b6b69Smrg#define ChipsMCB	6
144c06b6b69Smrg
145c06b6b69Smrg/* Macro's to select the 32 bit acceleration registers */
146c06b6b69Smrg#define DR(x) cPtr->Regs32[x]	/* For CT655xx naming scheme  */
147c06b6b69Smrg#define MR(x) cPtr->Regs32[x]	/* CT655xx MMIO naming scheme */
148c06b6b69Smrg#define BR(x) cPtr->Regs32[x]	/* For HiQV naming scheme     */
149c06b6b69Smrg#define MMIOmeml(x) *(CARD32 *)(cPtr->MMIOBase + (x))
150c06b6b69Smrg#if 0
151c06b6b69Smrg#define MMIOmemw(x) *(CARD16 *)(cPtr->MMIOBase + (x))
152c06b6b69Smrg#endif
153c06b6b69Smrg/* Monitor or flat panel type flags */
154c06b6b69Smrg#define ChipsCRT	0x0010
155c06b6b69Smrg#define ChipsLCD	0x1000
156c06b6b69Smrg#define ChipsLCDProbed	0x2000
157c06b6b69Smrg#define ChipsTFT	0x0100
158c06b6b69Smrg#define ChipsDS		0x0200
159c06b6b69Smrg#define ChipsDD		0x0400
160c06b6b69Smrg#define ChipsSS		0x0800
161c06b6b69Smrg#define IS_STN(x)	((x) & 0xE00)
162c06b6b69Smrg
163c06b6b69Smrg/* Dual channel register enable masks */
164c06b6b69Smrg#define IOSS_MASK	0xE0
165c06b6b69Smrg#define IOSS_BOTH	0x13
166c06b6b69Smrg#define IOSS_PIPE_A	0x11
167c06b6b69Smrg#define IOSS_PIPE_B	0x1E
168c06b6b69Smrg#define MSS_MASK	0xF0
169c06b6b69Smrg#define MSS_BOTH	0x0B
170c06b6b69Smrg#define MSS_PIPE_A	0x02
171c06b6b69Smrg#define MSS_PIPE_B	0x05
172c06b6b69Smrg/* Aggregate value of MSS shadow bits -GHB */
173c06b6b69Smrg#define MSS_SHADOW  0x07
174c06b6b69Smrg
175c06b6b69Smrg/* Storage for the registers of the C&T chipsets */
176c06b6b69Smrgtypedef struct {
177c06b6b69Smrg	unsigned char XR[0xFF];
178c06b6b69Smrg	unsigned char CR[0x80];
179c06b6b69Smrg	unsigned char FR[0x80];
180c06b6b69Smrg	unsigned char MR[0x80];
181c06b6b69Smrg	CHIPSClockReg Clock;
182c06b6b69Smrg} CHIPSRegRec, *CHIPSRegPtr;
183c06b6b69Smrg
184c06b6b69Smrg/* Storage for the flat panel size */
185c06b6b69Smrgtypedef struct {
186c06b6b69Smrg    int HDisplay;
187c06b6b69Smrg    int HRetraceStart;
188c06b6b69Smrg    int HRetraceEnd;
189c06b6b69Smrg    int HTotal;
190c06b6b69Smrg    int VDisplay;
191c06b6b69Smrg    int VRetraceStart;
192c06b6b69Smrg    int VTotal;
193c06b6b69Smrg} CHIPSPanelSizeRec, *CHIPSPanelSizePtr;
194c06b6b69Smrg
195c06b6b69Smrg/* Some variables needed in the XAA acceleration */
196c06b6b69Smrgtypedef struct {
197c06b6b69Smrg    /* General variable */
198c06b6b69Smrg    unsigned int CommandFlags;
199c06b6b69Smrg    unsigned int BytesPerPixel;
200c06b6b69Smrg    unsigned int BitsPerPixel;
201c06b6b69Smrg    unsigned int FbOffset;
202c06b6b69Smrg    unsigned int PitchInBytes;
203c06b6b69Smrg    unsigned int ScratchAddress;
204c06b6b69Smrg    /* 64k for color expansion and imagewrites */
205c06b6b69Smrg    unsigned char * BltDataWindow;
206c06b6b69Smrg    /* Hardware cursor address */
207c06b6b69Smrg    unsigned int CursorAddress;
208c06b6b69Smrg    Bool UseHWCursor;
209c06b6b69Smrg    /* Boundaries of the pixmap cache */
210c06b6b69Smrg    unsigned int CacheStart;
211c06b6b69Smrg    unsigned int CacheEnd;
212c06b6b69Smrg    /* Storage for pattern mask */
213c06b6b69Smrg    int planemask;
214c06b6b69Smrg    /* Storage for foreground and background color */
215c06b6b69Smrg    int fgColor;
216c06b6b69Smrg    int bgColor;
217c06b6b69Smrg    /* For the 8x8 pattern fills */
218c06b6b69Smrg    int patternyrot;
219c06b6b69Smrg    /* For cached stipple fills */
220c06b6b69Smrg    int SlotWidth;
221c06b6b69Smrg    /* Variables for the 24bpp fill */
222c06b6b69Smrg    unsigned char fgpixel;
223c06b6b69Smrg    unsigned char bgpixel;
224c06b6b69Smrg    unsigned char xorpixel;
225c06b6b69Smrg    Bool fastfill;
226c06b6b69Smrg    Bool rgb24equal;
227c06b6b69Smrg    int fillindex;
228c06b6b69Smrg    unsigned int width24bpp;
229c06b6b69Smrg    unsigned int color24bpp;
230c06b6b69Smrg    unsigned int rop24bpp;
231c06b6b69Smrg} CHIPSACLRec, *CHIPSACLPtr;
232c06b6b69Smrg#define CHIPSACLPTR(p)	&((CHIPSPtr)((p)->driverPrivate))->Accel
233c06b6b69Smrg
234c06b6b69Smrg/* Storage for some register values that are messed up by suspend/resumes */
235c06b6b69Smrgtypedef struct {
236c06b6b69Smrg    unsigned char xr02;
237c06b6b69Smrg    unsigned char xr03;
238c06b6b69Smrg    unsigned char xr14;
239c06b6b69Smrg    unsigned char xr15;
240c06b6b69Smrg    unsigned char vgaIOBaseFlag;
241c06b6b69Smrg} CHIPSSuspendHackRec, *CHIPSSuspendHackPtr;
242c06b6b69Smrg
243c06b6b69Smrg/* The functions to access the C&T extended registers */
244c06b6b69Smrgtypedef struct _CHIPSRec *CHIPSPtr;
245c06b6b69Smrgtypedef CARD8 (*chipsReadXRPtr)(CHIPSPtr cPtr, CARD8 index);
246c06b6b69Smrgtypedef void (*chipsWriteXRPtr)(CHIPSPtr cPtr, CARD8 index, CARD8 value);
247c06b6b69Smrgtypedef CARD8 (*chipsReadFRPtr)(CHIPSPtr cPtr, CARD8 index);
248c06b6b69Smrgtypedef void (*chipsWriteFRPtr)(CHIPSPtr cPtr, CARD8 index, CARD8 value);
249c06b6b69Smrgtypedef CARD8 (*chipsReadMRPtr)(CHIPSPtr cPtr, CARD8 index);
250c06b6b69Smrgtypedef void (*chipsWriteMRPtr)(CHIPSPtr cPtr, CARD8 index, CARD8 value);
251c06b6b69Smrgtypedef CARD8 (*chipsReadMSSPtr)(CHIPSPtr cPtr);
252c06b6b69Smrgtypedef void (*chipsWriteMSSPtr)(CHIPSPtr cPtr, vgaHWPtr hwp, CARD8 value);
253c06b6b69Smrgtypedef CARD8 (*chipsReadIOSSPtr)(CHIPSPtr cPtr);
254c06b6b69Smrgtypedef void (*chipsWriteIOSSPtr)(CHIPSPtr cPtr, CARD8 value);
255c06b6b69Smrg
256c06b6b69Smrg/* The privates of the C&T driver */
257c06b6b69Smrg#define CHIPSPTR(p)	((CHIPSPtr)((p)->driverPrivate))
258c06b6b69Smrg
259c06b6b69Smrg
260c06b6b69Smrgtypedef struct {
261c06b6b69Smrg    int			lastInstance;
262c06b6b69Smrg    int			refCount;
263c06b6b69Smrg    CARD32		masterFbAddress;
264c06b6b69Smrg    long		masterFbMapSize;
265c06b6b69Smrg    CARD32		slaveFbAddress;
266c06b6b69Smrg    long		slaveFbMapSize;
267c06b6b69Smrg    int			mastervideoRam;
268c06b6b69Smrg    int			slavevideoRam;
269c06b6b69Smrg    Bool		masterOpen;
270c06b6b69Smrg    Bool		slaveOpen;
271c06b6b69Smrg    Bool		masterActive;
272c06b6b69Smrg    Bool		slaveActive;
273c06b6b69Smrg} CHIPSEntRec, *CHIPSEntPtr;
274c06b6b69Smrg
275c06b6b69Smrg
276c06b6b69Smrgtypedef struct _CHIPSRec {
277c06b6b69Smrg    pciVideoPtr		PciInfo;
278d51ac6bdSmrg#ifndef XSERVER_LIBPCIACCESS
279c06b6b69Smrg    PCITAG		PciTag;
280d51ac6bdSmrg#endif
281c06b6b69Smrg    int			Chipset;
282c06b6b69Smrg    EntityInfoPtr       pEnt;
283d51ac6bdSmrg    unsigned long	PIOBase;
284d51ac6bdSmrg    unsigned long	IOAddress;
285c06b6b69Smrg    unsigned long	FbAddress;
286c06b6b69Smrg    unsigned int	IOBase;
287c06b6b69Smrg    unsigned char *	FbBase;
288c06b6b69Smrg    unsigned char *	MMIOBase;
289c06b6b69Smrg    unsigned char *	MMIOBaseVGA;
290c06b6b69Smrg    unsigned char *	MMIOBasePipeA;
291c06b6b69Smrg    unsigned char *	MMIOBasePipeB;
292c06b6b69Smrg    long		FbMapSize;
293c06b6b69Smrg    unsigned char *	ShadowPtr;
294c06b6b69Smrg    int			ShadowPitch;
295c06b6b69Smrg    int                 Rotate;
296d51ac6bdSmrg    void		(*PointerMoved)(SCRN_ARG_TYPE arg, int x, int y);
297c06b6b69Smrg    int                 FbOffset16;
298c06b6b69Smrg    int                 FbSize16;
299c06b6b69Smrg    OptionInfoPtr	Options;
300c06b6b69Smrg    CHIPSPanelSizeRec	PanelSize;
301c06b6b69Smrg    int			FrameBufferSize;
302c06b6b69Smrg    Bool		SyncResetIgn;
303c06b6b69Smrg    Bool		UseMMIO;
304c06b6b69Smrg    Bool		UseFullMMIO;
305c06b6b69Smrg    Bool		UseDualChannel;
306c06b6b69Smrg    int			Monitor;
307c06b6b69Smrg    int			MinClock;
308c06b6b69Smrg    int			MaxClock;
309c06b6b69Smrg    CHIPSClockReg	SaveClock;		/* Storage for ClockSelect */
310c06b6b69Smrg    CHIPSMemClockReg	MemClock;
311c06b6b69Smrg    unsigned char	ClockType;
312c06b6b69Smrg    unsigned char	CRTClk[4];
313c06b6b69Smrg    unsigned char       FPClk[4];
314c06b6b69Smrg    int                 FPclock;
315c06b6b69Smrg    int                 FPclkInx;
316c06b6b69Smrg    int                 CRTclkInx;
317c06b6b69Smrg    Bool                FPClkModified;
318c06b6b69Smrg    int			ClockMulFactor;
319c06b6b69Smrg    int			Rounding;
320c06b6b69Smrg    CHIPSSuspendHackRec	SuspendHack;
321c06b6b69Smrg    CARD32		PanelType;
322c06b6b69Smrg    CHIPSRegRec		ModeReg;
323c06b6b69Smrg    CHIPSRegRec		SavedReg;
324c06b6b69Smrg    CHIPSRegRec		SavedReg2;
325c06b6b69Smrg    vgaRegRec		VgaSavedReg2;
326c06b6b69Smrg    unsigned int *	Regs32;
327c06b6b69Smrg    unsigned int	Flags;
328c06b6b69Smrg    CARD32		Bus;
329d51ac6bdSmrg#ifdef HAVE_XAA_H
330c06b6b69Smrg    XAAInfoRecPtr	AccelInfoRec;
331d51ac6bdSmrg#endif
332c06b6b69Smrg    xf86CursorInfoPtr	CursorInfoRec;
333c06b6b69Smrg    CHIPSACLRec		Accel;
334c06b6b69Smrg    unsigned int	HWCursorContents;
335c06b6b69Smrg    Bool		HWCursorShown;
336c06b6b69Smrg    DGAModePtr		DGAModes;
337c06b6b69Smrg    int			numDGAModes;
338c06b6b69Smrg    Bool		DGAactive;
339c06b6b69Smrg    int			DGAViewportStatus;
340c06b6b69Smrg    CloseScreenProcPtr	CloseScreen;
341c06b6b69Smrg    ScreenBlockHandlerProcPtr BlockHandler;
342c06b6b69Smrg    void		(*VideoTimerCallback)(ScrnInfoPtr, Time);
343c06b6b69Smrg    int			videoKey;
344c06b6b69Smrg    XF86VideoAdaptorPtr	adaptor;
345c06b6b69Smrg    int			OverlaySkewX;
346c06b6b69Smrg    int			OverlaySkewY;
347c06b6b69Smrg    int			VideoZoomMax;
348c06b6b69Smrg    Bool		SecondCrtc;
349c06b6b69Smrg    CHIPSEntPtr		entityPrivate;
350c06b6b69Smrg    unsigned char	storeMSS;
351c06b6b69Smrg    unsigned char	storeIOSS;
3524cac844dSmacallan#ifdef __arm__
353c06b6b69Smrg#ifdef __NetBSD__
354c06b6b69Smrg    int			TVMode;
355c06b6b69Smrg#endif
356c06b6b69Smrg    int			Bank;
357c06b6b69Smrg#endif
358c06b6b69Smrg    unsigned char       ddc_mask;
359c06b6b69Smrg    I2CBusPtr           I2C;
360c06b6b69Smrg    vbeInfoPtr          pVbe;
361c06b6b69Smrg    chipsReadXRPtr	readXR;
362c06b6b69Smrg    chipsWriteXRPtr	writeXR;
363c06b6b69Smrg    chipsReadFRPtr	readFR;
364c06b6b69Smrg    chipsWriteFRPtr	writeFR;
365c06b6b69Smrg    chipsReadMRPtr	readMR;
366c06b6b69Smrg    chipsWriteMRPtr	writeMR;
367c06b6b69Smrg    chipsReadMSSPtr	readMSS;
368c06b6b69Smrg    chipsWriteMSSPtr	writeMSS;
369c06b6b69Smrg    chipsReadIOSSPtr	readIOSS;
370c06b6b69Smrg    chipsWriteIOSSPtr	writeIOSS;
371c06b6b69Smrg    Bool cursorDelay;
372c06b6b69Smrg    unsigned int viewportMask;
373c06b6b69Smrg    Bool dualEndianAp;
374c06b6b69Smrg} CHIPSRec;
375c06b6b69Smrg
376c06b6b69Smrgtypedef struct _CHIPSi2c {
377c06b6b69Smrg  unsigned char i2cClockBit;
378c06b6b69Smrg  unsigned char i2cDataBit;
379c06b6b69Smrg  CHIPSPtr cPtr;
380c06b6b69Smrg} CHIPSI2CRec, *CHIPSI2CPtr;
381c06b6b69Smrg
382c06b6b69Smrg/* External variables */
383c06b6b69Smrgextern int ChipsAluConv[];
384c06b6b69Smrgextern int ChipsAluConv2[];
385c06b6b69Smrgextern int ChipsAluConv3[];
386c06b6b69Smrgextern unsigned int ChipsReg32[];
387c06b6b69Smrgextern unsigned int ChipsReg32HiQV[];
388c06b6b69Smrg
389c06b6b69Smrg/* Prototypes */
390c06b6b69Smrg
391d51ac6bdSmrgvoid CHIPSAdjustFrame(ADJUST_FRAME_ARGS_DECL);
392d51ac6bdSmrgBool CHIPSSwitchMode(SWITCH_MODE_ARGS_DECL);
393c06b6b69Smrg
394c06b6b69Smrg/* video */
395c06b6b69Smrgvoid CHIPSInitVideo(ScreenPtr pScreen);
396c06b6b69Smrgvoid CHIPSResetVideo(ScrnInfoPtr pScrn);
397c06b6b69Smrg
398c06b6b69Smrg/* banking */
399c06b6b69Smrgint CHIPSSetRead(ScreenPtr pScreen, int bank);
400c06b6b69Smrgint CHIPSSetWrite(ScreenPtr pScreen, int bank);
401c06b6b69Smrgint CHIPSSetReadWrite(ScreenPtr pScreen, int bank);
402c06b6b69Smrgint CHIPSSetReadPlanar(ScreenPtr pScreen, int bank);
403c06b6b69Smrgint CHIPSSetWritePlanar(ScreenPtr pScreen, int bank);
404c06b6b69Smrgint CHIPSSetReadWritePlanar(ScreenPtr pScreen, int bank);
405c06b6b69Smrgint CHIPSWINSetRead(ScreenPtr pScreen, int bank);
406c06b6b69Smrgint CHIPSWINSetWrite(ScreenPtr pScreen, int bank);
407c06b6b69Smrgint CHIPSWINSetReadWrite(ScreenPtr pScreen, int bank);
408c06b6b69Smrgint CHIPSWINSetReadPlanar(ScreenPtr pScreen, int bank);
409c06b6b69Smrgint CHIPSWINSetWritePlanar(ScreenPtr pScreen, int bank);
410c06b6b69Smrgint CHIPSWINSetReadWritePlanar(ScreenPtr pScreen, int bank);
411c06b6b69Smrgint CHIPSHiQVSetReadWrite(ScreenPtr pScreen, int bank);
412c06b6b69Smrgint CHIPSHiQVSetReadWritePlanar(ScreenPtr pScreen, int bank);
413c06b6b69Smrg
414c06b6b69Smrg/* acceleration */
415c06b6b69SmrgBool CHIPSAccelInit(ScreenPtr pScreen);
416c06b6b69Smrgvoid CHIPSSync(ScrnInfoPtr pScrn);
417c06b6b69SmrgBool CHIPSMMIOAccelInit(ScreenPtr pScreen);
418c06b6b69Smrgvoid CHIPSMMIOSync(ScrnInfoPtr pScrn);
419c06b6b69SmrgBool CHIPSHiQVAccelInit(ScreenPtr pScreen);
420c06b6b69Smrgvoid CHIPSHiQVSync(ScrnInfoPtr pScrn);
421c06b6b69SmrgBool CHIPSCursorInit(ScreenPtr pScreen);
422c06b6b69Smrg
423c06b6b69Smrg/* register access functions */
424c06b6b69Smrgvoid CHIPSSetStdExtFuncs(CHIPSPtr cPtr);
425c06b6b69Smrgvoid CHIPSSetMmioExtFuncs(CHIPSPtr cPtr);
426c06b6b69Smrgvoid CHIPSHWSetMmioFuncs(ScrnInfoPtr pScrn, CARD8 *base, int offset);
427c06b6b69Smrg
428c06b6b69Smrg/* ddc */
429c06b6b69Smrgextern void chips_ddc1(ScrnInfoPtr pScrn);
430c06b6b69Smrgextern Bool chips_i2cInit(ScrnInfoPtr pScrn);
431c06b6b69Smrg
432c06b6b69Smrg/* dga */
433c06b6b69SmrgBool CHIPSDGAInit(ScreenPtr pScreen);
434c06b6b69Smrg
435c06b6b69Smrg/* shadow fb */
436c06b6b69Smrgvoid     chipsRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
437c06b6b69Smrgvoid     chipsRefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
438c06b6b69Smrgvoid     chipsRefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
439c06b6b69Smrgvoid     chipsRefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
440c06b6b69Smrgvoid     chipsRefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
441d51ac6bdSmrgvoid     chipsPointerMoved(SCRN_ARG_TYPE arg, int x, int y);
442c06b6b69Smrg
443c06b6b69Smrg#if X_BYTE_ORDER == X_BIG_ENDIAN
444c06b6b69Smrg# define BE_SWAP_APRETURE(pScrn,cPtr) \
445c06b6b69Smrg           ((pScrn->bitsPerPixel == 16) && cPtr->dualEndianAp)
446c06b6b69Smrg#endif
447c06b6b69Smrg
448c06b6b69Smrg/*
449c06b6b69Smrg * Some macros for switching display channels. NOTE... It appears that we
450c06b6b69Smrg * can't write to both display channels at the same time, and so the options
451c06b6b69Smrg * MSS_BOTH and IOSS_BOTH should not be used. Need to get around this by set
452c06b6b69Smrg * dual channel mode to pipe A by default and handling multiple channel writes
453c06b6b69Smrg * in ModeInit..
454c06b6b69Smrg */
455c06b6b69Smrg
456c06b6b69Smrg#define DUALOPEN \
457c06b6b69Smrg    {									      \
458c06b6b69Smrg        /* Set the IOSS/MSS registers to point to the right register set */   \
459c06b6b69Smrg	if (xf86IsEntityShared(pScrn->entityList[0])) { 		      \
460c06b6b69Smrg	    if (cPtr->SecondCrtc == TRUE) {				      \
461c06b6b69Smrg		cPtr->writeIOSS(cPtr, ((cPtr->storeIOSS & IOSS_MASK) |	      \
462c06b6b69Smrg					IOSS_PIPE_B));			      \
463c06b6b69Smrg		cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), ((cPtr->storeMSS &      \
464c06b6b69Smrg					MSS_MASK) | MSS_PIPE_B));	      \
465c06b6b69Smrg		cPtrEnt->slaveOpen = TRUE;				      \
466c06b6b69Smrg		cPtrEnt->slaveActive = TRUE;				      \
467c06b6b69Smrg		cPtrEnt->masterActive = FALSE;				      \
468c06b6b69Smrg	    } else {							      \
469c06b6b69Smrg		cPtr->writeIOSS(cPtr, ((cPtr->storeIOSS & IOSS_MASK) |	      \
470c06b6b69Smrg					IOSS_PIPE_A));			      \
471c06b6b69Smrg		cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), ((cPtr->storeMSS &      \
472c06b6b69Smrg					MSS_MASK) | MSS_PIPE_A));	      \
473c06b6b69Smrg		cPtrEnt->masterOpen = TRUE;				      \
474c06b6b69Smrg		cPtrEnt->masterActive = TRUE;				      \
475c06b6b69Smrg		cPtrEnt->slaveActive = FALSE;				      \
476c06b6b69Smrg	    }								      \
477c06b6b69Smrg	} else {							      \
478c06b6b69Smrg	    cPtr->writeIOSS(cPtr, ((cPtr->storeIOSS & IOSS_MASK) | 	      \
479c06b6b69Smrg					IOSS_PIPE_A));			      \
480c06b6b69Smrg	    cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), ((cPtr->storeMSS &	      \
481c06b6b69Smrg					MSS_MASK) | MSS_PIPE_A));	      \
482c06b6b69Smrg	}								      \
483c06b6b69Smrg    }
484c06b6b69Smrg
485c06b6b69Smrg#define DUALREOPEN							      \
486c06b6b69Smrg    {									      \
487c06b6b69Smrg	if (xf86IsEntityShared(pScrn->entityList[0])) { 		      \
488c06b6b69Smrg	    if (cPtr->SecondCrtc == TRUE) {				      \
489c06b6b69Smrg		if (! cPtrEnt->slaveActive) {				      \
490c06b6b69Smrg		    cPtr->writeIOSS(cPtr, ((cPtr->storeIOSS & IOSS_MASK) |    \
491c06b6b69Smrg					IOSS_PIPE_B));			      \
492c06b6b69Smrg		    cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), ((cPtr->storeMSS &  \
493c06b6b69Smrg					MSS_MASK) | MSS_PIPE_B));	      \
494c06b6b69Smrg		    cPtrEnt->slaveOpen = TRUE;				      \
495c06b6b69Smrg		    cPtrEnt->slaveActive = TRUE;			      \
496c06b6b69Smrg		    cPtrEnt->masterActive = FALSE;			      \
497c06b6b69Smrg		}							      \
498c06b6b69Smrg	    } else {							      \
499c06b6b69Smrg		if (! cPtrEnt->masterActive) {				      \
500c06b6b69Smrg		    cPtr->writeIOSS(cPtr, ((cPtr->storeIOSS & IOSS_MASK) |    \
501c06b6b69Smrg					IOSS_PIPE_A));			      \
502c06b6b69Smrg		    cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), ((cPtr->storeMSS &  \
503c06b6b69Smrg					MSS_MASK) | MSS_PIPE_A));	      \
504c06b6b69Smrg		    cPtrEnt->masterOpen = TRUE;				      \
505c06b6b69Smrg		    cPtrEnt->masterActive = TRUE;			      \
506c06b6b69Smrg		    cPtrEnt->slaveActive = FALSE;			      \
507c06b6b69Smrg		}							      \
508c06b6b69Smrg	    }								      \
509c06b6b69Smrg	}								      \
510c06b6b69Smrg    }
511c06b6b69Smrg
512c06b6b69Smrg#define DUALCLOSE							      \
513c06b6b69Smrg    {									      \
514c06b6b69Smrg	if (! xf86IsEntityShared(pScrn->entityList[0])) {		      \
515c06b6b69Smrg	    cPtr->writeIOSS(cPtr, ((cPtr->storeIOSS & IOSS_MASK) |	      \
516c06b6b69Smrg			       IOSS_PIPE_A));				      \
517c06b6b69Smrg	    cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), ((cPtr->storeMSS &	      \
518c06b6b69Smrg				MSS_MASK) | MSS_PIPE_A));		      \
519c06b6b69Smrg	    chipsHWCursorOff(cPtr, pScrn);				      \
520c06b6b69Smrg	    chipsRestore(pScrn, &(VGAHWPTR(pScrn))->SavedReg,		      \
521c06b6b69Smrg				&cPtr->SavedReg, TRUE);			      \
522c06b6b69Smrg	    chipsLock(pScrn);						      \
523c06b6b69Smrg	    cPtr->writeIOSS(cPtr, ((cPtr->storeIOSS & IOSS_MASK) |	      \
524c06b6b69Smrg			       IOSS_PIPE_B));				      \
525c06b6b69Smrg	    cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), ((cPtr->storeMSS &	      \
526c06b6b69Smrg				MSS_MASK) | MSS_PIPE_B)); 		      \
527c06b6b69Smrg	    chipsHWCursorOff(cPtr, pScrn);				      \
528c06b6b69Smrg	    chipsRestore(pScrn, &cPtr->VgaSavedReg2, &cPtr->SavedReg2, TRUE); \
529c06b6b69Smrg	    cPtr->writeIOSS(cPtr, cPtr->storeIOSS);			      \
530c06b6b69Smrg	    cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), cPtr->storeMSS);	      \
531c06b6b69Smrg	    chipsLock(pScrn);						      \
532c06b6b69Smrg	} else {							      \
533c06b6b69Smrg	    chipsHWCursorOff(cPtr, pScrn);				      \
534c06b6b69Smrg	    chipsRestore(pScrn, &(VGAHWPTR(pScrn))->SavedReg, &cPtr->SavedReg,\
535c06b6b69Smrg					TRUE);				      \
536c06b6b69Smrg	    if (cPtr->SecondCrtc == TRUE) {				      \
537c06b6b69Smrg		cPtrEnt->slaveActive = FALSE;				      \
538c06b6b69Smrg		cPtrEnt->slaveOpen = FALSE;				      \
539c06b6b69Smrg		if (! cPtrEnt->masterActive) {				      \
540c06b6b69Smrg		    cPtr->writeIOSS(cPtr, cPtr->storeIOSS);		      \
541c06b6b69Smrg		    cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), cPtr->storeMSS);    \
542c06b6b69Smrg		    chipsLock(pScrn);					      \
543c06b6b69Smrg		}							      \
544c06b6b69Smrg	    } else {							      \
545c06b6b69Smrg		cPtrEnt->masterActive = FALSE;				      \
546c06b6b69Smrg		cPtrEnt->masterOpen = FALSE;				      \
547c06b6b69Smrg		if (! cPtrEnt->slaveActive) {				      \
548c06b6b69Smrg		    cPtr->writeIOSS(cPtr, cPtr->storeIOSS);		      \
549c06b6b69Smrg		    cPtr->writeMSS(cPtr, VGAHWPTR(pScrn), cPtr->storeMSS);    \
550c06b6b69Smrg		    chipsLock(pScrn);					      \
551c06b6b69Smrg		}							      \
552c06b6b69Smrg	    }								      \
553c06b6b69Smrg	}								      \
554c06b6b69Smrg    }
555c06b6b69Smrg
556c06b6b69Smrg
557c06b6b69Smrg/* To aid debugging of 32 bit register access we make the following defines */
558c06b6b69Smrg/*
559c06b6b69Smrg#define DEBUG
560c06b6b69Smrg#define CT_HW_DEBUG
561c06b6b69Smrg*/
562c06b6b69Smrg#if defined(DEBUG) & defined(CT_HW_DEBUG)
563c06b6b69Smrg#define HW_DEBUG(x) {usleep(500000); ErrorF("Register/Address: 0x%X\n",x);}
564c06b6b69Smrg#else
565c06b6b69Smrg#define HW_DEBUG(x)
566c06b6b69Smrg#endif
567c06b6b69Smrg#endif
568