mga.h revision 493f84f4
1/*
2 * MGA Millennium (MGA2064W) functions
3 *
4 * Copyright 1996 The XFree86 Project, Inc.
5 *
6 * Authors
7 *		Dirk Hohndel
8 *			hohndel@XFree86.Org
9 *		David Dawes
10 *			dawes@XFree86.Org
11 */
12
13#ifndef MGA_H
14#define MGA_H
15
16#ifdef XSERVER_LIBPCIACCESS
17#include <pciaccess.h>
18#endif
19#include <string.h>
20#include <stdio.h>
21
22#include "compiler.h"
23#ifdef HAVE_XAA_H
24#include "xaa.h"
25#endif
26#include "xf86fbman.h"
27#include "exa.h"
28#include "xf86Cursor.h"
29#include "vgaHW.h"
30#include "colormapst.h"
31#include "xf86DDC.h"
32#include "xf86xv.h"
33
34#ifndef XF86DRI
35#undef MGADRI
36#endif
37
38#ifdef MGADRI
39#include "xf86drm.h"
40
41#define _XF86DRI_SERVER_
42#include "mga_dripriv.h"
43#include "dri.h"
44#include "GL/glxint.h"
45
46#include "dri.h"
47
48#include "GL/glxint.h"
49#include "mga_dri.h"
50#endif
51
52#include "compat-api.h"
53
54typedef enum {
55    OPTION_SW_CURSOR,
56    OPTION_HW_CURSOR,
57    OPTION_PCI_RETRY,
58    OPTION_SYNC_ON_GREEN,
59    OPTION_NOACCEL,
60    OPTION_SHOWCACHE,
61    OPTION_OVERLAY,
62    OPTION_MGA_SDRAM,
63    OPTION_SHADOW_FB,
64    OPTION_FBDEV,
65    OPTION_COLOR_KEY,
66    OPTION_SET_MCLK,
67    OPTION_OVERCLOCK_MEM,
68    OPTION_VIDEO_KEY,
69    OPTION_ROTATE,
70    OPTION_TEXTURED_VIDEO,
71    OPTION_CRTC2HALF,
72    OPTION_CRTC2RAM,
73    OPTION_INT10,
74    OPTION_AGP_MODE,
75    OPTION_AGP_SIZE,
76    OPTION_DIGITAL1,
77    OPTION_DIGITAL2,
78    OPTION_TV,
79    OPTION_TVSTANDARD,
80    OPTION_CABLETYPE,
81    OPTION_USEIRQZERO,
82    OPTION_NOHAL,
83    OPTION_SWAPPED_HEAD,
84    OPTION_DRI,
85    OPTION_MERGEDFB,
86    OPTION_HSYNC2,
87    OPTION_VREFRESH2,
88    OPTION_MONITOR2POS,
89    OPTION_METAMODES,
90    OPTION_OLDDMA,
91    OPTION_PCIDMA,
92    OPTION_ACCELMETHOD,
93    OPTION_KVM
94} MGAOpts;
95
96
97#if !defined(EXTRADEBUG)
98#define INREG8(addr) MMIO_IN8(pMga->IOBase, addr)
99#define INREG16(addr) MMIO_IN16(pMga->IOBase, addr)
100#define INREG(addr) MMIO_IN32(pMga->IOBase, addr)
101#define OUTREG8(addr, val) MMIO_OUT8(pMga->IOBase, addr, val)
102#define OUTREG16(addr, val) MMIO_OUT16(pMga->IOBase, addr, val)
103#define OUTREG(addr, val) MMIO_OUT32(pMga->IOBase, addr, val)
104#else /* !EXTRADEBUG */
105CARD8 MGAdbg_inreg8(ScrnInfoPtr, int, int, char*);
106CARD16 MGAdbg_inreg16(ScrnInfoPtr, int, int, char*);
107CARD32 MGAdbg_inreg32(ScrnInfoPtr, int, int, char*);
108void MGAdbg_outreg8(ScrnInfoPtr, int, int, char*);
109void MGAdbg_outreg16(ScrnInfoPtr, int,int, char*);
110void MGAdbg_outreg32(ScrnInfoPtr, int,int, char*);
111#ifndef __GNUC__
112# define MGA_STRINGIZE(x) #x
113# define MGA_STRINGIFY(x) MGA_STRINGIZE(x)
114# define __FUNCTION__ MGA_STRINGIFY(__FILE__) ", line " MGA_STRINGIFY(__LINE__)
115#endif
116#define INREG8(addr) MGAdbg_inreg8(pScrn, addr, 1, __FUNCTION__)
117#define INREG16(addr) MGAdbg_inreg16(pScrn, addr, 1, __FUNCTION__)
118#define INREG(addr) MGAdbg_inreg32(pScrn, addr, 1, __FUNCTION__)
119#define OUTREG8(addr,val) MGAdbg_outreg8(pScrn, addr, val, __FUNCTION__)
120#define OUTREG16(addr,val) MGAdbg_outreg16(pScrn, addr, val, __FUNCTION__)
121#define OUTREG(addr,val) MGAdbg_outreg32(pScrn, addr, val, __FUNCTION__)
122#endif /* EXTRADEBUG */
123
124/*
125 * PCI vendor/device ids, formerly in xf86PciInfo.h
126 */
127
128#define PCI_VENDOR_MATROX               0x102B
129
130#define PCI_CHIP_MGA2085                0x0518
131#define PCI_CHIP_MGA2064                0x0519
132#define PCI_CHIP_MGA1064                0x051A
133#define PCI_CHIP_MGA2164                0x051B
134#define PCI_CHIP_MGA2164_AGP            0x051F
135
136#define PCI_CHIP_MGAG100_PCI            0x1000
137#define PCI_CHIP_MGAG100                0x1001
138#define PCI_CHIP_MGAG200_PCI            0x0520
139#define PCI_CHIP_MGAG200                0x0521
140#define PCI_CHIP_MGAG200_SE_A_PCI       0x0522
141#define PCI_CHIP_MGAG200_SE_B_PCI       0x0524
142#define PCI_CHIP_MGAG200_WINBOND_PCI    0x0532
143#define PCI_CHIP_MGAG200_EV_PCI         0x0530
144#define PCI_CHIP_MGAG200_EH_PCI         0x0533
145#define PCI_CHIP_MGAG200_ER_PCI         0x0534
146#define PCI_CHIP_MGAG400                0x0525
147#define PCI_CHIP_MGAG550                0x2527
148
149/*
150 * Read/write to the DAC via MMIO
151 */
152
153/*
154 * These were functions.  Use macros instead to avoid the need to
155 * pass pMga to them.
156 */
157
158#define inMGAdreg(reg) INREG8(RAMDAC_OFFSET + (reg))
159
160#define outMGAdreg(reg, val) OUTREG8(RAMDAC_OFFSET + (reg), val)
161
162#define inMGAdac(reg) \
163	(outMGAdreg(MGA1064_INDEX, reg), inMGAdreg(MGA1064_DATA))
164
165#define outMGAdac(reg, val) \
166	(outMGAdreg(MGA1064_INDEX, reg), outMGAdreg(MGA1064_DATA, val))
167
168#define outMGAdacmsk(reg, mask, val) \
169	do { /* note: mask and reg may get evaluated twice */ \
170	    unsigned char tmp = (mask) ? (inMGAdac(reg) & (mask)) : 0; \
171	    outMGAdreg(MGA1064_INDEX, reg); \
172	    outMGAdreg(MGA1064_DATA, tmp | (val)); \
173	} while (0)
174
175#define MGAWAITVSYNC() \
176    do { \
177	unsigned int count = 0; \
178    	unsigned int status = 0; \
179	do { \
180	    status = INREG( MGAREG_Status ); \
181	    count++; \
182    	} while( ( status & 0x08 ) && (count < 250000) );\
183	count = 0; \
184    	status = 0; \
185	do { \
186	    status = INREG( MGAREG_Status ); \
187	    count++; \
188    	} while( !( status & 0x08 ) && (count < 250000) );\
189    } while (0)
190
191#define MGAWAITBUSY() \
192    do { \
193    	unsigned int count = 0; \
194	unsigned int status = 0; \
195    	do { \
196    	    status = INREG8( MGAREG_Status + 2 ); \
197	    count++; \
198    	} while( ( status & 0x01 ) && (count < 500000) ); \
199    } while (0)
200
201#define PORT_OFFSET 	(0x1F00 - 0x300)
202
203#define MGA_VERSION 4000
204#define MGA_NAME "MGA"
205#define MGA_C_NAME MGA
206#define MGA_MODULE_DATA mgaModuleData
207#define MGA_DRIVER_NAME "mga"
208
209typedef struct {
210    unsigned char	ExtVga[6];
211    unsigned char 	DacClk[6];
212    unsigned char	ExtVga_Index24;
213    unsigned char	Dac_Index90;
214    unsigned char * DacRegs;
215    unsigned long	crtc2[0x58];
216    unsigned char	dac2[0x21];
217    CARD32		Option;
218    CARD32		Option2;
219    CARD32		Option3;
220    long                Clock;
221    unsigned char	Pan_Ctl;
222    Bool                PIXPLLCSaved;
223    unsigned char       PllM;
224    unsigned char       PllN;
225    unsigned char       PllP;
226} MGARegRec, *MGARegPtr;
227
228/* For programming the second CRTC */
229typedef struct {
230   CARD32   ulDispWidth;        /* Display Width in pixels*/
231   CARD32   ulDispHeight;       /* Display Height in pixels*/
232   CARD32   ulBpp;              /* Bits Per Pixels / input format*/
233   CARD32   ulPixClock;         /* Pixel Clock in kHz*/
234   CARD32   ulHFPorch;          /* Horizontal front porch in pixels*/
235   CARD32   ulHSync;            /* Horizontal Sync in pixels*/
236   CARD32   ulHBPorch;          /* Horizontal back porch in pixels*/
237   CARD32   ulVFPorch;          /* Vertical front porch in lines*/
238   CARD32   ulVSync;            /* Vertical Sync in lines*/
239   CARD32   ulVBPorch;          /* Vertical back Porch in lines*/
240   CARD32   ulFBPitch;          /* Pitch*/
241   CARD32   flSignalMode;       /* Signal Mode*/
242} xMODEINFO;
243
244
245typedef struct {
246   int          brightness;
247   int          contrast;
248   Bool         doubleBuffer;
249   unsigned char currentBuffer;
250   RegionRec	clip;
251   CARD32	colorKey;
252   CARD32	videoStatus;
253   Time		offTime;
254   Time		freeTime;
255   int		lastPort;
256
257#ifdef USE_EXA
258   int              size;
259   ExaOffscreenArea *off_screen;
260#endif
261
262   void         *video_memory;
263   int           video_offset;
264} MGAPortPrivRec, *MGAPortPrivPtr;
265
266typedef struct {
267    Bool	isHwCursor;
268    int		CursorMaxWidth;
269    int 	CursorMaxHeight;
270    int		CursorFlags;
271    int		CursorOffscreenMemSize;
272    Bool	(*UseHWCursor)(ScreenPtr, CursorPtr);
273    void	(*LoadCursorImage)(ScrnInfoPtr, unsigned char*);
274    void	(*ShowCursor)(ScrnInfoPtr);
275    void	(*HideCursor)(ScrnInfoPtr);
276    void	(*SetCursorPosition)(ScrnInfoPtr, int, int);
277    void	(*SetCursorColors)(ScrnInfoPtr, int, int);
278    long	maxPixelClock;
279    long	MemoryClock;
280    MessageType ClockFrom;
281    MessageType MemClkFrom;
282    Bool	SetMemClk;
283    void	(*LoadPalette)(ScrnInfoPtr, int, int*, LOCO*, VisualPtr);
284    void	(*RestorePalette)(ScrnInfoPtr, unsigned char *);
285    void	(*PreInit)(ScrnInfoPtr);
286    void	(*Save)(ScrnInfoPtr, vgaRegPtr, MGARegPtr, Bool);
287    void	(*Restore)(ScrnInfoPtr, vgaRegPtr, MGARegPtr, Bool);
288    Bool	(*ModeInit)(ScrnInfoPtr, DisplayModePtr);
289} MGARamdacRec, *MGARamdacPtr;
290
291
292typedef struct {
293    int bitsPerPixel;
294    int depth;
295    int displayWidth;
296    rgb weight;
297    DisplayModePtr mode;
298} MGAFBLayout;
299
300/* Card-specific driver information */
301
302typedef struct {
303    Bool update;
304    unsigned char red;
305    unsigned char green;
306    unsigned char blue;
307} MGAPaletteInfo;
308
309#define MGAPTR(p) ((MGAPtr)((p)->driverPrivate))
310
311/*avoids segfault by returning false if pMgaHwInfo not defined*/
312#define ISDIGITAL1(p) (p->pMgaHwInfo && ((p->pMgaHwInfo->ulCapsFirstOutput) & MGAHWINFOCAPS_OUTPUT_DIGITAL))
313#define ISDIGITAL2(p) (p->pMgaHwInfo && ((p->pMgaHwInfo->ulCapsSecondOutput) & MGAHWINFOCAPS_OUTPUT_DIGITAL))
314#define ISTV1(p) (p->pMgaHwInfo && ((p->pMgaHwInfo->ulCapsFirstOutput) & MGAHWINFOCAPS_OUTPUT_TV))
315#define ISTV2(p) (p->pMgaHwInfo && ((p->pMgaHwInfo->ulCapsSecondOutput) & MGAHWINFOCAPS_OUTPUT_TV))
316
317
318
319typedef enum {
320    mgaLeftOf,
321    mgaRightOf,
322    mgaAbove,
323    mgaBelow,
324    mgaClone
325} MgaScrn2Rel;
326
327typedef struct {
328    int			lastInstance;
329    int			refCount;
330    CARD32		masterFbAddress;
331    long		masterFbMapSize;
332    CARD32		slaveFbAddress;
333    long		slaveFbMapSize;
334    int			mastervideoRam;
335    int			slavevideoRam;
336    Bool		directRenderingEnabled;
337
338    void *		mappedIOBase;
339    int			mappedIOUsage;
340
341    void *		mappedILOADBase;
342    int			mappedILOADUsage;
343
344    ScrnInfoPtr 	pScrn_1;
345    ScrnInfoPtr 	pScrn_2;
346} MGAEntRec, *MGAEntPtr;
347
348/**
349 * Track the range of a voltage controlled osciliator (VCO).
350 */
351struct mga_VCO {
352    /**
353     * Minimum selectable frequency for this VCO, measured in kHz.
354     */
355    unsigned min_freq;
356
357    /**
358     * Maximum selectable frequency for this VCO, measured in kHz.
359     *
360     * If this value is zero, then the VCO is not available.
361     */
362    unsigned max_freq;
363};
364
365/**
366 * Host interface types that can be set by the card's BIOS.
367 */
368typedef enum {
369    MGA_HOST_UNKNOWN0 = 0,  /**< Meaning unknown. */
370    MGA_HOST_UNKNOWN1 = 1,  /**< Meaning unknown. */
371    MGA_HOST_UNKNOWN2 = 2,  /**< Meaning unknown. */
372    MGA_HOST_HYBRID = 3,    /**< AGP 4x for data xfers only. */
373
374    /**
375     * PCI interface.  Either native or via a universal PCI-to-PCI bridge
376     * chip.  The PCI G450 and PCI G550 cards are examples.
377     */
378    MGA_HOST_PCI = 4,
379
380    MGA_HOST_AGP_1x = 5,    /**< AGP 1x capable. */
381    MGA_HOST_AGP_2x = 6,    /**< AGP 2x capable. */
382    MGA_HOST_AGP_4x = 7     /**< AGP 4x capable. */
383} mga_host_t;
384
385/**
386 * Card information derrived from BIOS PInS data.
387 */
388struct mga_bios_values {
389    /**
390     * \name Voltage Controlled Oscilators
391     * \brief Track information about the various VCOs.
392     *
393     * MGA cards have between one and three VCOs that can be used to drive the
394     * various clocks.  On older cards, only \c mga_bios_values::pixel VCO is
395     * available.  On newer cards, such as the G450 and G550, all three are
396     * available.  If \c mga_VCO::max_freq is zero, the VCO is not available.
397     */
398    /*@{*/
399    struct mga_VCO   system;    /**< System VCO. */
400    struct mga_VCO   pixel;     /**< Pixel VCO. */
401    struct mga_VCO   video;     /**< Video VCO. */
402    /*@}*/
403
404    /**
405     * Memory clock speed, measured in kHz.
406     */
407    unsigned mem_clock;
408
409    /**
410     * PLL reference frequency value.  On older cards this is ~14MHz, and on
411     * newer cards it is ~27MHz.
412     */
413    unsigned pll_ref_freq;
414
415    /**
416     * Some older MGA cards have a "fast bitblt" mode.  This is determined
417     * by a capability bit stored in the PInS data.
418     */
419    Bool fast_bitblt;
420
421    /**
422     * Type of physical interface used for the card.
423     */
424    mga_host_t host_interface;
425};
426
427
428/**
429 * Attributes that of an MGA device that can be derrived purely from its
430 * PCI ID.
431 */
432struct mga_device_attributes {
433    unsigned has_sdram:1;
434    unsigned probe_for_sdram:1;
435    unsigned dual_head_possible:1;
436    unsigned fb_4mb_quirk:1;
437    unsigned hwcursor_1064:1;
438
439    unsigned dri_capable:1;
440    unsigned dri_chipset:3;
441
442    unsigned HAL_chipset:1;
443
444    enum {
445	old_BARs = 0,
446	probe_BARs,
447	new_BARs
448    } BARs:2;
449
450    uint32_t accel_flags;
451
452    /** Default BIOS values. */
453    struct mga_bios_values default_bios_values;
454
455    /** Default memory probe offset / size values. */
456    unsigned probe_size;
457    unsigned probe_offset;
458};
459
460typedef struct {
461    EntityInfoPtr	pEnt;
462    struct mga_bios_values bios;
463    CARD8               BiosOutputMode;
464#ifdef XSERVER_LIBPCIACCESS
465    struct pci_device *	PciInfo;
466#else
467    pciVideoPtr		PciInfo;
468    PCITAG		PciTag;
469    xf86AccessRec	Access;
470#endif
471    const struct mga_device_attributes * chip_attribs;
472    int			Chipset;
473    int                 ChipRev;
474
475    int is_Gx50:1;
476    int is_G200SE:1;
477    int is_G200WB:1;
478    int is_G200EV:1;
479    int is_G200EH:1;
480    int is_G200ER:1;
481
482    int KVM;
483
484    CARD32		reg_1e24;   /* model revision on g200se */
485
486    Bool		Primary;
487    Bool		Interleave;
488    int			HwBpp;
489    int			Roundings[4];
490    int			BppShifts[4];
491    Bool		HasFBitBlt;
492    Bool		OverclockMem;
493    int			YDstOrg;
494    int			DstOrg;
495    int			SrcOrg;
496
497    /**
498     * Which BAR corresponds to the framebuffer on this chip?
499     */
500    unsigned            framebuffer_bar;
501
502    /**
503     * Which BAR corresponds to IO space on this chip?
504     */
505    unsigned            io_bar;
506
507    /**
508     * Which BAR corresponds to ILOAD space on this chip?  If the value is
509     * -1, then this chip does not have an ILOAD region.
510     */
511    int                 iload_bar;
512
513#ifndef XSERVER_LIBPCIACCESS
514    unsigned long	IOAddress;
515    unsigned long	ILOADAddress;
516    unsigned long	BiosAddress;
517    MessageType		BiosFrom;
518#endif
519    unsigned long	FbAddress;
520    unsigned char *     IOBase;
521    unsigned char *	FbBase;
522    unsigned char *	ILOADBase;
523    unsigned char *	FbStart;
524    long		FbMapSize;
525    long		FbUsableSize;
526    long		FbCursorOffset;
527    MGARamdacRec	Dac;
528    Bool		HasSDRAM;
529    Bool		NoAccel;
530    Bool		Exa;
531    ExaDriverPtr 	ExaDriver;
532    Bool		SyncOnGreen;
533    Bool		HWCursor;
534    Bool		UsePCIRetry;
535    Bool		ShowCache;
536    Bool		ShadowFB;
537    unsigned char *	ShadowPtr;
538    int			ShadowPitch;
539    int			MemClk;
540    int			MinClock;
541    int			MaxClock;
542    MGARegRec		SavedReg;
543    MGARegRec		ModeReg;
544    int			MaxFastBlitY;
545    CARD32		BltScanDirection;
546    CARD32		FilledRectCMD;
547    CARD32		SolidLineCMD;
548    CARD32		PatternRectCMD;
549    CARD32		DashCMD;
550    CARD32		NiceDashCMD;
551    CARD32		AccelFlags;
552    CARD32		PlaneMask;
553    CARD32		FgColor;
554    CARD32		BgColor;
555    CARD32		MAccess;
556    int			FifoSize;
557    int			StyleLen;
558#ifdef HAVE_XAA_H
559    XAAInfoRecPtr	AccelInfoRec;
560#endif
561    xf86CursorInfoPtr	CursorInfoRec;
562    DGAModePtr		DGAModes;
563    int			numDGAModes;
564    Bool		DGAactive;
565    int			DGAViewportStatus;
566    CARD32		*Atype;
567    CARD32		*AtypeNoBLK;
568    void		(*PreInit)(ScrnInfoPtr pScrn);
569    void		(*Save)(ScrnInfoPtr, vgaRegPtr, MGARegPtr, Bool);
570    void		(*Restore)(ScrnInfoPtr, vgaRegPtr, MGARegPtr, Bool);
571    Bool		(*ModeInit)(ScrnInfoPtr, DisplayModePtr);
572    void		(*PointerMoved)(SCRN_ARG_TYPE arg, int x, int y);
573    CloseScreenProcPtr	CloseScreen;
574    ScreenBlockHandlerProcPtr BlockHandler;
575    unsigned int	(*ddc1Read)(ScrnInfoPtr);
576    void (*DDC1SetSpeed)(ScrnInfoPtr, xf86ddcSpeed);
577    Bool		(*i2cInit)(ScrnInfoPtr);
578    I2CBusPtr		DDC_Bus1;
579    I2CBusPtr		DDC_Bus2;
580    I2CBusPtr		Maven_Bus;
581    I2CDevPtr		Maven;
582    char		Maven_Version;
583    Bool		UseMaven;
584    Bool		UseMavenPM;
585    Bool		FBDev;
586    int			colorKey;
587    int			videoKey;
588    int			fifoCount;
589    int			Rotate;
590    MGAFBLayout		CurrentLayout;
591    Bool		DrawTransparent;
592    int			MaxBlitDWORDS;
593    Bool		TexturedVideo;
594    MGAPortPrivPtr	portPrivate;
595    unsigned char	*ScratchBuffer;
596    unsigned char	*ColorExpandBase;
597    int			expandRows;
598    int			expandDWORDs;
599    int			expandRemaining;
600    int			expandHeight;
601    int			expandY;
602#ifdef MGADRI
603    Bool 		directRenderingEnabled;
604    DRIInfoPtr 		pDRIInfo;
605    int 		drmFD;
606    int 		numVisualConfigs;
607    __GLXvisualConfig*	pVisualConfigs;
608    MGAConfigPrivPtr 	pVisualConfigsPriv;
609    MGADRIServerPrivatePtr DRIServerInfo;
610
611    MGARegRec		DRContextRegs;
612
613    Bool		haveQuiescense;
614    void		(*GetQuiescence)(ScrnInfoPtr pScrn);
615
616    int 		agpMode;
617    int                 agpSize;
618
619    int                 irq;
620    CARD32              reg_ien;
621
622    Bool                useOldDmaInit;
623    Bool                forcePciDma;
624#endif
625    XF86VideoAdaptorPtr adaptor;
626    Bool		DualHeadEnabled;
627    Bool		Crtc2IsTV;
628    Bool		SecondCrtc;
629    Bool                SecondOutput;
630
631    GDevPtr		device;
632    /* The hardware's real SrcOrg */
633    int			realSrcOrg;
634    MGAEntPtr		entityPrivate;
635    void		(*SetupForSolidFill)(ScrnInfoPtr pScrn, int color,
636					     int rop, unsigned int planemask);
637    void		(*SubsequentSolidFillRect)(ScrnInfoPtr pScrn,
638					     int x, int y, int w, int h);
639    void		(*RestoreAccelState)(ScrnInfoPtr pScrn);
640    int			allowedWidth;
641    void		(*VideoTimerCallback)(ScrnInfoPtr, Time);
642    void		(*PaletteLoadCallback)(ScrnInfoPtr);
643    void		(*RenderCallback)(ScrnInfoPtr);
644    Time		RenderTime;
645    MGAPaletteInfo	palinfo[256];  /* G400 hardware bug workaround */
646    FBLinearPtr		LinearScratch;
647    Bool                softbooted;
648    OptionInfoPtr	Options;
649
650    /* Exa */
651    PicturePtr currentSrcPicture;
652    PicturePtr currentMaskPicture;
653    PixmapPtr currentSrc;
654    PixmapPtr currentMask;
655    int src_w2;
656    int src_h2;
657    int mask_w2;
658    int mask_h2;
659    CARD32 src_pitch; /* FIXME kill me */
660
661/* Merged Framebuffer data */
662    Bool                MergedFB;
663
664    /* Real values specific to monitor1, since the original ones are replaced */
665    DisplayModePtr	M1modes;	 /* list of actual modes */
666    DisplayModePtr	M1currentMode; /* current mode */
667    int			M1frameX0;	/* viewport position */
668    int			M1frameY0;
669    int			M1frameX1;
670    int			M1frameY1;
671
672    ScrnInfoPtr       pScrn2; /*pointer to second CRTC screeninforec,
673                                       if in merged mode */
674/* End of Merged Framebuffer Data */
675  int			HALGranularityOffX, HALGranularityOffY;
676} MGARec, *MGAPtr;
677
678extern CARD32 MGAAtype[16];
679extern CARD32 MGAAtypeNoBLK[16];
680
681#define USE_RECTS_FOR_LINES	0x00000001
682#define FASTBLT_BUG		0x00000002
683#define CLIPPER_ON		0x00000004
684#define BLK_OPAQUE_EXPANSION	0x00000008
685#define TRANSC_SOLID_FILL	0x00000010
686#define	NICE_DASH_PATTERN	0x00000020
687#define	TWO_PASS_COLOR_EXPAND	0x00000040
688#define	MGA_NO_PLANEMASK	0x00000080
689/* linear expansion doesn't work on BE due to wrong byte order */
690#if X_BYTE_ORDER == X_BIG_ENDIAN
691#define USE_LINEAR_EXPANSION	0x00000000
692#else
693#define USE_LINEAR_EXPANSION	0x00000100
694#endif
695#define LARGE_ADDRESSES		0x00000200
696
697#define MGAIOMAPSIZE		0x00004000
698#define MGAILOADMAPSIZE		0x00400000
699
700#define TRANSPARENCY_KEY	255
701#define KEY_COLOR		0
702
703
704/* Prototypes */
705
706void MGAAdjustFrame(ADJUST_FRAME_ARGS_DECL);
707Bool MGASwitchMode(SWITCH_MODE_ARGS_DECL);
708void MGAFillModeInfoStruct(ScrnInfoPtr pScrn, DisplayModePtr mode);
709Bool MGAGetRec(ScrnInfoPtr pScrn);
710void MGAProbeDDC(ScrnInfoPtr pScrn, int index);
711void MGASoftReset(ScrnInfoPtr pScrn);
712void MGAFreeRec(ScrnInfoPtr pScrn);
713Bool mga_read_and_process_bios(ScrnInfoPtr pScrn);
714void MGADisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode,
715				  int flags);
716void MGAAdjustFrameCrtc2(ADJUST_FRAME_ARGS_DECL);
717void MGADisplayPowerManagementSetCrtc2(ScrnInfoPtr pScrn,
718					     int PowerManagementMode,
719					     int flags);
720void MGAAdjustGranularity(ScrnInfoPtr pScrn, int* x, int* y);
721
722
723void MGA2064SetupFuncs(ScrnInfoPtr pScrn);
724void MGAGSetupFuncs(ScrnInfoPtr pScrn);
725
726/*#ifdef USE_XAA */
727void MGAStormSync(ScrnInfoPtr pScrn);
728void MGAStormEngineInit(ScrnInfoPtr pScrn);
729Bool MGAStormAccelInit(ScreenPtr pScreen);
730Bool mgaAccelInit(ScreenPtr pScreen);
731/* #endif */
732
733#ifdef USE_EXA
734Bool mgaExaInit(ScreenPtr pScreen);
735#endif
736
737Bool MGAHWCursorInit(ScreenPtr pScreen);
738
739
740void MGAPolyArcThinSolid(DrawablePtr, GCPtr, int, xArc*);
741
742Bool MGADGAInit(ScreenPtr pScreen);
743
744void MGARefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
745void MGARefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
746void MGARefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
747void MGARefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
748void MGARefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox);
749
750void mgaDoSetupForScreenToScreenCopy( ScrnInfoPtr pScrn, int xdir,
751    int ydir, int rop, unsigned int planemask, int trans, unsigned int bpp );
752
753void mgaDoSetupForSolidFill( ScrnInfoPtr pScrn, int color, int rop,
754    unsigned int planemask, unsigned int bpp );
755
756void MGAPointerMoved(SCRN_ARG_TYPE arg, int x, int y);
757
758void MGAInitVideo(ScreenPtr pScreen);
759void MGAResetVideo(ScrnInfoPtr pScrn);
760
761#ifdef MGADRI
762
763#define MGA_FRONT	0x1
764#define MGA_BACK	0x2
765#define MGA_DEPTH	0x4
766
767Bool MGADRIScreenInit( ScreenPtr pScreen );
768void MGADRICloseScreen( ScreenPtr pScreen );
769Bool MGADRIFinishScreenInit( ScreenPtr pScreen );
770
771Bool MGALockUpdate( ScrnInfoPtr pScrn, drmLockFlags flags );
772
773void MGAGetQuiescence( ScrnInfoPtr pScrn );
774void MGAGetQuiescenceShared( ScrnInfoPtr pScrn );
775
776void MGASelectBuffer(ScrnInfoPtr pScrn, int which);
777Bool MgaCleanupDma(ScrnInfoPtr pScrn);
778Bool MgaInitDma(ScrnInfoPtr pScrn, int prim_size);
779
780#define MGA_AGP_1X_MODE		0x01
781#define MGA_AGP_2X_MODE		0x02
782#define MGA_AGP_4X_MODE		0x04
783#define MGA_AGP_MODE_MASK	0x07
784
785#endif
786
787Bool MGAMavenRead(ScrnInfoPtr pScrn, I2CByte reg, I2CByte *val);
788
789void MGACRTC2Set(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo);
790void MGAEnableSecondOutPut(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo);
791void MGACRTC2SetPitch(ScrnInfoPtr pSrcn, xMODEINFO *pModeInfo);
792void MGACRTC2SetDisplayStart(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo, CARD32 base, CARD32 ulX, CARD32 ulY);
793
794void MGACRTC2Get(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo);
795void MGACRTC2GetPitch(ScrnInfoPtr pSrcn, xMODEINFO *pModeInfo);
796void MGACRTC2GetDisplayStart(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo, CARD32 base, CARD32 ulX, CARD32 ulY);
797
798double MGAG450SetPLLFreq(ScrnInfoPtr pScrn, long f_out);
799#ifdef DEBUG
800void MGAG450PrintPLL(ScrnInfoPtr pScrn);
801#endif
802long MGAG450SavePLLFreq(ScrnInfoPtr pScrn);
803void MGAprintDac(ScrnInfoPtr pScrn);
804void MGAG200SESaveFonts(ScrnInfoPtr, vgaRegPtr);
805void MGAG200SERestoreFonts(ScrnInfoPtr, vgaRegPtr);
806void MGAG200SESaveMode(ScrnInfoPtr, vgaRegPtr);
807void MGAG200SERestoreMode(ScrnInfoPtr, vgaRegPtr);
808void MGAG200SEHWProtect(ScrnInfoPtr, Bool);
809
810static __inline__ void
811MGA_MARK_SYNC(MGAPtr pMga, ScrnInfoPtr pScrn)
812{
813#ifdef USE_EXA
814    if (pMga->Exa)
815        exaMarkSync(pScrn->pScreen);
816#endif
817#ifdef USE_XAA
818    if (!pMga->Exa)
819        SET_SYNC_FLAG(pMga->AccelInfoRec);
820#endif
821}
822
823static __inline__ void
824MGA_SYNC(MGAPtr pMga, ScrnInfoPtr pScrn)
825{
826#ifdef USE_EXA
827    if (pMga->Exa)
828        exaWaitSync(pScrn->pScreen);
829#endif
830#ifdef USE_XAA
831    if (!pMga->Exa && pMga->AccelInfoRec && pMga->AccelInfoRec->NeedToSync)
832        pMga->AccelInfoRec->Sync(pScrn);
833#endif
834}
835
836#endif
837