diff options
author | Ondrej Zary <linux@rainbow-software.org> | 2010-12-03 19:23:51 -0500 |
---|---|---|
committer | Matt Turner <mattst88@gmail.com> | 2011-02-28 15:02:30 -0500 |
commit | 9d3769bed020e9796e51411c63de337da5073bb4 (patch) | |
tree | a36a13e0bdea95ab036a7299b53d49f5b81dc71c | |
parent | 5013a760db93d08b0bb87b6ad2537b1073cedf36 (diff) |
Don't assume that FB address registers are initialized properly
https://bugs.freedesktop.org/show_bug.cgi?id=28249
ark driver does not work with Hercules Stingray 64 card (ark2000pv).
X fails to start with:
[...]
(II) ark(0): vgaHWGetIOBase: hwp->IOBase is 0x03d0, hwp->PIOOffset is
0x0000
(II) ark(0): Creating default Display subsection in Screen section
"Default Screen Section" for depth/fbbpp 24/32
(==) ark(0): Depth 24, (--) framebuffer bpp 32
(==) ark(0): RGB weight 888
(==) ark(0): Default visual is TrueColor
(**) ark(0): Chipset: "ark2000pv"
(--) ark(0): Framebuffer @ 0xe5e50000
(==) ark(0): Using gamma correction (1.0, 1.0, 1.0)
(--) ark(0): Detected 2048 bytes video ram
[...]
Fatal server error:
AddScreen/ScreenInit failed for driver 0
Comparing with lspci, the framebuffer address is wrong:
00:0f.0 VGA compatible controller: ARK Logic Inc 2000PV [Stingray] (prog-if 00 [VGA controller])
Flags: medium devsel
Memory at e5000000 (32-bit, prefetchable) [size=4M]
[virtual] Expansion ROM at 1c000000 [disabled] [size=64K]
Reviewed-by: Adam Jackson <ajax@redhat.com>
-rw-r--r-- | src/ark.h | 1 | ||||
-rw-r--r-- | src/ark_driver.c | 30 |
2 files changed, 19 insertions, 12 deletions
@@ -34,7 +34,6 @@ typedef struct _ARKRec { #endif EntityInfoPtr pEnt; CARD32 IOAddress; - CARD32 FBAddress; unsigned char * FBBase; unsigned char * MMIOBase; unsigned long videoRam; diff --git a/src/ark_driver.c b/src/ark_driver.c index 5de3b9a..fec3e1a 100644 --- a/src/ark_driver.c +++ b/src/ark_driver.c @@ -363,14 +363,14 @@ static Bool ARKPreInit(ScrnInfoPtr pScrn, int flags) outb(hwp->PIOOffset + hwp->IOBase + 5, tmp & 0x7f); modinx(hwp->PIOOffset + 0x3c4, 0x1d, 0x01, 0x01); - /* use membase's later on ??? */ - pARK->FBAddress = (rdinx(hwp->PIOOffset + 0x3c4, 0x13) << 16) + - (rdinx(hwp->PIOOffset + 0x3c4, 0x14) << 24); - - pScrn->memPhysBase = pARK->FBAddress; +#ifndef XSERVER_LIBPCIACCESS + pScrn->memPhysBase = pARK->PciInfo->memBase[0]; +#else + pScrn->memPhysBase = pARK->PciInfo->regions[0].base_addr; +#endif xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Framebuffer @ 0x%lx\n", - (unsigned long)pARK->FBAddress); + (unsigned long)pScrn->memPhysBase); if (!xf86SetGamma(pScrn, gzeros)) return FALSE; @@ -748,8 +748,13 @@ static Bool ARKModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) new->sr10 = rdinx(isaIOBase + 0x3c4, 0x10) & ~0x1f; new->sr10 |= 0x1f; - new->sr13 = pARK->FBAddress >> 16; - new->sr14 = pARK->FBAddress >> 24; +#ifndef XSERVER_LIBPCIACCESS + new->sr13 = pARK->PciInfo->memBase[0] >> 16; + new->sr14 = pARK->PciInfo->memBase[0] >> 24; +#else + new->sr13 = pARK->PciInfo->regions[0].base_addr >> 16; + new->sr14 = pARK->PciInfo->regions[0].base_addr >> 24; +#endif new->sr12 = rdinx(isaIOBase + 0x3c4, 0x12) & ~0x03; switch (pScrn->videoRam) { @@ -1022,7 +1027,7 @@ static Bool ARKMapMem(ScrnInfoPtr pScrn) pARK->PciTag, 0xb8000, 0x8000); pARK->FBBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER, - pARK->PciTag, pARK->FBAddress, + pARK->PciTag, pARK->PciInfo->memBase[0], pScrn->videoRam * 1024); #else @@ -1032,14 +1037,17 @@ static Bool ARKMapMem(ScrnInfoPtr pScrn) { void** result = (void**)&pARK->FBBase; int err = pci_device_map_range(pARK->PciInfo, - pARK->FBAddress, + pARK->PciInfo->regions[0].base_addr, pScrn->videoRam * 1024, PCI_DEV_MAP_FLAG_WRITABLE | PCI_DEV_MAP_FLAG_WRITE_COMBINE, result); - if (err) + if (err) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Cound not map framebuffer: %d\n", err); return FALSE; + } } #endif |