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", 500b0ce0bfSmrg "DRAM (256Kx16 with asymmetric 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 87e35d4d8eSmrg#ifndef XSERVER_LIBPCIACCESS 8832b578d3Smrg xf86UnMapVidMem(iScreen, pATI->pBank, 0x00010000U); 89e35d4d8eSmrg#else 90e35d4d8eSmrg (void) pci_device_unmap_legacy(pATI->PCIInfo, pATI->pBank, 0x00010000U); 91e35d4d8eSmrg#endif 9232b578d3Smrg 9332b578d3Smrg pATI->pBank = NULL; 9432b578d3Smrg} 9532b578d3Smrg 9632b578d3Smrg#endif /* AVOID_CPIO */ 9732b578d3Smrg 9832b578d3Smrg/* 9932b578d3Smrg * ATIUnmapLinear -- 10032b578d3Smrg * 10132b578d3Smrg * Unmap linear aperture. 10232b578d3Smrg */ 10332b578d3Smrgstatic void 10432b578d3SmrgATIUnmapLinear 10532b578d3Smrg( 10632b578d3Smrg int iScreen, 10732b578d3Smrg ATIPtr pATI 10832b578d3Smrg) 10932b578d3Smrg{ 11032b578d3Smrg if (pATI->pMemory) 11132b578d3Smrg { 11232b578d3Smrg#ifndef XSERVER_LIBPCIACCESS 11332b578d3Smrg xf86UnMapVidMem(iScreen, pATI->pMemory, pATI->LinearSize); 11432b578d3Smrg#else 11532b578d3Smrg pci_device_unmap_range(pATI->PCIInfo, pATI->pMemory, pATI->LinearSize); 11632b578d3Smrg#endif 11732b578d3Smrg 11832b578d3Smrg#if X_BYTE_ORDER != X_LITTLE_ENDIAN 11932b578d3Smrg 12032b578d3Smrg if (pATI->pMemoryLE) 12132b578d3Smrg { 12232b578d3Smrg#ifndef XSERVER_LIBPCIACCESS 12332b578d3Smrg xf86UnMapVidMem(iScreen, pATI->pMemoryLE, pATI->LinearSize); 12432b578d3Smrg#else 12532b578d3Smrg pci_device_unmap_range(pATI->PCIInfo, pATI->pMemoryLE, pATI->LinearSize); 12632b578d3Smrg#endif 12732b578d3Smrg } 12832b578d3Smrg 12932b578d3Smrg#endif /* X_BYTE_ORDER */ 13032b578d3Smrg 13132b578d3Smrg } 13232b578d3Smrg 13332b578d3Smrg pATI->pMemory = pATI->pMemoryLE = NULL; 13432b578d3Smrg} 13532b578d3Smrg 13632b578d3Smrg/* 13732b578d3Smrg * ATIUnmapMMIO -- 13832b578d3Smrg * 13932b578d3Smrg * Unmap MMIO registers. 14032b578d3Smrg */ 14132b578d3Smrgstatic void 14232b578d3SmrgATIUnmapMMIO 14332b578d3Smrg( 14432b578d3Smrg int iScreen, 14532b578d3Smrg ATIPtr pATI 14632b578d3Smrg) 14732b578d3Smrg{ 14832b578d3Smrg if (pATI->pMMIO) 14932b578d3Smrg { 15032b578d3Smrg#ifndef XSERVER_LIBPCIACCESS 15132b578d3Smrg xf86UnMapVidMem(iScreen, pATI->pMMIO, getpagesize()); 15232b578d3Smrg#else 15332b578d3Smrg unsigned long size; 15432b578d3Smrg 15532b578d3Smrg size = PCI_REGION_SIZE(pATI->PCIInfo, 2); 15632b578d3Smrg if (!size || size > getpagesize()) 15732b578d3Smrg size = getpagesize(); 15832b578d3Smrg pci_device_unmap_range(pATI->PCIInfo, pATI->pMMIO, size); 15932b578d3Smrg#endif 16032b578d3Smrg } 16132b578d3Smrg 16232b578d3Smrg pATI->pMMIO = pATI->pBlock[0] = pATI->pBlock[1] = NULL; 16332b578d3Smrg} 16432b578d3Smrg 16532b578d3Smrg/* 16632b578d3Smrg * ATIUnmapCursor -- 16732b578d3Smrg * 16832b578d3Smrg * Unmap hardware cursor image area. 16932b578d3Smrg */ 17032b578d3Smrgstatic void 17132b578d3SmrgATIUnmapCursor 17232b578d3Smrg( 17332b578d3Smrg int iScreen, 17432b578d3Smrg ATIPtr pATI 17532b578d3Smrg) 17632b578d3Smrg{ 17732b578d3Smrg if (pATI->pCursorPage) 17832b578d3Smrg { 17932b578d3Smrg#ifndef XSERVER_LIBPCIACCESS 18032b578d3Smrg xf86UnMapVidMem(iScreen, pATI->pCursorPage, getpagesize()); 18132b578d3Smrg#else 18232b578d3Smrg pci_device_unmap_range(pATI->PCIInfo, pATI->pCursorPage, getpagesize()); 18332b578d3Smrg#endif 18432b578d3Smrg } 18532b578d3Smrg 18632b578d3Smrg pATI->pCursorPage = pATI->pCursorImage = NULL; 18732b578d3Smrg} 18832b578d3Smrg 18932b578d3Smrg/* 19032b578d3Smrg * ATIMapApertures -- 19132b578d3Smrg * 19232b578d3Smrg * This function maps all apertures used by the driver. 19332b578d3Smrg * 19432b578d3Smrg * It is called three times: 19532b578d3Smrg * - to setup MMIO for an MMIO-only driver during Probe 19632b578d3Smrg * - to setup MMIO for an MMIO-only driver during PreInit 19732b578d3Smrg * - to setup MMIO (with Block0Base set) and FB (with LinearBase set) 19832b578d3Smrg */ 19932b578d3SmrgBool 20032b578d3SmrgATIMapApertures 20132b578d3Smrg( 20232b578d3Smrg int iScreen, 20332b578d3Smrg ATIPtr pATI 20432b578d3Smrg) 20532b578d3Smrg{ 20632b578d3Smrg pciVideoPtr pVideo = pATI->PCIInfo; 20732b578d3Smrg#ifndef XSERVER_LIBPCIACCESS 20832b578d3Smrg PCITAG Tag = PCI_CFG_TAG(pVideo); 20932b578d3Smrg#else 21032b578d3Smrg pciVideoPtr Tag = pVideo; 21132b578d3Smrg#endif 21232b578d3Smrg unsigned long PageSize = getpagesize(); 21332b578d3Smrg 21432b578d3Smrg if (pATI->Mapped) 21532b578d3Smrg return TRUE; 21632b578d3Smrg 21732b578d3Smrg#ifndef AVOID_CPIO 21832b578d3Smrg 21932b578d3Smrg /* Map VGA aperture */ 22032b578d3Smrg if (pATI->VGAAdapter) 22132b578d3Smrg { 22232b578d3Smrg /* 22332b578d3Smrg * No relocation, resizing, caching or write-combining of this 22432b578d3Smrg * aperture is supported. Hence, the hard-coded values here... 22532b578d3Smrg */ 226e35d4d8eSmrg#ifndef XSERVER_LIBPCIACCESS 227e35d4d8eSmrg pATI->pBank = xf86MapDomainMemory(iScreen, VIDMEM_MMIO_32BIT, 228e35d4d8eSmrg Tag, 0x000A0000U, 0x00010000U); 229e35d4d8eSmrg#else 230e35d4d8eSmrg (void) pci_device_map_legacy(Tag, 0x000A0000U, 0x00010000U, 231e35d4d8eSmrg PCI_DEV_MAP_FLAG_WRITABLE, 232e35d4d8eSmrg &pATI->pBank); 233e35d4d8eSmrg#endif 23432b578d3Smrg 23532b578d3Smrg if (!pATI->pBank) 23632b578d3Smrg return FALSE; 23732b578d3Smrg 23832b578d3Smrg pATI->Mapped = TRUE; 23932b578d3Smrg } 24032b578d3Smrg 24132b578d3Smrg#endif /* AVOID_CPIO */ 24232b578d3Smrg 24332b578d3Smrg /* Map linear aperture */ 24432b578d3Smrg if (pATI->LinearBase) 24532b578d3Smrg { 24632b578d3Smrg 24732b578d3Smrg#ifndef XSERVER_LIBPCIACCESS 24832b578d3Smrg 24932b578d3Smrg pATI->pMemory = xf86MapPciMem(iScreen, VIDMEM_FRAMEBUFFER, 25032b578d3Smrg Tag, pATI->LinearBase, pATI->LinearSize); 25132b578d3Smrg 25232b578d3Smrg#else /* XSERVER_LIBPCIACCESS */ 25332b578d3Smrg 25432b578d3Smrg int mode = PCI_DEV_MAP_FLAG_WRITABLE | PCI_DEV_MAP_FLAG_WRITE_COMBINE; 25532b578d3Smrg 25632b578d3Smrg int err = pci_device_map_range(pVideo, 25732b578d3Smrg pATI->LinearBase, 25832b578d3Smrg pATI->LinearSize, 25932b578d3Smrg mode, &pATI->pMemory); 26032b578d3Smrg 26132b578d3Smrg if (err) 26232b578d3Smrg { 26332b578d3Smrg xf86DrvMsg (iScreen, X_ERROR, 26432b578d3Smrg "Unable to map linear aperture. %s (%d)\n", 26532b578d3Smrg strerror (err), err); 26632b578d3Smrg } 26732b578d3Smrg 26832b578d3Smrg#endif /* XSERVER_LIBPCIACCESS */ 26932b578d3Smrg 27032b578d3Smrg if (!pATI->pMemory) 27132b578d3Smrg { 27232b578d3Smrg 27332b578d3Smrg#ifndef AVOID_CPIO 27432b578d3Smrg 27532b578d3Smrg ATIUnmapVGA(iScreen, pATI); 27632b578d3Smrg 27732b578d3Smrg#endif /* AVOID_CPIO */ 27832b578d3Smrg 27932b578d3Smrg pATI->Mapped = FALSE; 28032b578d3Smrg return FALSE; 28132b578d3Smrg } 28232b578d3Smrg 28332b578d3Smrg pATI->Mapped = TRUE; 28432b578d3Smrg 28532b578d3Smrg#if X_BYTE_ORDER == X_LITTLE_ENDIAN 28632b578d3Smrg 28732b578d3Smrg if ((pATI->CursorBase >= pATI->LinearBase) && 28832b578d3Smrg ((pATI->CursorOffset + 0x00000400UL) <= (CARD32)pATI->LinearSize)) 28932b578d3Smrg pATI->pCursorImage = (char *)pATI->pMemory + pATI->CursorOffset; 29032b578d3Smrg 29132b578d3Smrg pATI->pMemoryLE = pATI->pMemory; 29232b578d3Smrg 29332b578d3Smrg#else /* if X_BYTE_ORDER != X_LITTLE_ENDIAN */ 29432b578d3Smrg 29532b578d3Smrg /* 29632b578d3Smrg * Map the little-endian aperture (used for video, etc.). Note that 29732b578d3Smrg * caching of this area is _not_ wanted. 29832b578d3Smrg */ 29932b578d3Smrg { 30032b578d3Smrg 30132b578d3Smrg#ifndef XSERVER_LIBPCIACCESS 30232b578d3Smrg 30332b578d3Smrg pATI->pMemoryLE = xf86MapPciMem(iScreen, VIDMEM_MMIO, Tag, 30432b578d3Smrg pATI->LinearBase - 0x00800000U, pATI->LinearSize); 30532b578d3Smrg 30632b578d3Smrg 30732b578d3Smrg#else /* XSERVER_LIBPCIACCESS */ 30832b578d3Smrg 30932b578d3Smrg int mode = PCI_DEV_MAP_FLAG_WRITABLE; 31032b578d3Smrg 31132b578d3Smrg int err = pci_device_map_range(pVideo, 31232b578d3Smrg pATI->LinearBase - 0x00800000U, 31332b578d3Smrg pATI->LinearSize, 31432b578d3Smrg mode, &pATI->pMemoryLE); 31532b578d3Smrg 31632b578d3Smrg if (err) 31732b578d3Smrg { 31832b578d3Smrg xf86DrvMsg (iScreen, X_ERROR, 31932b578d3Smrg "Unable to map extended linear aperture. %s (%d)\n", 32032b578d3Smrg strerror (err), err); 32132b578d3Smrg } 32232b578d3Smrg 32332b578d3Smrg#endif /* XSERVER_LIBPCIACCESS */ 32432b578d3Smrg 32532b578d3Smrg if (!pATI->pMemoryLE) 32632b578d3Smrg { 32732b578d3Smrg ATIUnmapLinear(iScreen, pATI); 32832b578d3Smrg 32932b578d3Smrg#ifndef AVOID_CPIO 33032b578d3Smrg 33132b578d3Smrg ATIUnmapVGA(iScreen, pATI); 33232b578d3Smrg 33332b578d3Smrg#endif /* AVOID_CPIO */ 33432b578d3Smrg 33532b578d3Smrg pATI->Mapped = FALSE; 33632b578d3Smrg return FALSE; 33732b578d3Smrg } 33832b578d3Smrg } 33932b578d3Smrg 34032b578d3Smrg#endif /* X_BYTE_ORDER */ 34132b578d3Smrg 34232b578d3Smrg } 34332b578d3Smrg 34432b578d3Smrg /* Map MMIO aperture */ 34532b578d3Smrg if (pATI->Block0Base) 34632b578d3Smrg { 34732b578d3Smrg unsigned long MMIOBase = pATI->Block0Base & ~(PageSize - 1); 34832b578d3Smrg 34932b578d3Smrg#ifndef XSERVER_LIBPCIACCESS 35032b578d3Smrg 35132b578d3Smrg pATI->pMMIO = xf86MapPciMem(iScreen, VIDMEM_MMIO, 35232b578d3Smrg Tag, MMIOBase, PageSize); 35332b578d3Smrg 35432b578d3Smrg#else /* XSERVER_LIBPCIACCESS */ 35532b578d3Smrg 35632b578d3Smrg int mode = PCI_DEV_MAP_FLAG_WRITABLE; 35732b578d3Smrg 35832b578d3Smrg int err; 35932b578d3Smrg int size; 36032b578d3Smrg 36132b578d3Smrg size = PCI_REGION_SIZE(pVideo, 2); 36232b578d3Smrg if (!size || size > PageSize) 36332b578d3Smrg size = PageSize; 36432b578d3Smrg 36532b578d3Smrg err = pci_device_map_range(pVideo, MMIOBase, 36632b578d3Smrg size, mode, &pATI->pMMIO); 36732b578d3Smrg 36832b578d3Smrg if (err) 36932b578d3Smrg { 37032b578d3Smrg xf86DrvMsg (iScreen, X_ERROR, 37132b578d3Smrg "Unable to map mmio aperture. %s (%d)\n", 37232b578d3Smrg strerror (err), err); 37332b578d3Smrg } 37432b578d3Smrg 37532b578d3Smrg#endif /* XSERVER_LIBPCIACCESS */ 37632b578d3Smrg 37732b578d3Smrg if (!pATI->pMMIO) 37832b578d3Smrg { 37932b578d3Smrg 38032b578d3Smrg#if X_BYTE_ORDER == X_LITTLE_ENDIAN 38132b578d3Smrg 38232b578d3Smrg ATIUnmapCursor(iScreen, pATI); 38332b578d3Smrg 38432b578d3Smrg#endif /* X_BYTE_ORDER */ 38532b578d3Smrg 38632b578d3Smrg ATIUnmapLinear(iScreen, pATI); 38732b578d3Smrg 38832b578d3Smrg#ifndef AVOID_CPIO 38932b578d3Smrg 39032b578d3Smrg ATIUnmapVGA(iScreen, pATI); 39132b578d3Smrg 39232b578d3Smrg#endif /* AVOID_CPIO */ 39332b578d3Smrg 39432b578d3Smrg pATI->Mapped = FALSE; 39532b578d3Smrg return FALSE; 39632b578d3Smrg } 39732b578d3Smrg 39832b578d3Smrg pATI->Mapped = TRUE; 39932b578d3Smrg 40032b578d3Smrg pATI->pBlock[0] = (char *)pATI->pMMIO + 40132b578d3Smrg (pATI->Block0Base - MMIOBase); 40232b578d3Smrg 40332b578d3Smrg if (pATI->Block1Base) 40432b578d3Smrg pATI->pBlock[1] = (char *)pATI->pBlock[0] - 0x00000400U; 40532b578d3Smrg 40632b578d3Smrg#if X_BYTE_ORDER == X_LITTLE_ENDIAN 40732b578d3Smrg 40832b578d3Smrg if (!pATI->pCursorImage) 40932b578d3Smrg 41032b578d3Smrg#endif /* X_BYTE_ORDER */ 41132b578d3Smrg 41232b578d3Smrg { 41332b578d3Smrg if ((pATI->CursorBase >= MMIOBase) && 41432b578d3Smrg ((pATI->CursorBase + 0x00000400UL) <= (MMIOBase + PageSize))) 41532b578d3Smrg pATI->pCursorImage = (char *)pATI->pMMIO + 41632b578d3Smrg (pATI->CursorBase - MMIOBase); 41732b578d3Smrg } 41832b578d3Smrg } 41932b578d3Smrg 42032b578d3Smrg /* Map hardware cursor image area */ 42132b578d3Smrg if (pATI->CursorBase && !pATI->pCursorImage) 42232b578d3Smrg { 42332b578d3Smrg unsigned long CursorBase = pATI->CursorBase & ~(PageSize - 1); 42432b578d3Smrg 42532b578d3Smrg#ifndef XSERVER_LIBPCIACCESS 42632b578d3Smrg 42732b578d3Smrg pATI->pCursorPage = xf86MapPciMem(iScreen, VIDMEM_FRAMEBUFFER, 42832b578d3Smrg Tag, CursorBase, PageSize); 42932b578d3Smrg 43032b578d3Smrg#else /* XSERVER_LIBPCIACCESS */ 43132b578d3Smrg 43232b578d3Smrg int mode = PCI_DEV_MAP_FLAG_WRITABLE | PCI_DEV_MAP_FLAG_WRITE_COMBINE; 43332b578d3Smrg 43432b578d3Smrg int err = pci_device_map_range(pVideo, 43532b578d3Smrg CursorBase, 43632b578d3Smrg PageSize, 43732b578d3Smrg mode, &pATI->pCursorPage); 43832b578d3Smrg 43932b578d3Smrg if (err) 44032b578d3Smrg { 44132b578d3Smrg xf86DrvMsg (iScreen, X_ERROR, 44232b578d3Smrg "Unable to map cursor aperture. %s (%d)\n", 44332b578d3Smrg strerror (err), err); 44432b578d3Smrg } 44532b578d3Smrg 44632b578d3Smrg#endif /* XSERVER_LIBPCIACCESS */ 44732b578d3Smrg 44832b578d3Smrg if (!pATI->pCursorPage) 44932b578d3Smrg { 45032b578d3Smrg ATIUnmapCursor(iScreen, pATI); 45132b578d3Smrg ATIUnmapMMIO(iScreen, pATI); 45232b578d3Smrg ATIUnmapLinear(iScreen, pATI); 45332b578d3Smrg 45432b578d3Smrg#ifndef AVOID_CPIO 45532b578d3Smrg 45632b578d3Smrg ATIUnmapVGA(iScreen, pATI); 45732b578d3Smrg 45832b578d3Smrg#endif /* AVOID_CPIO */ 45932b578d3Smrg 46032b578d3Smrg pATI->Mapped = FALSE; 46132b578d3Smrg return FALSE; 46232b578d3Smrg } 46332b578d3Smrg 46432b578d3Smrg pATI->pCursorImage = (char *)pATI->pCursorPage + 46532b578d3Smrg (pATI->CursorBase - CursorBase); 46632b578d3Smrg } 46732b578d3Smrg 46832b578d3Smrg return TRUE; 46932b578d3Smrg} 47032b578d3Smrg 47132b578d3Smrg/* 47232b578d3Smrg * ATIUnmapApertures -- 47332b578d3Smrg * 47432b578d3Smrg * This function unmaps all apertures used by the driver. 47532b578d3Smrg */ 47632b578d3Smrgvoid 47732b578d3SmrgATIUnmapApertures 47832b578d3Smrg( 47932b578d3Smrg int iScreen, 48032b578d3Smrg ATIPtr pATI 48132b578d3Smrg) 48232b578d3Smrg{ 48332b578d3Smrg if (!pATI->Mapped) 48432b578d3Smrg return; 48532b578d3Smrg pATI->Mapped = FALSE; 48632b578d3Smrg 48732b578d3Smrg /* Unmap hardware cursor image area */ 48832b578d3Smrg ATIUnmapCursor(iScreen, pATI); 48932b578d3Smrg 49032b578d3Smrg /* Unmap MMIO area */ 49132b578d3Smrg ATIUnmapMMIO(iScreen, pATI); 49232b578d3Smrg 49332b578d3Smrg /* Unmap linear aperture */ 49432b578d3Smrg ATIUnmapLinear(iScreen, pATI); 49532b578d3Smrg 49632b578d3Smrg#ifndef AVOID_CPIO 49732b578d3Smrg 49832b578d3Smrg /* Unmap VGA aperture */ 49932b578d3Smrg ATIUnmapVGA(iScreen, pATI); 50032b578d3Smrg 50132b578d3Smrg#endif /* AVOID_CPIO */ 50232b578d3Smrg 50332b578d3Smrg} 504