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