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