summaryrefslogtreecommitdiff
path: root/src/atividmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/atividmem.c')
-rw-r--r--src/atividmem.c381
1 files changed, 381 insertions, 0 deletions
diff --git a/src/atividmem.c b/src/atividmem.c
new file mode 100644
index 00000000..32ea23fc
--- /dev/null
+++ b/src/atividmem.c
@@ -0,0 +1,381 @@
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/atividmem.c,v 1.14 2003/01/01 19:16:34 tsi Exp $ */
+/*
+ * Copyright 1997 through 2003 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of Marc Aurele La France not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. Marc Aurele La France makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as-is" without express or implied warranty.
+ *
+ * MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO
+ * EVENT SHALL MARC AURELE LA FRANCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include "ati.h"
+#include "atiadapter.h"
+#include "atistruct.h"
+#include "atividmem.h"
+
+/* Memory types for 68800's and 88800GX's */
+const char *ATIMemoryTypeNames_Mach[] =
+{
+ "DRAM (256Kx4)",
+ "VRAM (256Kx4, x8, x16)",
+ "VRAM (256Kx16 with short shift register)",
+ "DRAM (256Kx16)",
+ "Graphics DRAM (256Kx16)",
+ "Enhanced VRAM (256Kx4, x8, x16)",
+ "Enhanced VRAM (256Kx16 with short shift register)",
+ "Unknown video memory type"
+};
+
+/* Memory types for 88800CX's */
+const char *ATIMemoryTypeNames_88800CX[] =
+{
+ "DRAM (256Kx4, x8, x16)",
+ "EDO DRAM (256Kx4, x8, x16)",
+ "Unknown video memory type",
+ "DRAM (256Kx16 with assymetric RAS/CAS)",
+ "Unknown video memory type",
+ "Unknown video memory type",
+ "Unknown video memory type",
+ "Unknown video memory type"
+};
+
+/* Memory types for 264xT's */
+const char *ATIMemoryTypeNames_264xT[] =
+{
+ "Disabled video memory",
+ "DRAM",
+ "EDO DRAM",
+ "Pseudo-EDO DRAM",
+ "SDRAM (1:1)",
+ "SGRAM (1:1)",
+ "SGRAM (2:1) 32-bit",
+ "Unknown video memory type"
+};
+
+#ifndef AVOID_CPIO
+
+/*
+ * ATIUnmapVGA --
+ *
+ * Unmap VGA aperture.
+ */
+static void
+ATIUnmapVGA
+(
+ int iScreen,
+ ATIPtr pATI
+)
+{
+ if (!pATI->pBank)
+ return;
+
+ xf86UnMapVidMem(iScreen, pATI->pBank, 0x00010000U);
+
+ pATI->pBank = pATI->BankInfo.pBankA = pATI->BankInfo.pBankB = NULL;
+}
+
+#endif /* AVOID_CPIO */
+
+/*
+ * ATIUnmapLinear --
+ *
+ * Unmap linear aperture.
+ */
+static void
+ATIUnmapLinear
+(
+ int iScreen,
+ ATIPtr pATI
+)
+{
+
+#ifdef AVOID_CPIO
+
+ if (!pATI->pMemory)
+ return;
+
+#else /* AVOID_CPIO */
+
+ if (pATI->pMemory != pATI->pBank)
+
+#endif /* AVOID_CPIO */
+
+ {
+ xf86UnMapVidMem(iScreen, pATI->pMemory, pATI->LinearSize);
+ }
+
+ pATI->pMemory = NULL;
+}
+
+/*
+ * ATIUnmapMMIO --
+ *
+ * Unmap MMIO registers.
+ */
+static void
+ATIUnmapMMIO
+(
+ int iScreen,
+ ATIPtr pATI
+)
+{
+ if (pATI->pMMIO)
+ xf86UnMapVidMem(iScreen, pATI->pMMIO, getpagesize());
+
+ pATI->pMMIO = pATI->pBlock[0] = pATI->pBlock[1] = NULL;
+}
+
+/*
+ * ATIUnmapCursor --
+ *
+ * Unmap hardware cursor image area.
+ */
+static void
+ATIUnmapCursor
+(
+ int iScreen,
+ ATIPtr pATI
+)
+{
+ if (pATI->pCursorPage)
+ xf86UnMapVidMem(iScreen, pATI->pCursorPage, getpagesize());
+
+ pATI->pCursorPage = pATI->pCursorImage = NULL;
+}
+
+/*
+ * ATIMapApertures --
+ *
+ * This function maps all apertures used by the driver.
+ */
+Bool
+ATIMapApertures
+(
+ int iScreen,
+ ATIPtr pATI
+)
+{
+ pciVideoPtr pVideo;
+ PCITAG Tag;
+ unsigned long PageSize;
+
+ if (pATI->Mapped)
+ return TRUE;
+
+#ifndef AVOID_CPIO
+
+ if (pATI->VGAAdapter == ATI_ADAPTER_NONE)
+
+#endif /* AVOID_CPIO */
+
+ {
+ if (!pATI->LinearBase && !pATI->Block0Base)
+ return FALSE;
+ }
+
+ PageSize = getpagesize();
+
+ if ((pVideo = pATI->PCIInfo))
+ Tag = ((pciConfigPtr)(pVideo->thisCard))->tag;
+ else
+ Tag = 0;
+
+#ifndef AVOID_CPIO
+
+ /* Map VGA aperture */
+ if (pATI->VGAAdapter != ATI_ADAPTER_NONE)
+ {
+ /*
+ * No relocation, resizing, caching or write-combining of this
+ * aperture is supported. Hence, the hard-coded values here...
+ */
+ if (pVideo)
+ pATI->pBank = xf86MapPciMem(iScreen, VIDMEM_MMIO,
+ Tag, 0x000A0000U, 0x00010000U);
+ else
+ pATI->pBank = xf86MapVidMem(iScreen, VIDMEM_MMIO,
+ 0x000A0000U, 0x00010000U);
+
+ if (!pATI->pBank)
+ return FALSE;
+
+ pATI->pMemory =
+ pATI->BankInfo.pBankA =
+ pATI->BankInfo.pBankB = pATI->pBank;
+
+ pATI->Mapped = TRUE;
+ }
+
+#endif /* AVOID_CPIO */
+
+ /* Map linear aperture */
+ if (pATI->LinearBase)
+ {
+ if (pVideo)
+ pATI->pMemory = xf86MapPciMem(iScreen, VIDMEM_FRAMEBUFFER,
+ Tag, pATI->LinearBase, pATI->LinearSize);
+ else
+ pATI->pMemory = xf86MapVidMem(iScreen, VIDMEM_FRAMEBUFFER,
+ pATI->LinearBase, pATI->LinearSize);
+
+ if (!pATI->pMemory)
+ {
+
+#ifndef AVOID_CPIO
+
+ ATIUnmapVGA(iScreen, pATI);
+
+#endif /* AVOID_CPIO */
+
+ pATI->Mapped = FALSE;
+ return FALSE;
+ }
+
+ pATI->Mapped = TRUE;
+
+#if X_BYTE_ORDER == X_LITTLE_ENDIAN
+
+ if ((pATI->CursorBase >= pATI->LinearBase) &&
+ ((pATI->CursorOffset + 0x00000400UL) <= (CARD32)pATI->LinearSize))
+ pATI->pCursorImage = (char *)pATI->pMemory + pATI->CursorOffset;
+
+#endif /* X_BYTE_ORDER */
+
+ }
+
+ /* Map MMIO aperture */
+ if (pATI->Block0Base)
+ {
+ unsigned long MMIOBase = pATI->Block0Base & ~(PageSize - 1);
+
+ if (pVideo)
+ pATI->pMMIO = xf86MapPciMem(iScreen, VIDMEM_MMIO,
+ Tag, MMIOBase, PageSize);
+ else
+ pATI->pMMIO = xf86MapVidMem(iScreen, VIDMEM_MMIO,
+ MMIOBase, PageSize);
+
+ if (!pATI->pMMIO)
+ {
+
+#if X_BYTE_ORDER == X_LITTLE_ENDIAN
+
+ ATIUnmapCursor(iScreen, pATI);
+
+#endif /* X_BYTE_ORDER */
+
+ ATIUnmapLinear(iScreen, pATI);
+
+#ifndef AVOID_CPIO
+
+ ATIUnmapVGA(iScreen, pATI);
+
+#endif /* AVOID_CPIO */
+
+ pATI->Mapped = FALSE;
+ return FALSE;
+ }
+
+ pATI->Mapped = TRUE;
+
+ pATI->pBlock[0] = (char *)pATI->pMMIO +
+ (pATI->Block0Base - MMIOBase);
+
+ if (pATI->Block1Base)
+ pATI->pBlock[1] = (char *)pATI->pBlock[0] - 0x00000400U;
+
+#if X_BYTE_ORDER == X_LITTLE_ENDIAN
+
+ if (!pATI->pCursorImage)
+
+#endif /* X_BYTE_ORDER */
+
+ {
+ if ((pATI->CursorBase >= MMIOBase) &&
+ ((pATI->CursorBase + 0x00000400UL) <= (MMIOBase + PageSize)))
+ pATI->pCursorImage = (char *)pATI->pMMIO +
+ (pATI->CursorBase - MMIOBase);
+ }
+ }
+
+ /* Map hardware cursor image area */
+ if (pATI->CursorBase && !pATI->pCursorImage)
+ {
+ unsigned long CursorBase = pATI->CursorBase & ~(PageSize - 1);
+
+ if (pVideo)
+ pATI->pCursorPage = xf86MapPciMem(iScreen, VIDMEM_FRAMEBUFFER,
+ Tag, CursorBase, PageSize);
+ else
+ pATI->pCursorPage = xf86MapVidMem(iScreen, VIDMEM_FRAMEBUFFER,
+ CursorBase, PageSize);
+
+ if (!pATI->pCursorPage)
+ {
+ ATIUnmapCursor(iScreen, pATI);
+ ATIUnmapMMIO(iScreen, pATI);
+ ATIUnmapLinear(iScreen, pATI);
+
+#ifndef AVOID_CPIO
+
+ ATIUnmapVGA(iScreen, pATI);
+
+#endif /* AVOID_CPIO */
+
+ pATI->Mapped = FALSE;
+ return FALSE;
+ }
+
+ pATI->pCursorImage = (char *)pATI->pCursorPage +
+ (pATI->CursorBase - CursorBase);
+ }
+
+ return TRUE;
+}
+
+/*
+ * ATIUnmapApertures --
+ *
+ * This function unmaps all apertures used by the driver.
+ */
+void
+ATIUnmapApertures
+(
+ int iScreen,
+ ATIPtr pATI
+)
+{
+ if (!pATI->Mapped)
+ return;
+ pATI->Mapped = FALSE;
+
+ /* Unmap hardware cursor image area */
+ ATIUnmapCursor(iScreen, pATI);
+
+ /* Unmap MMIO area */
+ ATIUnmapMMIO(iScreen, pATI);
+
+ /* Unmap linear aperture */
+ ATIUnmapLinear(iScreen, pATI);
+
+#ifndef AVOID_CPIO
+
+ /* Unmap VGA aperture */
+ ATIUnmapVGA(iScreen, pATI);
+
+#endif /* AVOID_CPIO */
+
+}