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