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