neo.h revision 692f60a7
1/**********************************************************************
2Copyright 1998, 1999 by Precision Insight, Inc., Cedar Park, Texas.
3
4                        All Rights Reserved
5
6Permission to use, copy, modify, distribute, and sell this software and
7its documentation for any purpose is hereby granted without fee,
8provided that the above copyright notice appear in all copies and that
9both that copyright notice and this permission notice appear in
10supporting documentation, and that the name of Precision Insight not be
11used in advertising or publicity pertaining to distribution of the
12software without specific, written prior permission.  Precision Insight
13and its suppliers make no representations about the suitability of this
14software for any purpose.  It is provided "as is" without express or
15implied warranty.
16
17PRECISION INSIGHT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
18INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
19EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY
20SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
21RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
22CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
23CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
24**********************************************************************/
25/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/neomagic/neo.h,v 1.23tsi Exp $ */
26
27/*
28 * The original Precision Insight driver for
29 * XFree86 v.3.3 has been sponsored by Red Hat.
30 *
31 * Authors:
32 *   Jens Owen (jens@tungstengraphics.com)
33 *   Kevin E. Martin (kevin@precisioninsight.com)
34 *
35 * Port to Xfree86 v.4.0
36 *   1998, 1999 by Egbert Eich (Egbert.Eich@Physik.TU-Darmstadt.DE)
37 */
38
39#include <string.h>
40/* All drivers should typically include these */
41#include "xf86.h"
42#include "xf86_OSproc.h"
43
44/* Everything using inb/outb, etc needs "compiler.h" */
45#include "compiler.h"
46
47#include "xaa.h"
48#include "xaalocal.h"		/* XAA internals as we replace some of XAA */
49#include "xaaWrapper.h"
50#include "xf86Cursor.h"
51
52#include "shadowfb.h"
53
54#include "vbe.h"
55
56/* Needed by the Shadow Framebuffer */
57#include "shadow.h"
58
59/* Drivers that need to access the PCI config space directly need this */
60#include "xf86Pci.h"
61
62#include "xf86i2c.h"
63
64#include "xf86xv.h"
65#include <X11/extensions/Xv.h>
66
67/*
68 * Driver data structures.
69 */
70#include "neo_reg.h"
71#include "neo_macros.h"
72
73/* Supported chipsets */
74typedef enum {
75    NM2070,
76    NM2090,
77    NM2093,
78    NM2097,
79    NM2160,
80    NM2200,
81    NM2230,
82    NM2360,
83    NM2380
84} NEOType;
85
86/* function prototypes */
87
88extern Bool NEOSwitchMode(int scrnIndex, DisplayModePtr mode, int flags);
89extern void NEOAdjustFrame(int scrnIndex, int x, int y, int flags);
90
91/* in neo_2070.c */
92extern Bool Neo2070AccelInit(ScreenPtr pScreen);
93
94/* in neo_2090.c */
95extern Bool Neo2090AccelInit(ScreenPtr pScreen);
96
97/* in neo_2097.c */
98extern Bool Neo2097AccelInit(ScreenPtr pScreen);
99
100/* in neo_2200.c */
101extern Bool Neo2200AccelInit(ScreenPtr pScreen);
102
103/* in neo_cursor.c */
104extern Bool NeoCursorInit(ScreenPtr pScrn);
105extern void NeoShowCursor(ScrnInfoPtr pScrn);
106extern void NeoHideCursor(ScrnInfoPtr pScrn);
107
108/* in neo_bank.c */
109int NEOSetReadWrite(ScreenPtr pScreen, int bank);
110int NEOSetWrite(ScreenPtr pScreen, int bank);
111int NEOSetRead(ScreenPtr pScreen, int bank);
112
113/* in neo_i2c.c */
114extern Bool neo_I2CInit(ScrnInfoPtr pScrn);
115
116/* in neo_shadow.c */
117void neoShadowUpdate (ScreenPtr pScreen, shadowBufPtr pBuf);
118void neoPointerMoved(int index, int x, int y);
119void neoRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
120void neoRefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
121void neoRefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
122void neoRefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
123void neoRefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
124
125/* in neo_dga.c */
126Bool NEODGAInit(ScreenPtr pScreen);
127
128/* in neo_video.c */
129extern void NEOInitVideo(ScreenPtr pScreen);
130extern void NEOResetVideo(ScrnInfoPtr pScrn);
131
132/* shadow regs */
133
134#define NEO_EXT_CR_MAX 0x85
135#define NEO_EXT_GR_MAX 0xC7
136typedef struct {
137    unsigned char CR[NEO_EXT_CR_MAX+1];
138    unsigned char GR[NEO_EXT_GR_MAX+1];
139} regSaveRec, *regSavePtr;
140
141/* registers */
142typedef struct {
143    unsigned char GeneralLockReg;
144    unsigned char ExtCRTDispAddr;
145    unsigned char ExtCRTOffset;
146    unsigned char SysIfaceCntl1;
147    unsigned char SysIfaceCntl2;
148    unsigned char ExtColorModeSelect;
149    unsigned char SingleAddrPage;
150    unsigned char DualAddrPage;
151    unsigned char biosMode;
152    unsigned char PanelDispCntlReg1;
153    unsigned char PanelDispCntlReg2;
154    unsigned char PanelDispCntlReg3;
155    unsigned char PanelVertCenterReg1;
156    unsigned char PanelVertCenterReg2;
157    unsigned char PanelVertCenterReg3;
158    unsigned char PanelVertCenterReg4;
159    unsigned char PanelVertCenterReg5;
160    unsigned char PanelHorizCenterReg1;
161    unsigned char PanelHorizCenterReg2;
162    unsigned char PanelHorizCenterReg3;
163    unsigned char PanelHorizCenterReg4;
164    unsigned char PanelHorizCenterReg5;
165    unsigned char Sequencer1;
166    Bool ProgramVCLK;
167    unsigned char VCLK3NumeratorLow;
168    unsigned char VCLK3NumeratorHigh;
169    unsigned char VCLK3Denominator;
170    unsigned char VerticalExt;
171    regSavePtr reg;
172} NeoRegRec, *NeoRegPtr;
173
174typedef struct {
175    /* Hardware cursor address */
176    unsigned int CursorAddress;
177    Bool UseHWCursor;
178    Bool NoCursorMode;
179    unsigned char CursTemp[1024];
180    /* Boundaries of the pixmap cache */
181    unsigned int cacheStart;
182    unsigned int cacheEnd;
183    /* Blitter */
184    unsigned int tmpBltCntlFlags;
185    unsigned int BltCntlFlags;
186    unsigned int BltModeFlags;
187    unsigned int ColorShiftAmt;
188    unsigned int Pitch;
189    unsigned int PixelWidth;
190    unsigned int PlaneMask;
191    int CPUToScreenColorExpandFill_x;
192    int CPUToScreenColorExpandFill_y;
193    int CPUToScreenColorExpandFill_w;
194    int CPUToScreenColorExpandFill_h;
195    int CPUToScreenColorExpandFill_skipleft;
196} NEOACLRec, *NEOACLPtr;
197#define NEOACLPTR(p)	&((NEOPtr)((p)->driverPrivate))->Accel
198
199/* globals */
200typedef struct neoRec
201{
202    int NeoChipset;
203    pciVideoPtr PciInfo;
204    PCITAG      PciTag;
205    EntityInfoPtr pEnt;
206    XAAInfoRecPtr	AccelInfoRec;
207    NEOACLRec Accel;
208    unsigned long NeoMMIOAddr;
209    unsigned long NeoLinearAddr;
210    unsigned char* NeoMMIOBase;
211    unsigned long NeoMMIOAddr2;
212    unsigned char* NeoMMIOBase2;
213    unsigned char* NeoFbBase;
214    long NeoFbMapSize;
215    unsigned long vgaIOBase;
216    DGAModePtr		DGAModes;
217    int			numDGAModes;
218    Bool		DGAactive;
219    int			DGAViewportStatus;
220    /* ??? */
221    int NeoFifoCount;
222    /* cursor */
223    int NeoCursorMem;
224    Bool NeoHWCursorShown;
225    Bool NeoHWCursorInitialized;
226    xf86CursorInfoPtr CursorInfo;
227    int NeoCursorOffset;
228    int NeoCursorPrevX;
229    int NeoCursorPrevY;
230    unsigned char *NeoCursorImage;
231    /* Panels size */
232    int NeoPanelWidth;
233    int NeoPanelHeight;
234    /* options */
235    OptionInfoPtr Options;
236    Bool noLinear;
237    Bool noAccel;
238    Bool noAccelSet;
239    Bool swCursor;
240    Bool noMMIO;
241    Bool internDisp;
242    Bool externDisp;
243    Bool noLcdStretch;
244    Bool shadowFB;
245    Bool lcdCenter;
246    Bool onPciBurst;
247    Bool progLcdRegs;
248    Bool progLcdStretch;
249    Bool progLcdStretchOpt;
250    Bool overrideValidate;
251    Bool strangeLockups;
252    /* registers */
253    NeoRegRec NeoModeReg;
254    NeoRegRec NeoSavedReg;
255    /* proc pointer */
256    CloseScreenProcPtr CloseScreen;
257    I2CBusPtr I2C;
258    vbeInfoPtr          pVbe;
259    unsigned char * ShadowPtr;
260    int ShadowPitch;
261    RefreshAreaFuncPtr refreshArea;
262    void	(*PointerMoved)(int index, int x, int y);
263    int rotate;
264    Bool showcache;
265    Bool video;
266    double videoHZoom;
267    double videoVZoom;
268    XF86VideoAdaptorPtr overlayAdaptor;
269    int overlay;
270    int overlay_offset;
271    int videoKey;
272    int interlace;
273    SyncFunc accelSync;
274} NEORec, *NEOPtr;
275
276typedef struct {
277    int x_res;
278    int y_res;
279    int mode;
280} biosMode;
281
282/* The privates of the NEO driver */
283#define NEOPTR(p)	((NEOPtr)((p)->driverPrivate))
284
285/* I/O register offsets */
286#define GRAX	0x3CE
287
288/* vga IO functions */
289#define VGArCR(index)		(*hwp->readCrtc)(hwp, index)
290#define VGAwCR(index, val)	(*hwp->writeCrtc)(hwp, index, val)
291#define VGArGR(index)		(*hwp->readGr)(hwp, index)
292#define VGAwGR(index, val)	(*hwp->writeGr)(hwp, index, val)
293#define VGArSR(index)		(*hwp->readSeq)(hwp, index)
294#define VGAwSR(index, val)	(*hwp->writeSeq)(hwp, index, val)
295
296/* memory mapped register access macros */
297#define INREG8(addr)		MMIO_IN8(nPtr->NeoMMIOBase, addr)
298#define INREG16(addr)		MMIO_IN16(nPtr->NeoMMIOBase, addr)
299#define INREG(addr)		MMIO_IN32(nPtr->NeoMMIOBase, addr)
300#define OUTREG8(addr, val)	MMIO_OUT8(nPtr->NeoMMIOBase, addr, val)
301#define OUTREG16(addr, val)	MMIO_OUT16(nPtr->NeoMMIOBase, addr, val)
302#define OUTREG(addr, val)	MMIO_OUT32(nPtr->NeoMMIOBase, addr, val)
303
304/* This swizzle macro is to support the manipulation of cursor masks when
305 * the sprite moves off the left edge of the display.  This code is
306 * platform specific, and is known to work with 32bit little endian machines
307 */
308#define SWIZZLE32(__b) { \
309  ((unsigned char *)&__b)[0] = byte_reversed[((unsigned char *)&__b)[0]]; \
310  ((unsigned char *)&__b)[1] = byte_reversed[((unsigned char *)&__b)[1]]; \
311  ((unsigned char *)&__b)[2] = byte_reversed[((unsigned char *)&__b)[2]]; \
312  ((unsigned char *)&__b)[3] = byte_reversed[((unsigned char *)&__b)[3]]; \
313}
314
315#define PROBED_NM2070	0x01
316#define PROBED_NM2090	0x42
317#define PROBED_NM2093	0x43
318#define PROBED_NM2097	0x83
319#define PROBED_NM2160	0x44
320#define PROBED_NM2200	0x45
321