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