diff -urN ~/originalMGA/xserver-xorg-video-mga-1.4.11.dfsg/src/mga_driver.c ~/WorkingMGA/xserver-xorg-video-mga-1.4.11.dfsg/src/mga_driver.c --- /home/tadams/originalMGA/xserver-xorg-video-mga-1.4.11.dfsg/src/mga_driver.c 2009-07-28 00:11:40.000000000 -0500 +++ /home/tadams/WorkingMGA/xserver-xorg-video-mga-1.4.11.dfsg/src/mga_driver.c 2010-05-06 09:09:14.000000000 -0500 @@ -2791,30 +2791,56 @@ #ifdef XSERVER_LIBPCIACCESS struct pci_device *const dev = pMga->PciInfo; struct pci_mem_region *region; - void **memory[2]; int i, 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) { 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 %08llX.\n", (long long)fbaddr, (long long)fbsize, (long long)pMga->FbBase); + + + if(pMga->entityPrivate == NULL || 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->IOBase); + + if (err) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Unable to map IO Region %i. %s (%d)\n", + pMga->io_bar, strerror(err), err); + return FALSE; + } + + if(pMga->entityPrivate != NULL) + { + pMga->entityPrivate->mappedIOBase = pMga->IOBase; + } + } + else + pMga->IOBase = pMga->entityPrivate->mappedIOBase; + + if(pMga->entityPrivate != NULL) + pMga->entityPrivate->mappedIOUsage ++; #else /* * For Alpha, we need to map SPARSE memory, since we need @@ -2855,16 +2881,30 @@ pMga->ILOADBase = NULL; if (pMga->iload_bar != -1) { #ifdef XSERVER_LIBPCIACCESS - region = &dev->regions[pMga->iload_bar]; - 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; + region = &dev->regions[pMga->iload_bar]; + if(pMga->entityPrivate == NULL || 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; + } + + if(pMga->entityPrivate != NULL) + pMga->entityPrivate->mappedILOADBase = pMga->ILOADBase; + } + else + pMga->ILOADBase = pMga->entityPrivate->mappedILOADBase; + + if(pMga->entityPrivate != NULL) + pMga->entityPrivate->mappedILOADUsage ++; + } #else pMga->ILOADBase = xf86MapPciMem(pScrn->scrnIndex, @@ -2873,9 +2913,6 @@ pMga->PciTag, pMga->ILOADAddress, 0x800000); #endif - } - - return TRUE; } @@ -2895,10 +2932,23 @@ if (!pMga->FBDev) { #ifdef XSERVER_LIBPCIACCESS - pci_device_unmap_range(dev, pMga->IOBase, - dev->regions[pMga->io_bar].size); + if(pMga->entityPrivate != NULL) + pMga->entityPrivate->mappedIOUsage --; + + if(pMga->entityPrivate == NULL || pMga->entityPrivate->mappedIOUsage == 0) + { + pci_device_unmap_range(dev, pMga->IOBase, + dev->regions[pMga->io_bar].size); + + if(pMga->entityPrivate != NULL) + pMga->entityPrivate->mappedIOBase = NULL; + } + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "UNMAPPING framebuffer 0x%08llX, 0x%llX.\n", (long long)pMga->FbBase, (long long)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); @@ -2911,8 +2961,17 @@ if ((pMga->iload_bar != -1) && (pMga->ILOADBase != NULL)) { #ifdef XSERVER_LIBPCIACCESS - pci_device_unmap_range(dev, pMga->ILOADBase, + if(pMga->entityPrivate != NULL) + pMga->entityPrivate->mappedILOADUsage --; + + if(pMga->entityPrivate == NULL || pMga->entityPrivate->mappedILOADUsage == 0) + { + pci_device_unmap_range(dev, pMga->ILOADBase, dev->regions[pMga->iload_bar].size); + if(pMga->entityPrivate != NULL) + pMga->entityPrivate->mappedILOADBase = NULL; + } + #else xf86UnMapVidMem(pScrn->scrnIndex, (pointer)pMga->ILOADBase, 0x800000); #endif diff -urN ~/originalMGA/xserver-xorg-video-mga-1.4.11.dfsg/src/mga.h ~/WorkingMGA/xserver-xorg-video-mga-1.4.11.dfsg/src/mga.h --- /home/tadams/originalMGA/xserver-xorg-video-mga-1.4.11.dfsg/src/mga.h 2009-07-27 19:24:51.000000000 -0500 +++ /home/tadams/WorkingMGA/xserver-xorg-video-mga-1.4.11.dfsg/src/mga.h 2010-05-06 08:51:06.000000000 -0500 @@ -333,6 +333,14 @@ int mastervideoRam; int slavevideoRam; Bool directRenderingEnabled; + + void * mappedIOBase; + int mappedIOUsage; + + void * mappedILOADBase; + int mappedILOADUsage; + + ScrnInfoPtr pScrn_1; ScrnInfoPtr pScrn_2; } MGAEntRec, *MGAEntPtr;