summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuc Verhaegen <libv@skynet.be>2006-08-22 22:46:57 +0200
committerLuc Verhaegen <libv@skynet.be>2006-08-22 22:46:57 +0200
commit46edb4dc2773ac07088ebf00c653f5418f7f8887 (patch)
tree9368a68e20997bc491246ce2265f301c6d822180
parent754560ede562304e224a7bba8486f3523006ce81 (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.c159
-rw-r--r--src/via_mode.c6
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);