diff -urN src.orig/mga_driver.c src/mga_driver.c --- src.orig/mga_driver.c 2008-06-30 21:59:50.000000000 +0100 +++ src/mga_driver.c 2008-11-12 15:24:59.000000000 +0000 @@ -1454,6 +1454,10 @@ xf86PrintEDID(MonInfo); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "end of I2C Monitor info\n"); xf86SetDDCproperties(pScrn, MonInfo); + + MGARestore(pScrn); + MGAUnmapMem(pScrn); + return MonInfo; } @@ -2990,30 +2994,51 @@ #ifdef XSERVER_LIBPCIACCESS struct pci_device *const dev = pMga->PciInfo; struct pci_mem_region *region; - void **memory[2]; - int i, err; + int err; #endif if (!pMga->FBDev) { #ifdef XSERVER_LIBPCIACCESS - memory[pMga->io_bar] = &pMga->IOBase; - memory[pMga->framebuffer_bar] = &pMga->FbBase; - for (i = 0; i < 2; i++) { - region = &dev->regions[i]; - err = pci_device_map_range(dev, - region->base_addr, region->size, - PCI_DEV_MAP_FLAG_WRITABLE, - memory[i]); + pciaddr_t fbaddr = pMga->FbAddress; + pciaddr_t fbsize = pMga->FbMapSize; + err = pci_device_map_range(dev, + fbaddr, fbsize, + PCI_DEV_MAP_FLAG_WRITABLE, + (void **)&pMga->FbBase); - if (err) { + if (err) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Unable to map BAR %i. %s (%d)\n", - i, strerror(err), err); + "Unable to map Framebuffer %08llX %llx. %s (%d)\n", (long long)fbaddr, (long long)fbsize, + strerror(err), err); return FALSE; - } - } + } + else + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "MAPPED Framebuffer %08llX %llx to %p.\n", (long long)fbaddr, (long long)fbsize, pMga->FbBase); + + + + if(pMga->entityPrivate->mappedIOUsage == 0) + { + region = &dev->regions[pMga->io_bar]; + err = pci_device_map_range(dev, + region->base_addr, region->size, + PCI_DEV_MAP_FLAG_WRITABLE, + &pMga->entityPrivate->mappedIOBase); + + if (err) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Unable to map IO Region %i. %s (%d)\n", + pMga->io_bar, strerror(err), err); + return FALSE; + } + } + + pMga->entityPrivate->mappedIOUsage ++; + pMga->IOBase = pMga->entityPrivate->mappedIOBase; + #else /* * For Alpha, we need to map SPARSE memory, since we need @@ -3055,16 +3080,23 @@ if (pMga->iload_bar != -1) { #ifdef XSERVER_LIBPCIACCESS region = &dev->regions[pMga->iload_bar]; - err = pci_device_map_range(dev, + + if(pMga->entityPrivate->mappedILOADUsage == 0) + { + err = pci_device_map_range(dev, region->base_addr, region->size, PCI_DEV_MAP_FLAG_WRITABLE, - (void *) &pMga->ILOADBase); - if (err) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Unable to map BAR 2 (ILOAD region). %s (%d)\n", - strerror(err), err); - return FALSE; + (void *) &pMga->entityPrivate->mappedILOADBase); + if (err) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Unable to map BAR 2 (ILOAD region). %s (%d)\n", + strerror(err), err); + return FALSE; + } } + + pMga->ILOADBase = pMga->entityPrivate->mappedILOADBase; + pMga->entityPrivate->mappedILOADUsage ++; #else pMga->ILOADBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO | VIDMEM_MMIO_32BIT | @@ -3094,10 +3126,17 @@ if (!pMga->FBDev) { #ifdef XSERVER_LIBPCIACCESS - pci_device_unmap_range(dev, pMga->IOBase, - dev->regions[pMga->io_bar].size); + pMga->entityPrivate->mappedIOUsage --; + if(pMga->entityPrivate->mappedIOUsage == 0) + { + pci_device_unmap_range(dev, pMga->IOBase, + dev->regions[pMga->io_bar].size); + pMga->entityPrivate->mappedIOBase = NULL; + } + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "UNMAPPING framebuffer 0x%08llX, %p.\n", (long long)pMga->FbBase, pMga->FbMapSize); pci_device_unmap_range(dev, pMga->FbBase, - dev->regions[pMga->framebuffer_bar].size); + pMga->FbMapSize); #else xf86UnMapVidMem(pScrn->scrnIndex, (pointer)pMga->IOBase, 0x4000); xf86UnMapVidMem(pScrn->scrnIndex, (pointer)pMga->FbBase, pMga->FbMapSize); @@ -3110,8 +3149,14 @@ if ((pMga->iload_bar != -1) && (pMga->ILOADBase != NULL)) { #ifdef XSERVER_LIBPCIACCESS - pci_device_unmap_range(dev, pMga->ILOADBase, + pMga->entityPrivate->mappedILOADUsage --; + if(pMga->entityPrivate->mappedILOADUsage == 0) + { + pci_device_unmap_range(dev, pMga->ILOADBase, dev->regions[pMga->iload_bar].size); + pMga->entityPrivate->mappedILOADBase = NULL; + } + #else xf86UnMapVidMem(pScrn->scrnIndex, (pointer)pMga->ILOADBase, 0x800000); #endif diff -urN src.orig/mga.h src/mga.h --- src.orig/mga.h 2008-06-30 21:55:47.000000000 +0100 +++ src/mga.h 2008-11-12 15:24:59.000000000 +0000 @@ -333,6 +333,13 @@ int mastervideoRam; int slavevideoRam; Bool directRenderingEnabled; + + void * mappedIOBase; + int mappedIOUsage; + + void * mappedILOADBase; + int mappedILOADUsage; + ScrnInfoPtr pScrn_1; ScrnInfoPtr pScrn_2; } MGAEntRec, *MGAEntPtr;