diff options
author | Luc Verhaegen <libv@skynet.be> | 2006-08-22 22:46:57 +0200 |
---|---|---|
committer | Luc Verhaegen <libv@skynet.be> | 2006-08-22 22:46:57 +0200 |
commit | 46edb4dc2773ac07088ebf00c653f5418f7f8887 (patch) | |
tree | 9368a68e20997bc491246ce2265f301c6d822180 | |
parent | 754560ede562304e224a7bba8486f3523006ce81 (diff) |
Implement FBEnable.
Clean up MapMMIO/MapFB/Save handling in ScreenInit. This leads to a more
correct Save/Restore cycle.
FBEnable now enables everything needed to be able to reliably read/write to the
FB. FB is now nulled at the end of MapFB, right after FBEnable.
-rw-r--r-- | src/via_driver.c | 159 | ||||
-rw-r--r-- | src/via_mode.c | 6 |
2 files changed, 88 insertions, 77 deletions
diff --git a/src/via_driver.c b/src/via_driver.c index 54549b6..cec3887 100644 --- a/src/via_driver.c +++ b/src/via_driver.c @@ -69,7 +69,6 @@ static void VIASave(ScrnInfoPtr pScrn); static void VIARestore(ScrnInfoPtr pScrn); static void VIAWriteMode(ScrnInfoPtr pScrn, DisplayModePtr mode); static Bool VIACloseScreen(int scrnIndex, ScreenPtr pScreen); -static Bool VIASaveScreen(ScreenPtr pScreen, int mode); static Bool VIAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv); static int VIAInternalScreenInit(ScrnInfoPtr pScrn, ScreenPtr pScreen); @@ -80,8 +79,8 @@ static void VIADPMS(ScrnInfoPtr pScrn, int mode, int flags); static const OptionInfoRec * VIAAvailableOptions(int chipid, int busid); static Bool VIAMapMMIO(ScrnInfoPtr pScrn); -static Bool VIAMapFB(ScrnInfoPtr pScrn); static void VIAUnmapMem(ScrnInfoPtr pScrn); +static void ViaFBEnable(vgaHWPtr hwp); #ifndef _X_EXPORT #define _X_EXPORT @@ -1534,6 +1533,8 @@ VIAEnterVT(int scrnIndex, int flags) VIASave(pScrn); + ViaFBEnable(hwp); + ViaOutputsPower(pScrn, FALSE); VIAWriteMode(pScrn, pScrn->currentMode); @@ -1793,6 +1794,30 @@ VIARestore(ScrnInfoPtr pScrn) vgaHWProtect(pScrn, FALSE); } +/* + * FIXME: This is a hack to get rid of offending wrongly sized + * MTRR regions set up by the VIA BIOS. Should be taken care of + * in the OS support layer. + */ +static void +ViaBrokenMTRRHack(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + CARD8 *tmp; + + VIAFUNC(pScrn->scrnIndex); + + tmp = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, pVia->PciTag, + pVia->FrameBufferBase, pVia->videoRambytes); + xf86UnMapVidMem(pScrn->scrnIndex, (pointer)tmp, pVia->videoRambytes); + + /* And, as if this wasn't enough, 2.6 series kernels doesn't remove MTRR + * regions on the first attempt. Try again. */ + tmp = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, pVia->PciTag, + pVia->FrameBufferBase, pVia->videoRambytes); + xf86UnMapVidMem(pScrn->scrnIndex, (pointer)tmp, pVia->videoRambytes); +} + static Bool VIAMapMMIO(ScrnInfoPtr pScrn) { @@ -1836,15 +1861,15 @@ VIAMapMMIO(ScrnInfoPtr pScrn) val = hwp->readMiscOut(hwp); hwp->writeMiscOut(hwp, val | 0x01); - - /* Unlock Extended IO Space */ - hwp->writeSeq(hwp, 0x10, 0x01); - /* Enable MMIO */ - if (pVia->IsSecondary) - ViaSeqMask(hwp, 0x1A, 0x38, 0x38); - else - ViaSeqMask(hwp, 0x1A, 0x68, 0x68); + /* Unlock Extended IO Space */ + hwp->writeSeq(hwp, 0x10, 0x01); + + /* Enable MMIO -- probably very VT3122/VT7205 specific */ + if (pVia->IsSecondary) + ViaSeqMask(hwp, 0x1A, 0x30, 0x30); + else + ViaSeqMask(hwp, 0x1A, 0x60, 0x60); vgaHWGetIOBase(hwp); } @@ -1852,68 +1877,65 @@ VIAMapMMIO(ScrnInfoPtr pScrn) return TRUE; } +/* + * Gets called at MapFB (ScreenInit) and EnterVTs + */ +static void +ViaFBEnable(vgaHWPtr hwp) +{ + /* Enable writing to all VGA memory planes */ + hwp->writeSeq(hwp, 0x02, 0x0F); + + /* Enable Extended VGA memory */ + hwp->writeSeq(hwp, 0x04, 0x0E); + + /* Enable Extended Memory access */ + ViaSeqMask(hwp, 0x1A, 0x08, 0x08); +} -static Bool VIAMapFB(ScrnInfoPtr pScrn) +/* + * + */ +static Bool +ViaMapFB(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); VIAFUNC(pScrn->scrnIndex); + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "mapping framebuffer @ 0x%lx with size 0x%lx\n", pVia->FrameBufferBase, pVia->videoRambytes); - if (pVia->videoRambytes) { - - /* - * FIXME: This is a hack to get rid of offending wrongly sized - * MTRR regions set up by the VIA BIOS. Should be taken care of - * in the OS support layer. - */ - - unsigned char *tmp; - tmp = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, - pVia->PciTag, pVia->FrameBufferBase, - pVia->videoRambytes); - xf86UnMapVidMem(pScrn->scrnIndex, (pointer)tmp, - pVia->videoRambytes); - - /* - * And, as if this wasn't enough, 2.6 series kernels doesn't - * remove MTRR regions on the first attempt. Try again. - */ + pVia->FBBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER, + pVia->PciTag, pVia->FrameBufferBase, + pVia->videoRambytes); + if (!pVia->FBBase) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Internal error: could not map framebuffer\n"); + return FALSE; + } - tmp = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, - pVia->PciTag, pVia->FrameBufferBase, - pVia->videoRambytes); - xf86UnMapVidMem(pScrn->scrnIndex, (pointer)tmp, - pVia->videoRambytes); + pVia->FBFreeStart = + (pScrn->displayWidth * pScrn->bitsPerPixel >> 3) * pScrn->virtualY; + pVia->FBFreeEnd = pVia->videoRambytes; - /* - * End of hack. - */ + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Frame buffer start: %p, free start: 0x%x end: 0x%x\n", + pVia->FBBase, pVia->FBFreeStart, pVia->FBFreeEnd); - pVia->FBBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER, - pVia->PciTag, pVia->FrameBufferBase, - pVia->videoRambytes); + pScrn->memPhysBase = pVia->PciInfo->memBase[0]; - if (!pVia->FBBase) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Internal error: could not map framebuffer\n"); - return FALSE; - } + if (pVia->IsSecondary) + pScrn->fbOffset = pScrn->videoRam << 10; + else + pScrn->fbOffset = 0; - pVia->FBFreeStart = (pScrn->displayWidth * pScrn->bitsPerPixel >> 3) * - pScrn->virtualY; - pVia->FBFreeEnd = pVia->videoRambytes; + ViaFBEnable(VGAHWPTR(pScrn)); - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Frame buffer start: %p, free start: 0x%x end: 0x%x\n", - pVia->FBBase, pVia->FBFreeStart, pVia->FBFreeEnd); - } - - pScrn->memPhysBase = pVia->PciInfo->memBase[0]; - pScrn->fbOffset = 0; - if(pVia->IsSecondary) pScrn->fbOffset = pScrn->videoRam << 10; + /* Stop previous content from disturbing users. */ + memset(VIAPTR(pScrn)->FBBase, 0x00, + pScrn->virtualX * pScrn->virtualY * (pScrn->bitsPerPixel >> 3)); return TRUE; } @@ -2031,27 +2053,23 @@ VIAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) VIAFUNC(scrnIndex); - if (!VIAMapFB(pScrn)) - return FALSE; - + ViaBrokenMTRRHack(pScrn); if (!VIAMapMMIO(pScrn)) return FALSE; VIASave(pScrn); + if (!ViaMapFB(pScrn)) + return FALSE; + vgaHWUnlock(hwp); - vgaHWBlankScreen(pScrn, FALSE); + vgaHWSaveScreen(pScreen, SCREEN_SAVER_ON); + ViaOutputsPower(pScrn, FALSE); VIAWriteMode(pScrn, pScrn->currentMode); - - /* Stop previous content from disturbing users. */ - memset(pVia->FBBase, 0x00, - pScrn->virtualX * pScrn->virtualY * (pScrn->bitsPerPixel >> 3)); - /* Darken the screen for aesthetic reasons and set the viewport */ - VIASaveScreen(pScreen, SCREEN_SAVER_ON); pScrn->AdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); ViaDebug(scrnIndex, "- Blanked\n"); @@ -2167,7 +2185,7 @@ VIAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) vgaHWBlankScreen(pScrn, TRUE); pVia->CloseScreen = pScreen->CloseScreen; - pScreen->SaveScreen = VIASaveScreen; + pScreen->SaveScreen = vgaHWSaveScreen; pScreen->CloseScreen = VIACloseScreen; xf86DPMSInit(pScreen, VIADPMS, 0); @@ -2372,11 +2390,6 @@ static void VIAFreeScreen(int scrnIndex, int flags) vgaHWFreeHWRec(xf86Screens[scrnIndex]); } -static Bool VIASaveScreen(ScreenPtr pScreen, int mode) -{ - return vgaHWSaveScreen(pScreen, mode); -} - static void VIAAdjustFrame(int scrnIndex, int x, int y, int flags) { diff --git a/src/via_mode.c b/src/via_mode.c index 7d12096..7f502c2 100644 --- a/src/via_mode.c +++ b/src/via_mode.c @@ -1821,11 +1821,9 @@ ViaModePrimaryVGA(ScrnInfoPtr pScrn, DisplayModePtr mode) /* if (mode->Flags & V_CLKDIV2) hwp->writeSeq(hwp, 0x01, 0x09); else */ - hwp->writeSeq(hwp, 0x01, 0x01); + ViaSeqMask(hwp, 0x01, 0x01, 0xDF); - hwp->writeSeq(hwp, 0x02, 0x0F); hwp->writeSeq(hwp, 0x03, 0x00); - hwp->writeSeq(hwp, 0x04, 0x0E); /* 8bit lut / 80 text columns / wrap-around / extended mode */ ViaSeqMask(hwp, 0x15, 0xA2, 0xE2); @@ -1867,7 +1865,7 @@ ViaModePrimaryVGA(ScrnInfoPtr pScrn, DisplayModePtr mode) ViaGrMask(hwp, 0x20, 0, 0xFF); ViaGrMask(hwp, 0x21, 0, 0xFF); ViaGrMask(hwp, 0x22, 0, 0xFF); - + /* attribute registers */ hwp->writeAttr(hwp, 0x00, 0x00); hwp->writeAttr(hwp, 0x01, 0x01); |