atividmem.c revision 32b578d3
132b578d3Smrg/* 232b578d3Smrg * Copyright 1997 through 2004 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org 332b578d3Smrg * 432b578d3Smrg * Permission to use, copy, modify, distribute, and sell this software and its 532b578d3Smrg * documentation for any purpose is hereby granted without fee, provided that 632b578d3Smrg * the above copyright notice appear in all copies and that both that copyright 732b578d3Smrg * notice and this permission notice appear in supporting documentation, and 832b578d3Smrg * that the name of Marc Aurele La France not be used in advertising or 932b578d3Smrg * publicity pertaining to distribution of the software without specific, 1032b578d3Smrg * written prior permission. Marc Aurele La France makes no representations 1132b578d3Smrg * about the suitability of this software for any purpose. It is provided 1232b578d3Smrg * "as-is" without express or implied warranty. 1332b578d3Smrg * 1432b578d3Smrg * MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 1532b578d3Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO 1632b578d3Smrg * EVENT SHALL MARC AURELE LA FRANCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR 1732b578d3Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 1832b578d3Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 1932b578d3Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 2032b578d3Smrg * PERFORMANCE OF THIS SOFTWARE. 2132b578d3Smrg */ 2232b578d3Smrg 2332b578d3Smrg#ifdef HAVE_CONFIG_H 2432b578d3Smrg#include "config.h" 2532b578d3Smrg#endif 2632b578d3Smrg 2732b578d3Smrg#include "ati.h" 2832b578d3Smrg#include "atistruct.h" 2932b578d3Smrg#include "atividmem.h" 3032b578d3Smrg 3132b578d3Smrg/* Memory types for 68800's and 88800GX's */ 3232b578d3Smrgconst char *ATIMemoryTypeNames_Mach[] = 3332b578d3Smrg{ 3432b578d3Smrg "DRAM (256Kx4)", 3532b578d3Smrg "VRAM (256Kx4, x8, x16)", 3632b578d3Smrg "VRAM (256Kx16 with short shift register)", 3732b578d3Smrg "DRAM (256Kx16)", 3832b578d3Smrg "Graphics DRAM (256Kx16)", 3932b578d3Smrg "Enhanced VRAM (256Kx4, x8, x16)", 4032b578d3Smrg "Enhanced VRAM (256Kx16 with short shift register)", 4132b578d3Smrg "Unknown video memory type" 4232b578d3Smrg}; 4332b578d3Smrg 4432b578d3Smrg/* Memory types for 88800CX's */ 4532b578d3Smrgconst char *ATIMemoryTypeNames_88800CX[] = 4632b578d3Smrg{ 4732b578d3Smrg "DRAM (256Kx4, x8, x16)", 4832b578d3Smrg "EDO DRAM (256Kx4, x8, x16)", 4932b578d3Smrg "Unknown video memory type", 5032b578d3Smrg "DRAM (256Kx16 with assymetric RAS/CAS)", 5132b578d3Smrg "Unknown video memory type", 5232b578d3Smrg "Unknown video memory type", 5332b578d3Smrg "Unknown video memory type", 5432b578d3Smrg "Unknown video memory type" 5532b578d3Smrg}; 5632b578d3Smrg 5732b578d3Smrg/* Memory types for 264xT's */ 5832b578d3Smrgconst char *ATIMemoryTypeNames_264xT[] = 5932b578d3Smrg{ 6032b578d3Smrg "Disabled video memory", 6132b578d3Smrg "DRAM", 6232b578d3Smrg "EDO DRAM", 6332b578d3Smrg "Pseudo-EDO DRAM", 6432b578d3Smrg "SDRAM (1:1)", 6532b578d3Smrg "SGRAM (1:1)", 6632b578d3Smrg "SGRAM (2:1) 32-bit", 6732b578d3Smrg "Unknown video memory type" 6832b578d3Smrg}; 6932b578d3Smrg 7032b578d3Smrg#ifndef AVOID_CPIO 7132b578d3Smrg 7232b578d3Smrg/* 7332b578d3Smrg * ATIUnmapVGA -- 7432b578d3Smrg * 7532b578d3Smrg * Unmap VGA aperture. 7632b578d3Smrg */ 7732b578d3Smrgstatic void 7832b578d3SmrgATIUnmapVGA 7932b578d3Smrg( 8032b578d3Smrg int iScreen, 8132b578d3Smrg ATIPtr pATI 8232b578d3Smrg) 8332b578d3Smrg{ 8432b578d3Smrg if (!pATI->pBank) 8532b578d3Smrg return; 8632b578d3Smrg 8732b578d3Smrg xf86UnMapVidMem(iScreen, pATI->pBank, 0x00010000U); 8832b578d3Smrg 8932b578d3Smrg pATI->pBank = NULL; 9032b578d3Smrg} 9132b578d3Smrg 9232b578d3Smrg#endif /* AVOID_CPIO */ 9332b578d3Smrg 9432b578d3Smrg/* 9532b578d3Smrg * ATIUnmapLinear -- 9632b578d3Smrg * 9732b578d3Smrg * Unmap linear aperture. 9832b578d3Smrg */ 9932b578d3Smrgstatic void 10032b578d3SmrgATIUnmapLinear 10132b578d3Smrg( 10232b578d3Smrg int iScreen, 10332b578d3Smrg ATIPtr pATI 10432b578d3Smrg) 10532b578d3Smrg{ 10632b578d3Smrg if (pATI->pMemory) 10732b578d3Smrg { 10832b578d3Smrg#ifndef XSERVER_LIBPCIACCESS 10932b578d3Smrg xf86UnMapVidMem(iScreen, pATI->pMemory, pATI->LinearSize); 11032b578d3Smrg#else 11132b578d3Smrg pci_device_unmap_range(pATI->PCIInfo, pATI->pMemory, pATI->LinearSize); 11232b578d3Smrg#endif 11332b578d3Smrg 11432b578d3Smrg#if X_BYTE_ORDER != X_LITTLE_ENDIAN 11532b578d3Smrg 11632b578d3Smrg if (pATI->pMemoryLE) 11732b578d3Smrg { 11832b578d3Smrg#ifndef XSERVER_LIBPCIACCESS 11932b578d3Smrg xf86UnMapVidMem(iScreen, pATI->pMemoryLE, pATI->LinearSize); 12032b578d3Smrg#else 12132b578d3Smrg pci_device_unmap_range(pATI->PCIInfo, pATI->pMemoryLE, pATI->LinearSize); 12232b578d3Smrg#endif 12332b578d3Smrg } 12432b578d3Smrg 12532b578d3Smrg#endif /* X_BYTE_ORDER */ 12632b578d3Smrg 12732b578d3Smrg } 12832b578d3Smrg 12932b578d3Smrg pATI->pMemory = pATI->pMemoryLE = NULL; 13032b578d3Smrg} 13132b578d3Smrg 13232b578d3Smrg/* 13332b578d3Smrg * ATIUnmapMMIO -- 13432b578d3Smrg * 13532b578d3Smrg * Unmap MMIO registers. 13632b578d3Smrg */ 13732b578d3Smrgstatic void 13832b578d3SmrgATIUnmapMMIO 13932b578d3Smrg( 14032b578d3Smrg int iScreen, 14132b578d3Smrg ATIPtr pATI 14232b578d3Smrg) 14332b578d3Smrg{ 14432b578d3Smrg if (pATI->pMMIO) 14532b578d3Smrg { 14632b578d3Smrg#ifndef XSERVER_LIBPCIACCESS 14732b578d3Smrg xf86UnMapVidMem(iScreen, pATI->pMMIO, getpagesize()); 14832b578d3Smrg#else 14932b578d3Smrg unsigned long size; 15032b578d3Smrg 15132b578d3Smrg size = PCI_REGION_SIZE(pATI->PCIInfo, 2); 15232b578d3Smrg if (!size || size > getpagesize()) 15332b578d3Smrg size = getpagesize(); 15432b578d3Smrg pci_device_unmap_range(pATI->PCIInfo, pATI->pMMIO, size); 15532b578d3Smrg#endif 15632b578d3Smrg } 15732b578d3Smrg 15832b578d3Smrg pATI->pMMIO = pATI->pBlock[0] = pATI->pBlock[1] = NULL; 15932b578d3Smrg} 16032b578d3Smrg 16132b578d3Smrg/* 16232b578d3Smrg * ATIUnmapCursor -- 16332b578d3Smrg * 16432b578d3Smrg * Unmap hardware cursor image area. 16532b578d3Smrg */ 16632b578d3Smrgstatic void 16732b578d3SmrgATIUnmapCursor 16832b578d3Smrg( 16932b578d3Smrg int iScreen, 17032b578d3Smrg ATIPtr pATI 17132b578d3Smrg) 17232b578d3Smrg{ 17332b578d3Smrg if (pATI->pCursorPage) 17432b578d3Smrg { 17532b578d3Smrg#ifndef XSERVER_LIBPCIACCESS 17632b578d3Smrg xf86UnMapVidMem(iScreen, pATI->pCursorPage, getpagesize()); 17732b578d3Smrg#else 17832b578d3Smrg pci_device_unmap_range(pATI->PCIInfo, pATI->pCursorPage, getpagesize()); 17932b578d3Smrg#endif 18032b578d3Smrg } 18132b578d3Smrg 18232b578d3Smrg pATI->pCursorPage = pATI->pCursorImage = NULL; 18332b578d3Smrg} 18432b578d3Smrg 18532b578d3Smrg/* 18632b578d3Smrg * ATIMapApertures -- 18732b578d3Smrg * 18832b578d3Smrg * This function maps all apertures used by the driver. 18932b578d3Smrg * 19032b578d3Smrg * It is called three times: 19132b578d3Smrg * - to setup MMIO for an MMIO-only driver during Probe 19232b578d3Smrg * - to setup MMIO for an MMIO-only driver during PreInit 19332b578d3Smrg * - to setup MMIO (with Block0Base set) and FB (with LinearBase set) 19432b578d3Smrg */ 19532b578d3SmrgBool 19632b578d3SmrgATIMapApertures 19732b578d3Smrg( 19832b578d3Smrg int iScreen, 19932b578d3Smrg ATIPtr pATI 20032b578d3Smrg) 20132b578d3Smrg{ 20232b578d3Smrg pciVideoPtr pVideo = pATI->PCIInfo; 20332b578d3Smrg#ifndef XSERVER_LIBPCIACCESS 20432b578d3Smrg PCITAG Tag = PCI_CFG_TAG(pVideo); 20532b578d3Smrg#else 20632b578d3Smrg pciVideoPtr Tag = pVideo; 20732b578d3Smrg#endif 20832b578d3Smrg unsigned long PageSize = getpagesize(); 20932b578d3Smrg 21032b578d3Smrg if (pATI->Mapped) 21132b578d3Smrg return TRUE; 21232b578d3Smrg 21332b578d3Smrg#ifndef AVOID_CPIO 21432b578d3Smrg 21532b578d3Smrg /* Map VGA aperture */ 21632b578d3Smrg if (pATI->VGAAdapter) 21732b578d3Smrg { 21832b578d3Smrg /* 21932b578d3Smrg * No relocation, resizing, caching or write-combining of this 22032b578d3Smrg * aperture is supported. Hence, the hard-coded values here... 22132b578d3Smrg */ 22232b578d3Smrg pATI->pBank = xf86MapDomainMemory(iScreen, VIDMEM_MMIO_32BIT, 22332b578d3Smrg Tag, 0x000A0000U, 0x00010000U); 22432b578d3Smrg 22532b578d3Smrg if (!pATI->pBank) 22632b578d3Smrg return FALSE; 22732b578d3Smrg 22832b578d3Smrg pATI->Mapped = TRUE; 22932b578d3Smrg } 23032b578d3Smrg 23132b578d3Smrg#endif /* AVOID_CPIO */ 23232b578d3Smrg 23332b578d3Smrg /* Map linear aperture */ 23432b578d3Smrg if (pATI->LinearBase) 23532b578d3Smrg { 23632b578d3Smrg 23732b578d3Smrg#ifndef XSERVER_LIBPCIACCESS 23832b578d3Smrg 23932b578d3Smrg pATI->pMemory = xf86MapPciMem(iScreen, VIDMEM_FRAMEBUFFER, 24032b578d3Smrg Tag, pATI->LinearBase, pATI->LinearSize); 24132b578d3Smrg 24232b578d3Smrg#else /* XSERVER_LIBPCIACCESS */ 24332b578d3Smrg 24432b578d3Smrg int mode = PCI_DEV_MAP_FLAG_WRITABLE | PCI_DEV_MAP_FLAG_WRITE_COMBINE; 24532b578d3Smrg 24632b578d3Smrg int err = pci_device_map_range(pVideo, 24732b578d3Smrg pATI->LinearBase, 24832b578d3Smrg pATI->LinearSize, 24932b578d3Smrg mode, &pATI->pMemory); 25032b578d3Smrg 25132b578d3Smrg if (err) 25232b578d3Smrg { 25332b578d3Smrg xf86DrvMsg (iScreen, X_ERROR, 25432b578d3Smrg "Unable to map linear aperture. %s (%d)\n", 25532b578d3Smrg strerror (err), err); 25632b578d3Smrg } 25732b578d3Smrg 25832b578d3Smrg#endif /* XSERVER_LIBPCIACCESS */ 25932b578d3Smrg 26032b578d3Smrg if (!pATI->pMemory) 26132b578d3Smrg { 26232b578d3Smrg 26332b578d3Smrg#ifndef AVOID_CPIO 26432b578d3Smrg 26532b578d3Smrg ATIUnmapVGA(iScreen, pATI); 26632b578d3Smrg 26732b578d3Smrg#endif /* AVOID_CPIO */ 26832b578d3Smrg 26932b578d3Smrg pATI->Mapped = FALSE; 27032b578d3Smrg return FALSE; 27132b578d3Smrg } 27232b578d3Smrg 27332b578d3Smrg pATI->Mapped = TRUE; 27432b578d3Smrg 27532b578d3Smrg#if X_BYTE_ORDER == X_LITTLE_ENDIAN 27632b578d3Smrg 27732b578d3Smrg if ((pATI->CursorBase >= pATI->LinearBase) && 27832b578d3Smrg ((pATI->CursorOffset + 0x00000400UL) <= (CARD32)pATI->LinearSize)) 27932b578d3Smrg pATI->pCursorImage = (char *)pATI->pMemory + pATI->CursorOffset; 28032b578d3Smrg 28132b578d3Smrg pATI->pMemoryLE = pATI->pMemory; 28232b578d3Smrg 28332b578d3Smrg#else /* if X_BYTE_ORDER != X_LITTLE_ENDIAN */ 28432b578d3Smrg 28532b578d3Smrg /* 28632b578d3Smrg * Map the little-endian aperture (used for video, etc.). Note that 28732b578d3Smrg * caching of this area is _not_ wanted. 28832b578d3Smrg */ 28932b578d3Smrg { 29032b578d3Smrg 29132b578d3Smrg#ifndef XSERVER_LIBPCIACCESS 29232b578d3Smrg 29332b578d3Smrg pATI->pMemoryLE = xf86MapPciMem(iScreen, VIDMEM_MMIO, Tag, 29432b578d3Smrg pATI->LinearBase - 0x00800000U, pATI->LinearSize); 29532b578d3Smrg 29632b578d3Smrg 29732b578d3Smrg#else /* XSERVER_LIBPCIACCESS */ 29832b578d3Smrg 29932b578d3Smrg int mode = PCI_DEV_MAP_FLAG_WRITABLE; 30032b578d3Smrg 30132b578d3Smrg int err = pci_device_map_range(pVideo, 30232b578d3Smrg pATI->LinearBase - 0x00800000U, 30332b578d3Smrg pATI->LinearSize, 30432b578d3Smrg mode, &pATI->pMemoryLE); 30532b578d3Smrg 30632b578d3Smrg if (err) 30732b578d3Smrg { 30832b578d3Smrg xf86DrvMsg (iScreen, X_ERROR, 30932b578d3Smrg "Unable to map extended linear aperture. %s (%d)\n", 31032b578d3Smrg strerror (err), err); 31132b578d3Smrg } 31232b578d3Smrg 31332b578d3Smrg#endif /* XSERVER_LIBPCIACCESS */ 31432b578d3Smrg 31532b578d3Smrg if (!pATI->pMemoryLE) 31632b578d3Smrg { 31732b578d3Smrg ATIUnmapLinear(iScreen, pATI); 31832b578d3Smrg 31932b578d3Smrg#ifndef AVOID_CPIO 32032b578d3Smrg 32132b578d3Smrg ATIUnmapVGA(iScreen, pATI); 32232b578d3Smrg 32332b578d3Smrg#endif /* AVOID_CPIO */ 32432b578d3Smrg 32532b578d3Smrg pATI->Mapped = FALSE; 32632b578d3Smrg return FALSE; 32732b578d3Smrg } 32832b578d3Smrg } 32932b578d3Smrg 33032b578d3Smrg#endif /* X_BYTE_ORDER */ 33132b578d3Smrg 33232b578d3Smrg } 33332b578d3Smrg 33432b578d3Smrg /* Map MMIO aperture */ 33532b578d3Smrg if (pATI->Block0Base) 33632b578d3Smrg { 33732b578d3Smrg unsigned long MMIOBase = pATI->Block0Base & ~(PageSize - 1); 33832b578d3Smrg 33932b578d3Smrg#ifndef XSERVER_LIBPCIACCESS 34032b578d3Smrg 34132b578d3Smrg pATI->pMMIO = xf86MapPciMem(iScreen, VIDMEM_MMIO, 34232b578d3Smrg Tag, MMIOBase, PageSize); 34332b578d3Smrg 34432b578d3Smrg#else /* XSERVER_LIBPCIACCESS */ 34532b578d3Smrg 34632b578d3Smrg int mode = PCI_DEV_MAP_FLAG_WRITABLE; 34732b578d3Smrg 34832b578d3Smrg int err; 34932b578d3Smrg int size; 35032b578d3Smrg 35132b578d3Smrg size = PCI_REGION_SIZE(pVideo, 2); 35232b578d3Smrg if (!size || size > PageSize) 35332b578d3Smrg size = PageSize; 35432b578d3Smrg 35532b578d3Smrg err = pci_device_map_range(pVideo, MMIOBase, 35632b578d3Smrg size, mode, &pATI->pMMIO); 35732b578d3Smrg 35832b578d3Smrg if (err) 35932b578d3Smrg { 36032b578d3Smrg xf86DrvMsg (iScreen, X_ERROR, 36132b578d3Smrg "Unable to map mmio aperture. %s (%d)\n", 36232b578d3Smrg strerror (err), err); 36332b578d3Smrg } 36432b578d3Smrg 36532b578d3Smrg#endif /* XSERVER_LIBPCIACCESS */ 36632b578d3Smrg 36732b578d3Smrg if (!pATI->pMMIO) 36832b578d3Smrg { 36932b578d3Smrg 37032b578d3Smrg#if X_BYTE_ORDER == X_LITTLE_ENDIAN 37132b578d3Smrg 37232b578d3Smrg ATIUnmapCursor(iScreen, pATI); 37332b578d3Smrg 37432b578d3Smrg#endif /* X_BYTE_ORDER */ 37532b578d3Smrg 37632b578d3Smrg ATIUnmapLinear(iScreen, pATI); 37732b578d3Smrg 37832b578d3Smrg#ifndef AVOID_CPIO 37932b578d3Smrg 38032b578d3Smrg ATIUnmapVGA(iScreen, pATI); 38132b578d3Smrg 38232b578d3Smrg#endif /* AVOID_CPIO */ 38332b578d3Smrg 38432b578d3Smrg pATI->Mapped = FALSE; 38532b578d3Smrg return FALSE; 38632b578d3Smrg } 38732b578d3Smrg 38832b578d3Smrg pATI->Mapped = TRUE; 38932b578d3Smrg 39032b578d3Smrg pATI->pBlock[0] = (char *)pATI->pMMIO + 39132b578d3Smrg (pATI->Block0Base - MMIOBase); 39232b578d3Smrg 39332b578d3Smrg if (pATI->Block1Base) 39432b578d3Smrg pATI->pBlock[1] = (char *)pATI->pBlock[0] - 0x00000400U; 39532b578d3Smrg 39632b578d3Smrg#if X_BYTE_ORDER == X_LITTLE_ENDIAN 39732b578d3Smrg 39832b578d3Smrg if (!pATI->pCursorImage) 39932b578d3Smrg 40032b578d3Smrg#endif /* X_BYTE_ORDER */ 40132b578d3Smrg 40232b578d3Smrg { 40332b578d3Smrg if ((pATI->CursorBase >= MMIOBase) && 40432b578d3Smrg ((pATI->CursorBase + 0x00000400UL) <= (MMIOBase + PageSize))) 40532b578d3Smrg pATI->pCursorImage = (char *)pATI->pMMIO + 40632b578d3Smrg (pATI->CursorBase - MMIOBase); 40732b578d3Smrg } 40832b578d3Smrg } 40932b578d3Smrg 41032b578d3Smrg /* Map hardware cursor image area */ 41132b578d3Smrg if (pATI->CursorBase && !pATI->pCursorImage) 41232b578d3Smrg { 41332b578d3Smrg unsigned long CursorBase = pATI->CursorBase & ~(PageSize - 1); 41432b578d3Smrg 41532b578d3Smrg#ifndef XSERVER_LIBPCIACCESS 41632b578d3Smrg 41732b578d3Smrg pATI->pCursorPage = xf86MapPciMem(iScreen, VIDMEM_FRAMEBUFFER, 41832b578d3Smrg Tag, CursorBase, PageSize); 41932b578d3Smrg 42032b578d3Smrg#else /* XSERVER_LIBPCIACCESS */ 42132b578d3Smrg 42232b578d3Smrg int mode = PCI_DEV_MAP_FLAG_WRITABLE | PCI_DEV_MAP_FLAG_WRITE_COMBINE; 42332b578d3Smrg 42432b578d3Smrg int err = pci_device_map_range(pVideo, 42532b578d3Smrg CursorBase, 42632b578d3Smrg PageSize, 42732b578d3Smrg mode, &pATI->pCursorPage); 42832b578d3Smrg 42932b578d3Smrg if (err) 43032b578d3Smrg { 43132b578d3Smrg xf86DrvMsg (iScreen, X_ERROR, 43232b578d3Smrg "Unable to map cursor aperture. %s (%d)\n", 43332b578d3Smrg strerror (err), err); 43432b578d3Smrg } 43532b578d3Smrg 43632b578d3Smrg#endif /* XSERVER_LIBPCIACCESS */ 43732b578d3Smrg 43832b578d3Smrg if (!pATI->pCursorPage) 43932b578d3Smrg { 44032b578d3Smrg ATIUnmapCursor(iScreen, pATI); 44132b578d3Smrg ATIUnmapMMIO(iScreen, pATI); 44232b578d3Smrg ATIUnmapLinear(iScreen, pATI); 44332b578d3Smrg 44432b578d3Smrg#ifndef AVOID_CPIO 44532b578d3Smrg 44632b578d3Smrg ATIUnmapVGA(iScreen, pATI); 44732b578d3Smrg 44832b578d3Smrg#endif /* AVOID_CPIO */ 44932b578d3Smrg 45032b578d3Smrg pATI->Mapped = FALSE; 45132b578d3Smrg return FALSE; 45232b578d3Smrg } 45332b578d3Smrg 45432b578d3Smrg pATI->pCursorImage = (char *)pATI->pCursorPage + 45532b578d3Smrg (pATI->CursorBase - CursorBase); 45632b578d3Smrg } 45732b578d3Smrg 45832b578d3Smrg return TRUE; 45932b578d3Smrg} 46032b578d3Smrg 46132b578d3Smrg/* 46232b578d3Smrg * ATIUnmapApertures -- 46332b578d3Smrg * 46432b578d3Smrg * This function unmaps all apertures used by the driver. 46532b578d3Smrg */ 46632b578d3Smrgvoid 46732b578d3SmrgATIUnmapApertures 46832b578d3Smrg( 46932b578d3Smrg int iScreen, 47032b578d3Smrg ATIPtr pATI 47132b578d3Smrg) 47232b578d3Smrg{ 47332b578d3Smrg if (!pATI->Mapped) 47432b578d3Smrg return; 47532b578d3Smrg pATI->Mapped = FALSE; 47632b578d3Smrg 47732b578d3Smrg /* Unmap hardware cursor image area */ 47832b578d3Smrg ATIUnmapCursor(iScreen, pATI); 47932b578d3Smrg 48032b578d3Smrg /* Unmap MMIO area */ 48132b578d3Smrg ATIUnmapMMIO(iScreen, pATI); 48232b578d3Smrg 48332b578d3Smrg /* Unmap linear aperture */ 48432b578d3Smrg ATIUnmapLinear(iScreen, pATI); 48532b578d3Smrg 48632b578d3Smrg#ifndef AVOID_CPIO 48732b578d3Smrg 48832b578d3Smrg /* Unmap VGA aperture */ 48932b578d3Smrg ATIUnmapVGA(iScreen, pATI); 49032b578d3Smrg 49132b578d3Smrg#endif /* AVOID_CPIO */ 49232b578d3Smrg 49332b578d3Smrg} 494