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