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