#include "ati.h"
#include "atiadjust.h"
#include "atichip.h"
#include "aticrtc.h"
#include "atilock.h"
#include "atimach64io.h"
#include "atiwonderio.h"
void
ATIAdjustPreInit
(
ATIPtr pATI
)
{
unsigned long MaxBase;
#ifndef AVOID_CPIO
if ((pATI->CPIO_VGAWonder) &&
(pATI->Chip <= ATI_CHIP_18800_1) &&
(pATI->VideoRAM == 256) &&
(pATI->depth >= 8))
{
pATI->AdjustDepth = (pATI->bitsPerPixel + 3) >> 2;
pATI->AdjustMask = (unsigned long)(-32);
}
else
#endif
{
pATI->AdjustDepth = (pATI->bitsPerPixel + 7) >> 3;
pATI->AdjustMask = 64;
while (pATI->AdjustMask % (unsigned long)(pATI->AdjustDepth))
pATI->AdjustMask += 64;
pATI->AdjustMask =
~(((pATI->AdjustMask / (unsigned long)(pATI->AdjustDepth)) >> 3) -
1);
}
switch (pATI->NewHW.crtc)
{
#ifndef AVOID_CPIO
case ATI_CRTC_VGA:
if (pATI->Chip >= ATI_CHIP_264CT)
{
pATI->AdjustMaxBase = MaxBits(CRTC_OFFSET_VGA) << 2;
if (pATI->depth <= 4)
pATI->AdjustMaxBase <<= 1;
}
else if (!pATI->CPIO_VGAWonder)
{
pATI->AdjustMaxBase = 0xFFFFU << 3;
}
else if (pATI->Chip <= ATI_CHIP_28800_6)
{
pATI->AdjustMaxBase = 0x03FFFFU << 3;
}
else
{
pATI->AdjustMaxBase = 0x0FFFFFU << 3;
}
break;
#endif
case ATI_CRTC_MACH64:
pATI->AdjustMaxBase = MaxBits(CRTC_OFFSET) << 3;
break;
default:
pATI->AdjustMaxBase = 0;
break;
}
MaxBase = (pATI->AdjustMaxBase / (unsigned long)pATI->AdjustDepth) |
~pATI->AdjustMask;
pATI->AdjustMaxX = MaxBase % pATI->displayWidth;
pATI->AdjustMaxY = MaxBase / pATI->displayWidth;
}
void
ATIAdjustFrame
(
int scrnIndex,
int x,
int y,
int flags
)
{
ScrnInfoPtr pScreenInfo = xf86Screens[scrnIndex];
ATIPtr pATI = ATIPTR(pScreenInfo);
int Base, xy;
if (y >= pATI->AdjustMaxY)
{
y = pATI->AdjustMaxY;
if (x > pATI->AdjustMaxX)
y--;
}
Base = ((((y * pATI->displayWidth) + x) & pATI->AdjustMask) *
pATI->AdjustDepth) >> 3;
if (!pATI->currentMode)
{
xy = (Base << 3) / pATI->AdjustDepth;
pScreenInfo->frameX0 = xy % pATI->displayWidth;
pScreenInfo->frameY0 = xy / pATI->displayWidth;
pScreenInfo->frameX1 =
pScreenInfo->frameX0 + pScreenInfo->currentMode->HDisplay - 1;
pScreenInfo->frameY1 =
pScreenInfo->frameY0 + pScreenInfo->currentMode->VDisplay - 1;
}
ATIUnlock(pATI);
#ifndef AVOID_CPIO
if ((pATI->NewHW.crtc == ATI_CRTC_VGA) && (pATI->Chip < ATI_CHIP_264CT))
{
PutReg(CRTX(pATI->CPIO_VGABase), 0x0CU, GetByte(Base, 1));
PutReg(CRTX(pATI->CPIO_VGABase), 0x0DU, GetByte(Base, 0));
if (pATI->CPIO_VGAWonder)
{
if (pATI->Chip <= ATI_CHIP_18800_1)
ATIModifyExtReg(pATI, 0xB0U, -1, 0x3FU, Base >> 10);
else
{
ATIModifyExtReg(pATI, 0xB0U, -1, 0xBFU, Base >> 10);
ATIModifyExtReg(pATI, 0xA3U, -1, 0xEFU, Base >> 13);
if (pATI->Chip >= ATI_CHIP_68800)
ATIModifyExtReg(pATI, 0xADU, -1, 0xF3U, Base >> 16);
}
}
}
else
if (pATI->depth <= 4)
{
outr(CRTC_OFF_PITCH, SetBits(pATI->displayWidth >> 4, CRTC_PITCH) |
SetBits(Base, CRTC_OFFSET));
}
else
#endif
{
#ifndef AVOID_CPIO
if (pATI->NewHW.crtc == ATI_CRTC_VGA)
Base <<= 1;
#endif
outr(CRTC_OFF_PITCH, SetBits(pATI->displayWidth >> 3, CRTC_PITCH) |
SetBits(Base, CRTC_OFFSET));
}
}