#include "ati.h"
#include "atiadapter.h"
#include "atistruct.h"
#include "atividmem.h"
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"
};
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"
};
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
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
static void
ATIUnmapLinear
(
int iScreen,
ATIPtr pATI
)
{
#ifdef AVOID_CPIO
if (!pATI->pMemory)
return;
#else
if (pATI->pMemory != pATI->pBank)
#endif
{
xf86UnMapVidMem(iScreen, pATI->pMemory, pATI->LinearSize);
#if X_BYTE_ORDER != X_LITTLE_ENDIAN
if (pATI->pMemoryLE)
xf86UnMapVidMem(iScreen, pATI->pMemoryLE, pATI->LinearSize);
#endif
}
pATI->pMemory = pATI->pMemoryLE = NULL;
}
static void
ATIUnmapMMIO
(
int iScreen,
ATIPtr pATI
)
{
if (pATI->pMMIO)
xf86UnMapVidMem(iScreen, pATI->pMMIO, getpagesize());
pATI->pMMIO = pATI->pBlock[0] = pATI->pBlock[1] = NULL;
}
static void
ATIUnmapCursor
(
int iScreen,
ATIPtr pATI
)
{
if (pATI->pCursorPage)
xf86UnMapVidMem(iScreen, pATI->pCursorPage, getpagesize());
pATI->pCursorPage = pATI->pCursorImage = NULL;
}
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
{
if (!pATI->LinearBase && !pATI->Block0Base)
return FALSE;
}
PageSize = getpagesize();
if ((pVideo = pATI->PCIInfo))
Tag = ((pciConfigPtr)(pVideo->thisCard))->tag;
else
Tag = 0;
#ifndef AVOID_CPIO
if (pATI->VGAAdapter != ATI_ADAPTER_NONE)
{
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
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
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;
pATI->pMemoryLE = pATI->pMemory;
#else
if (pVideo)
{
pATI->pMemoryLE = xf86MapPciMem(iScreen, VIDMEM_MMIO, Tag,
pATI->LinearBase - 0x00800000U, pATI->LinearSize);
if (!pATI->pMemoryLE)
{
ATIUnmapLinear(iScreen, pATI);
#ifndef AVOID_CPIO
ATIUnmapVGA(iScreen, pATI);
#endif
pATI->Mapped = FALSE;
return FALSE;
}
}
#endif
}
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
ATIUnmapLinear(iScreen, pATI);
#ifndef AVOID_CPIO
ATIUnmapVGA(iScreen, pATI);
#endif
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
{
if ((pATI->CursorBase >= MMIOBase) &&
((pATI->CursorBase + 0x00000400UL) <= (MMIOBase + PageSize)))
pATI->pCursorImage = (char *)pATI->pMMIO +
(pATI->CursorBase - MMIOBase);
}
}
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
pATI->Mapped = FALSE;
return FALSE;
}
pATI->pCursorImage = (char *)pATI->pCursorPage +
(pATI->CursorBase - CursorBase);
}
return TRUE;
}
void
ATIUnmapApertures
(
int iScreen,
ATIPtr pATI
)
{
if (!pATI->Mapped)
return;
pATI->Mapped = FALSE;
ATIUnmapCursor(iScreen, pATI);
ATIUnmapMMIO(iScreen, pATI);
ATIUnmapLinear(iScreen, pATI);
#ifndef AVOID_CPIO
ATIUnmapVGA(iScreen, pATI);
#endif
}