mga_dh.c revision fe5e51b7
1fe5e51b7Smrg/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/mga/mga_dh.c,v 1.4tsi Exp $ */ 2fe5e51b7Smrg/********************************************************************* 3fe5e51b7Smrg* G450: This is for Dual Head. 4fe5e51b7Smrg* Matrox Graphics 5fe5e51b7Smrg* Author : Luugi Marsan 6fe5e51b7Smrg**********************************************************************/ 7fe5e51b7Smrg 8fe5e51b7Smrg#ifdef HAVE_CONFIG_H 9fe5e51b7Smrg#include "config.h" 10fe5e51b7Smrg#endif 11fe5e51b7Smrg 12fe5e51b7Smrg/* All drivers should typically include these */ 13fe5e51b7Smrg#include "xf86.h" 14fe5e51b7Smrg#include "xf86_OSproc.h" 15fe5e51b7Smrg 16fe5e51b7Smrg/* Drivers for PCI hardware need this */ 17fe5e51b7Smrg#include "xf86PciInfo.h" 18fe5e51b7Smrg 19fe5e51b7Smrg/* Drivers that need to access the PCI config space directly need this */ 20fe5e51b7Smrg#include "xf86Pci.h" 21fe5e51b7Smrg 22fe5e51b7Smrg#include "mga_reg.h" 23fe5e51b7Smrg#include "mga.h" 24fe5e51b7Smrg 25fe5e51b7Smrg#define MNP_TABLE_SIZE 64 26fe5e51b7Smrg#define CLKSEL_MGA 0x0c 27fe5e51b7Smrg#define PLLLOCK 0x40 28fe5e51b7Smrg 29fe5e51b7Smrg/* Misc field*/ 30fe5e51b7Smrg#define IOADDSEL 0x01 31fe5e51b7Smrg#define RAMMAPEN 0x02 32fe5e51b7Smrg#define CLKSEL_25175 0x00 33fe5e51b7Smrg#define CLKSEL_28322 0x04 34fe5e51b7Smrg#define CLKSEL_MGA 0x0c 35fe5e51b7Smrg#define VIDEODIS 0x10 36fe5e51b7Smrg#define HPGODDEV 0x20 37fe5e51b7Smrg#define HSYNCPOL 0x40 38fe5e51b7Smrg#define VSYNCPOL 0x80 39fe5e51b7Smrg 40fe5e51b7Smrg/* XSYNCCTRL field */ 41fe5e51b7Smrg#define XSYNCCTRL_DAC1HSPOL_SHIFT 2 42fe5e51b7Smrg#define XSYNCCTRL_DAC1HSPOL_MASK (1 << XSYNCCTRL_DAC1HSPOL_SHIFT) 43fe5e51b7Smrg#define XSYNCCTRL_DAC1HSPOL_NEG (1 << XSYNCCTRL_DAC1HSPOL_SHIFT) 44fe5e51b7Smrg#define XSYNCCTRL_DAC1HSPOL_POS 0 45fe5e51b7Smrg#define XSYNCCTRL_DAC1VSPOL_SHIFT 3 46fe5e51b7Smrg#define XSYNCCTRL_DAC1VSPOL_MASK (1 << XSYNCCTRL_DAC1VSPOL_SHIFT) 47fe5e51b7Smrg#define XSYNCCTRL_DAC1VSPOL_NEG (1 << XSYNCCTRL_DAC1VSPOL_SHIFT) 48fe5e51b7Smrg#define XSYNCCTRL_DAC1VSPOL_POS 0 49fe5e51b7Smrg#define XSYNCCTRL_DAC2HSPOL_SHIFT 6 50fe5e51b7Smrg#define XSYNCCTRL_DAC2HSPOL_MASK (1 << XSYNCCTRL_DAC2HSPOL_SHIFT) 51fe5e51b7Smrg#define XSYNCCTRL_DAC2HSPOL_NEG (1 << XSYNCCTRL_DAC2HSPOL_SHIFT) 52fe5e51b7Smrg#define XSYNCCTRL_DAC2HSPOL_POS 0 53fe5e51b7Smrg#define XSYNCCTRL_DAC2VSPOL_SHIFT 7 54fe5e51b7Smrg#define XSYNCCTRL_DAC2VSPOL_MASK (1 << XSYNCCTRL_DAC2VSPOL_SHIFT) 55fe5e51b7Smrg#define XSYNCCTRL_DAC2VSPOL_NEG (1 << XSYNCCTRL_DAC2VSPOL_SHIFT) 56fe5e51b7Smrg#define XSYNCCTRL_DAC2VSPOL_POS 0 57fe5e51b7Smrg#define XSYNCCTRL_DAC1HSOFF_SHIFT 0 58fe5e51b7Smrg#define XSYNCCTRL_DAC1HSOFF_MASK (1 << XSYNCCTRL_DAC1HSOFF_SHIFT) 59fe5e51b7Smrg#define XSYNCCTRL_DAC1HSOFF_OFF (1 << XSYNCCTRL_DAC1HSOFF_SHIFT) 60fe5e51b7Smrg#define XSYNCCTRL_DAC1HSOFF_ON 1 61fe5e51b7Smrg#define XSYNCCTRL_DAC1VSOFF_SHIFT 1 62fe5e51b7Smrg#define XSYNCCTRL_DAC1VSOFF_MASK (1 << XSYNCCTRL_DAC1VSOFF_SHIFT) 63fe5e51b7Smrg#define XSYNCCTRL_DAC1VSOFF_OFF (1 << XSYNCCTRL_DAC1VSOFF_SHIFT) 64fe5e51b7Smrg#define XSYNCCTRL_DAC1VSOFF_ON 0 65fe5e51b7Smrg#define XSYNCCTRL_DAC2HSOFF_SHIFT 4 66fe5e51b7Smrg#define XSYNCCTRL_DAC2HSOFF_MASK (1 << XSYNCCTRL_DAC2HSOFF_SHIFT) 67fe5e51b7Smrg#define XSYNCCTRL_DAC2HSOFF_OFF (1 << XSYNCCTRL_DAC2HSOFF_SHIFT) 68fe5e51b7Smrg#define XSYNCCTRL_DAC2HSOFF_ON 0 69fe5e51b7Smrg#define XSYNCCTRL_DAC2VSOFF_SHIFT 5 70fe5e51b7Smrg#define XSYNCCTRL_DAC2VSOFF_MASK (1 << XSYNCCTRL_DAC2VSOFF_SHIFT) 71fe5e51b7Smrg#define XSYNCCTRL_DAC2VSOFF_OFF (1 << XSYNCCTRL_DAC2VSOFF_SHIFT) 72fe5e51b7Smrg#define XSYNCCTRL_DAC2VSOFF_ON 0 73fe5e51b7Smrg 74fe5e51b7Smrg#define POS_HSYNC 0x00000004 75fe5e51b7Smrg#define POS_VSYNC 0x00000008 76fe5e51b7Smrg 77fe5e51b7Smrg 78fe5e51b7Smrg/* Set CRTC 2*/ 79fe5e51b7Smrg/* Uses the mode given by xfree86 to setup the registry */ 80fe5e51b7Smrg/* Does not write to the hard yet */ 81fe5e51b7Smrgvoid MGACRTC2Get(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo) 82fe5e51b7Smrg{ 83fe5e51b7Smrg 84fe5e51b7Smrg 85fe5e51b7Smrg MGAPtr pMga = MGAPTR(pScrn); 86fe5e51b7Smrg MGARegPtr pReg = &pMga->ModeReg; 87fe5e51b7Smrg 88fe5e51b7Smrg xMODEINFO tmpModeInfo; 89fe5e51b7Smrg CARD32 ulHTotal; 90fe5e51b7Smrg CARD32 ulHDispEnd; 91fe5e51b7Smrg CARD32 ulHBlkStr; 92fe5e51b7Smrg CARD32 ulHSyncStr; 93fe5e51b7Smrg CARD32 ulHSyncEnd; 94fe5e51b7Smrg CARD32 ulVTotal; 95fe5e51b7Smrg CARD32 ulVDispEnd; 96fe5e51b7Smrg CARD32 ulVBlkStr; 97fe5e51b7Smrg CARD32 ulVSyncStr; 98fe5e51b7Smrg CARD32 ulVSyncEnd; 99fe5e51b7Smrg CARD32 ulOffset; 100fe5e51b7Smrg CARD32 ulCtl2; 101fe5e51b7Smrg CARD32 ulDataCtl2; 102fe5e51b7Smrg CARD32 ulDispHeight = pModeInfo->ulDispHeight; 103fe5e51b7Smrg 104fe5e51b7Smrg#ifdef DEBUG 105fe5e51b7Smrg ErrorF("ENTER MGACRTC2Get\n"); 106fe5e51b7Smrg#endif 107fe5e51b7Smrg 108fe5e51b7Smrg tmpModeInfo = *pModeInfo; 109fe5e51b7Smrg 110fe5e51b7Smrg 111fe5e51b7Smrg /* First compute the Values */ 112fe5e51b7Smrg 113fe5e51b7Smrg ulHTotal = tmpModeInfo.ulDispWidth + 114fe5e51b7Smrg tmpModeInfo.ulHFPorch + 115fe5e51b7Smrg tmpModeInfo.ulHBPorch + 116fe5e51b7Smrg tmpModeInfo.ulHSync; 117fe5e51b7Smrg 118fe5e51b7Smrg ulHDispEnd = tmpModeInfo.ulDispWidth; 119fe5e51b7Smrg ulHBlkStr = ulHDispEnd; 120fe5e51b7Smrg ulHSyncStr = ulHBlkStr + tmpModeInfo.ulHFPorch; 121fe5e51b7Smrg ulHSyncEnd = ulHSyncStr + tmpModeInfo.ulHSync; 122fe5e51b7Smrg 123fe5e51b7Smrg ulVTotal = ulDispHeight + 124fe5e51b7Smrg tmpModeInfo.ulVFPorch + 125fe5e51b7Smrg tmpModeInfo.ulVBPorch + 126fe5e51b7Smrg tmpModeInfo.ulVSync; 127fe5e51b7Smrg 128fe5e51b7Smrg 129fe5e51b7Smrg ulVDispEnd = ulDispHeight; 130fe5e51b7Smrg ulVBlkStr = ulVDispEnd; 131fe5e51b7Smrg ulVSyncStr = ulVBlkStr + tmpModeInfo.ulVFPorch; 132fe5e51b7Smrg ulVSyncEnd = ulVSyncStr + tmpModeInfo.ulVSync; 133fe5e51b7Smrg 134fe5e51b7Smrg ulOffset = tmpModeInfo.ulFBPitch; 135fe5e51b7Smrg 136fe5e51b7Smrg 137fe5e51b7Smrg 138fe5e51b7Smrg ulCtl2 = INREG(MGAREG_C2CTL); 139fe5e51b7Smrg ulDataCtl2 = INREG(MGAREG_C2DATACTL); 140fe5e51b7Smrg 141fe5e51b7Smrg ulCtl2 &= 0xFF1FFFFF; 142fe5e51b7Smrg ulDataCtl2 &= 0xFFFFFF00; 143fe5e51b7Smrg 144fe5e51b7Smrg switch (tmpModeInfo.ulBpp) 145fe5e51b7Smrg { 146fe5e51b7Smrg case 15: ulCtl2 |= 0x00200000; 147fe5e51b7Smrg ulOffset <<= 1; 148fe5e51b7Smrg break; 149fe5e51b7Smrg case 16: ulCtl2 |= 0x00400000; 150fe5e51b7Smrg ulOffset <<= 1; 151fe5e51b7Smrg break; 152fe5e51b7Smrg case 32: ulCtl2 |= 0x00800000; 153fe5e51b7Smrg ulOffset <<= 2; 154fe5e51b7Smrg break; 155fe5e51b7Smrg } 156fe5e51b7Smrg 157fe5e51b7Smrg 158fe5e51b7Smrg pReg->crtc2[ MGAREG2_C2CTL ] = ulCtl2; 159fe5e51b7Smrg pReg->crtc2[ MGAREG2_C2DATACTL ] = ulDataCtl2; 160fe5e51b7Smrg 161fe5e51b7Smrg /* Horizontal Value*/ 162fe5e51b7Smrg pReg->crtc2[MGAREG2_C2HPARAM] = (((ulHDispEnd-8) << 16) | (ulHTotal-8)) ; 163fe5e51b7Smrg pReg->crtc2[MGAREG2_C2HSYNC] = (((ulHSyncEnd-8) << 16) | (ulHSyncStr-8)) ; 164fe5e51b7Smrg 165fe5e51b7Smrg 166fe5e51b7Smrg /*Vertical Value*/ 167fe5e51b7Smrg pReg->crtc2[MGAREG2_C2VPARAM] = (((ulVDispEnd-1) << 16) | (ulVTotal-1)) ; 168fe5e51b7Smrg pReg->crtc2[MGAREG2_C2VSYNC] = (((ulVSyncEnd-1) << 16) | (ulVSyncStr-1)) ; 169fe5e51b7Smrg 170fe5e51b7Smrg /** Offset value*/ 171fe5e51b7Smrg 172fe5e51b7Smrg pReg->crtc2[MGAREG2_C2OFFSET] = ulOffset; 173fe5e51b7Smrg 174fe5e51b7Smrg#ifdef DEBUG 175fe5e51b7Smrg ErrorF("EXIT MGACRTC2Get\n"); 176fe5e51b7Smrg#endif 177fe5e51b7Smrg 178fe5e51b7Smrg} 179fe5e51b7Smrg 180fe5e51b7Smrg/* Set CRTC 2*/ 181fe5e51b7Smrg/* Writes to the hardware */ 182fe5e51b7Smrgvoid MGACRTC2Set(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo) 183fe5e51b7Smrg{ 184fe5e51b7Smrg 185fe5e51b7Smrg 186fe5e51b7Smrg MGAPtr pMga = MGAPTR(pScrn); 187fe5e51b7Smrg MGARegPtr pReg = &pMga->ModeReg; 188fe5e51b7Smrg 189fe5e51b7Smrg#ifdef DEBUG 190fe5e51b7Smrg ErrorF("ENTER MGACRTC2Set\n"); 191fe5e51b7Smrg#endif 192fe5e51b7Smrg 193fe5e51b7Smrg 194fe5e51b7Smrg /* This writes to the registers manually */ 195fe5e51b7Smrg OUTREG(MGAREG_C2CTL, pReg->crtc2[MGAREG2_C2CTL]); 196fe5e51b7Smrg OUTREG(MGAREG_C2DATACTL,pReg->crtc2[MGAREG2_C2DATACTL]); 197fe5e51b7Smrg 198fe5e51b7Smrg 199fe5e51b7Smrg /* Horizontal Value*/ 200fe5e51b7Smrg OUTREG(MGAREG_C2HPARAM, pReg->crtc2[MGAREG2_C2HPARAM]); 201fe5e51b7Smrg OUTREG(MGAREG_C2HSYNC, pReg->crtc2[MGAREG2_C2HSYNC]); 202fe5e51b7Smrg 203fe5e51b7Smrg 204fe5e51b7Smrg /*Vertical Value*/ 205fe5e51b7Smrg OUTREG(MGAREG_C2VPARAM, pReg->crtc2[MGAREG2_C2VPARAM]); 206fe5e51b7Smrg OUTREG(MGAREG_C2VSYNC, pReg->crtc2[MGAREG2_C2VSYNC]); 207fe5e51b7Smrg 208fe5e51b7Smrg /** Offset value*/ 209fe5e51b7Smrg 210fe5e51b7Smrg OUTREG(MGAREG_C2OFFSET, pReg->crtc2[MGAREG2_C2OFFSET]); 211fe5e51b7Smrg#ifdef DEBUG 212fe5e51b7Smrg ErrorF("EXIT MGACRTC2Set\n"); 213fe5e51b7Smrg#endif 214fe5e51b7Smrg 215fe5e51b7Smrg} 216fe5e51b7Smrg 217fe5e51b7Smrg 218fe5e51b7Smrg/* Set CRTC2 on the right output */ 219fe5e51b7Smrgvoid MGAEnableSecondOutPut(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo) 220fe5e51b7Smrg{ 221fe5e51b7Smrg CARD8 ucByte, ucXDispCtrl; 222fe5e51b7Smrg CARD32 ulC2CTL; 223fe5e51b7Smrg MGAPtr pMga = MGAPTR(pScrn); 224fe5e51b7Smrg MGARegPtr pReg; 225fe5e51b7Smrg pReg = &pMga->ModeReg; 226fe5e51b7Smrg#ifdef DEBUG 227fe5e51b7Smrg ErrorF("ENTER MGAEnableSecondOutPut\n"); 228fe5e51b7Smrg#endif 229fe5e51b7Smrg 230fe5e51b7Smrg 231fe5e51b7Smrg /* Route Video PLL on second CRTC */ 232fe5e51b7Smrg ulC2CTL = INREG( MGAREG_C2CTL); 233fe5e51b7Smrg 234fe5e51b7Smrg /*--- Disable Pixel clock oscillations On Crtc1 */ 235fe5e51b7Smrg OUTREG( MGAREG_C2CTL, ulC2CTL | MGAREG_C2CTL_PIXCLKDIS_MASK); 236fe5e51b7Smrg /*--- Have to wait minimum time (2 acces will be ok) */ 237fe5e51b7Smrg (void) INREG( MGAREG_Status); 238fe5e51b7Smrg (void) INREG( MGAREG_Status); 239fe5e51b7Smrg 240fe5e51b7Smrg 241fe5e51b7Smrg ulC2CTL &= ~MGAREG_C2CTL_PIXCLKSEL_MASK; 242fe5e51b7Smrg ulC2CTL &= ~MGAREG_C2CTL_PIXCLKSELH_MASK; 243fe5e51b7Smrg 244fe5e51b7Smrg ulC2CTL |= MGAREG_C2CTL_PIXCLKSEL_VIDEOPLL; 245fe5e51b7Smrg 246fe5e51b7Smrg 247fe5e51b7Smrg OUTREG( MGAREG_C2CTL, ulC2CTL); 248fe5e51b7Smrg 249fe5e51b7Smrg /*--- Enable Pixel clock oscillations on CRTC2*/ 250fe5e51b7Smrg ulC2CTL &= ~MGAREG_C2CTL_PIXCLKDIS_MASK; 251fe5e51b7Smrg OUTREG( MGAREG_C2CTL, ulC2CTL); 252fe5e51b7Smrg 253fe5e51b7Smrg 254fe5e51b7Smrg /* We don't use MISC synch pol, must be 0*/ 255fe5e51b7Smrg ucByte = inMGAdreg( MGAREG_MISC_READ); 256fe5e51b7Smrg 257fe5e51b7Smrg OUTREG8(MGAREG_MISC_WRITE, (CARD8)(ucByte & ~(HSYNCPOL| VSYNCPOL) )); 258fe5e51b7Smrg 259fe5e51b7Smrg 260fe5e51b7Smrg 261fe5e51b7Smrg 262fe5e51b7Smrg /* Set Rset to 0.7 V*/ 263fe5e51b7Smrg ucByte = inMGAdac(MGA1064_GEN_IO_CTL); 264fe5e51b7Smrg ucByte &= ~0x40; 265fe5e51b7Smrg pReg->DacRegs[MGA1064_GEN_IO_CTL] = ucByte; 266fe5e51b7Smrg outMGAdac (MGA1064_GEN_IO_CTL, ucByte); 267fe5e51b7Smrg 268fe5e51b7Smrg ucByte = inMGAdac( MGA1064_GEN_IO_DATA); 269fe5e51b7Smrg ucByte &= ~0x40; 270fe5e51b7Smrg pReg->DacRegs[MGA1064_GEN_IO_DATA]= ucByte; 271fe5e51b7Smrg outMGAdac (MGA1064_GEN_IO_DATA, ucByte); 272fe5e51b7Smrg 273fe5e51b7Smrg /* Since G550 can swap outputs at BIOS initialisation, we must check which 274fe5e51b7Smrg * DAC is 'logically' used as the secondary (don't assume its DAC2 anymore) */ 275fe5e51b7Smrg 276fe5e51b7Smrg ulC2CTL = INREG(MGAREG_C2CTL); 277fe5e51b7Smrg ucXDispCtrl = inMGAdac(MGA1064_DISP_CTL); 278fe5e51b7Smrg 279fe5e51b7Smrg ucXDispCtrl &= ~MGA1064_DISP_CTL_DAC2OUTSEL_MASK; 280fe5e51b7Smrg 281fe5e51b7Smrg if (!pMga->SecondOutput) { 282fe5e51b7Smrg /* Route Crtc2 on Output1 */ 283fe5e51b7Smrg ucXDispCtrl |= MGA1064_DISP_CTL_DAC2OUTSEL_CRTC1; 284fe5e51b7Smrg ulC2CTL |= MGAREG_C2CTL_CRTCDACSEL_CRTC2; 285fe5e51b7Smrg } 286fe5e51b7Smrg else { 287fe5e51b7Smrg /* Route Crtc2 on Output2*/ 288fe5e51b7Smrg ucXDispCtrl |= MGA1064_DISP_CTL_DAC2OUTSEL_CRTC2; 289fe5e51b7Smrg ulC2CTL &= ~MGAREG_C2CTL_CRTCDACSEL_MASK; 290fe5e51b7Smrg } 291fe5e51b7Smrg 292fe5e51b7Smrg /* Enable CRTC2*/ 293fe5e51b7Smrg ulC2CTL |= MGAREG_C2CTL_C2_EN; 294fe5e51b7Smrg 295fe5e51b7Smrg pReg->dac2[ MGA1064_DISP_CTL - 0x80] = ucXDispCtrl; 296fe5e51b7Smrg 297fe5e51b7Smrg 298fe5e51b7Smrg 299fe5e51b7Smrg OUTREG( MGAREG_C2CTL, ulC2CTL); 300fe5e51b7Smrg 301fe5e51b7Smrg /* Set DAC2 Synch polarity*/ 302fe5e51b7Smrg ucByte = inMGAdac( MGA1064_SYNC_CTL); 303fe5e51b7Smrg ucByte &= ~(XSYNCCTRL_DAC2HSPOL_MASK | XSYNCCTRL_DAC2VSPOL_MASK); 304fe5e51b7Smrg if ( !(pModeInfo->flSignalMode & POS_HSYNC) ) 305fe5e51b7Smrg { 306fe5e51b7Smrg ucByte |= XSYNCCTRL_DAC2HSPOL_NEG; 307fe5e51b7Smrg } 308fe5e51b7Smrg if ( !(pModeInfo->flSignalMode & POS_VSYNC) ) 309fe5e51b7Smrg { 310fe5e51b7Smrg ucByte |= XSYNCCTRL_DAC2VSPOL_NEG; 311fe5e51b7Smrg } 312fe5e51b7Smrg 313fe5e51b7Smrg /* Enable synch output*/ 314fe5e51b7Smrg ucByte &= ~(XSYNCCTRL_DAC2HSOFF_MASK | XSYNCCTRL_DAC2VSOFF_MASK); 315fe5e51b7Smrg pReg->dac2[ MGA1064_SYNC_CTL - 0x80] = ucByte; 316fe5e51b7Smrg 317fe5e51b7Smrg /* Power up DAC2, Fifo. 318fe5e51b7Smrg * The TMDS is powered down here, which is likely wrong. 319fe5e51b7Smrg */ 320fe5e51b7Smrg pReg->dac2[MGA1064_PWR_CTL - 0x80] = 321fe5e51b7Smrg MGA1064_PWR_CTL_DAC2_EN | 322fe5e51b7Smrg MGA1064_PWR_CTL_VID_PLL_EN | 323fe5e51b7Smrg MGA1064_PWR_CTL_RFIFO_EN | 324fe5e51b7Smrg MGA1064_PWR_CTL_CFIFO_EN; 325fe5e51b7Smrg 326fe5e51b7Smrg 327fe5e51b7Smrg#ifdef DEBUG 328fe5e51b7Smrg ErrorF("EXIT MGAEnableSecondOutPut\n"); 329fe5e51b7Smrg#endif 330fe5e51b7Smrg} 331fe5e51b7Smrg 332fe5e51b7Smrg 333fe5e51b7Smrg 334fe5e51b7Smrg 335fe5e51b7Smrg 336fe5e51b7Smrgvoid MGACRTC2GetPitch (ScrnInfoPtr pScrn, xMODEINFO *pModeInfo) 337fe5e51b7Smrg{ 338fe5e51b7Smrg CARD32 ulOffset; 339fe5e51b7Smrg MGAPtr pMga = MGAPTR(pScrn); 340fe5e51b7Smrg MGARegPtr pReg; 341fe5e51b7Smrg 342fe5e51b7Smrg pReg = &pMga->ModeReg; 343fe5e51b7Smrg#ifdef DEBUG 344fe5e51b7Smrg ErrorF("ENTER MGACRTC2GetPitch\n"); 345fe5e51b7Smrg#endif 346fe5e51b7Smrg 347fe5e51b7Smrg 348fe5e51b7Smrg switch(pModeInfo->ulBpp) 349fe5e51b7Smrg { 350fe5e51b7Smrg case 15: 351fe5e51b7Smrg case 16: 352fe5e51b7Smrg ulOffset = pModeInfo->ulFBPitch * 2; 353fe5e51b7Smrg break; 354fe5e51b7Smrg case 32: 355fe5e51b7Smrg ulOffset = pModeInfo->ulFBPitch * 4; 356fe5e51b7Smrg break; 357fe5e51b7Smrg default: /* Muffle compiler */ 358fe5e51b7Smrg ulOffset = pModeInfo->ulFBPitch; 359fe5e51b7Smrg break; 360fe5e51b7Smrg } 361fe5e51b7Smrg 362fe5e51b7Smrg pReg->crtc2[MGAREG2_C2OFFSET] = ulOffset; 363fe5e51b7Smrg 364fe5e51b7Smrg#ifdef DEBUG 365fe5e51b7Smrg ErrorF("EXIT MGACRTC2GetPitch\n"); 366fe5e51b7Smrg#endif 367fe5e51b7Smrg 368fe5e51b7Smrg} 369fe5e51b7Smrg 370fe5e51b7Smrgvoid MGACRTC2SetPitch (ScrnInfoPtr pScrn, xMODEINFO *pModeInfo) 371fe5e51b7Smrg{ 372fe5e51b7Smrg 373fe5e51b7Smrg MGAPtr pMga = MGAPTR(pScrn); 374fe5e51b7Smrg MGARegPtr pReg; 375fe5e51b7Smrg pReg = &pMga->ModeReg; 376fe5e51b7Smrg 377fe5e51b7Smrg#ifdef DEBUG 378fe5e51b7Smrg ErrorF("ENTER CRCT2SetPitch\n"); 379fe5e51b7Smrg#endif 380fe5e51b7Smrg 381fe5e51b7Smrg 382fe5e51b7Smrg OUTREG(MGAREG_C2OFFSET, pReg->crtc2[MGAREG2_C2OFFSET]); 383fe5e51b7Smrg#ifdef DEBUG 384fe5e51b7Smrg ErrorF("EXIT CRCT2SetPitch\n"); 385fe5e51b7Smrg#endif 386fe5e51b7Smrg 387fe5e51b7Smrg} 388fe5e51b7Smrg 389fe5e51b7Smrg 390fe5e51b7Smrg /* Set Display Start*/ 391fe5e51b7Smrg /* base in bytes*/ 392fe5e51b7Smrgvoid MGACRTC2GetDisplayStart (ScrnInfoPtr pScrn, xMODEINFO *pModeInfo, CARD32 base, CARD32 ulX, CARD32 ulY) 393fe5e51b7Smrg{ 394fe5e51b7Smrg 395fe5e51b7Smrg CARD32 ulAddress; 396fe5e51b7Smrg MGAPtr pMga = MGAPTR(pScrn); 397fe5e51b7Smrg MGARegPtr pReg; 398fe5e51b7Smrg pReg = &pMga->ModeReg; 399fe5e51b7Smrg 400fe5e51b7Smrg#ifdef DEBUG 401fe5e51b7Smrg ErrorF("ENTER MGACRTC2GetDisplayStart\n"); 402fe5e51b7Smrg#endif 403fe5e51b7Smrg 404fe5e51b7Smrg 405fe5e51b7Smrg pReg = &pMga->ModeReg; 406fe5e51b7Smrg 407fe5e51b7Smrg ulAddress = (pModeInfo->ulFBPitch * ulY + ulX); 408fe5e51b7Smrg switch(pModeInfo->ulBpp) 409fe5e51b7Smrg { 410fe5e51b7Smrg case 15: 411fe5e51b7Smrg case 16: 412fe5e51b7Smrg ulAddress <<= 1; 413fe5e51b7Smrg break; 414fe5e51b7Smrg case 32: 415fe5e51b7Smrg ulAddress <<= 2; 416fe5e51b7Smrg break; 417fe5e51b7Smrg } 418fe5e51b7Smrg 419fe5e51b7Smrg pReg->crtc2[MGAREG2_C2STARTADD0] = ulAddress + base; 420fe5e51b7Smrg#ifdef DEBUG 421fe5e51b7Smrg ErrorF("EXIT MGACRTC2GetDisplayStart\n"); 422fe5e51b7Smrg#endif 423fe5e51b7Smrg 424fe5e51b7Smrg} 425fe5e51b7Smrg 426fe5e51b7Smrgvoid MGACRTC2SetDisplayStart (ScrnInfoPtr pScrn, xMODEINFO *pModeInfo, CARD32 base, CARD32 ulX, CARD32 ulY) 427fe5e51b7Smrg{ 428fe5e51b7Smrg MGAPtr pMga = MGAPTR(pScrn); 429fe5e51b7Smrg MGARegPtr pReg; 430fe5e51b7Smrg pReg = &pMga->ModeReg; 431fe5e51b7Smrg#ifdef DEBUG 432fe5e51b7Smrg ErrorF("ENTER MGACRTC2SetDisplayStart\n"); 433fe5e51b7Smrg#endif 434fe5e51b7Smrg 435fe5e51b7Smrg OUTREG(MGAREG_C2STARTADD0, pReg->crtc2[MGAREG2_C2STARTADD0]); 436fe5e51b7Smrg#ifdef DEBUG 437fe5e51b7Smrg ErrorF("EXIT MGACRTC2SetDisplayStart\n"); 438fe5e51b7Smrg#endif 439fe5e51b7Smrg 440fe5e51b7Smrg} 441fe5e51b7Smrg 442fe5e51b7Smrg 443fe5e51b7Smrg 444fe5e51b7Smrg 445fe5e51b7Smrg 446fe5e51b7Smrg 447fe5e51b7Smrg 448fe5e51b7Smrg 449fe5e51b7Smrg 450fe5e51b7Smrg 451fe5e51b7Smrg 452