#include "atiadapter.h"
#include "aticonsole.h"
#include "aticrtc.h"
#include "atii2c.h"
#include "atilock.h"
#include "atimach64.h"
#include "atimode.h"
#include "atistruct.h"
#include "ativga.h"
#include "atividmem.h"
#include "xf86.h"
Bool
ATISaveScreen
(
ScreenPtr pScreen,
int Mode
)
{
ScrnInfoPtr pScreenInfo;
ATIPtr pATI;
if ((Mode != SCREEN_SAVER_ON) && (Mode != SCREEN_SAVER_CYCLE))
SetTimeSinceLastInputEvent();
if (!pScreen)
return TRUE;
pScreenInfo = xf86Screens[pScreen->myNum];
if (!pScreenInfo->vtSema)
return TRUE;
pATI = ATIPTR(pScreenInfo);
switch (pATI->NewHW.crtc)
{
#ifndef AVOID_CPIO
case ATI_CRTC_VGA:
ATIVGASaveScreen(pATI, Mode);
break;
#endif
case ATI_CRTC_MACH64:
ATIMach64SaveScreen(pATI, Mode);
break;
default:
break;
}
return TRUE;
}
void
ATISetDPMSMode
(
ScrnInfoPtr pScreenInfo,
int DPMSMode,
int flags
)
{
ATIPtr pATI;
if (!pScreenInfo || !pScreenInfo->vtSema)
return;
pATI = ATIPTR(pScreenInfo);
switch (pATI->Adapter)
{
case ATI_ADAPTER_MACH64:
ATIMach64SetDPMSMode(pScreenInfo, pATI, DPMSMode);
break;
default:
#ifndef AVOID_CPIO
ATIVGASetDPMSMode(pATI, DPMSMode);
break;
case ATI_ADAPTER_NONE:
case ATI_ADAPTER_8514A:
case ATI_ADAPTER_MACH8:
#endif
break;
}
}
Bool
ATIEnterGraphics
(
ScreenPtr pScreen,
ScrnInfoPtr pScreenInfo,
ATIPtr pATI
)
{
if (!ATIMapApertures(pScreenInfo->scrnIndex, pATI))
return FALSE;
ATIUnlock(pATI);
if (pScreen &&
!ATIModeCalculate(pScreenInfo->scrnIndex, pATI, &pATI->NewHW,
pScreenInfo->currentMode))
return FALSE;
pScreenInfo->vtSema = TRUE;
ATIModeSave(pScreenInfo, pATI, &pATI->OldHW);
ATIModeSet(pScreenInfo, pATI, &pATI->NewHW);
if (pScreen)
(void)ATISaveScreen(pScreen, SCREEN_SAVER_ON);
(*pScreenInfo->AdjustFrame)(pScreenInfo->scrnIndex,
pScreenInfo->frameX0, pScreenInfo->frameY0, 0);
SetTimeSinceLastInputEvent();
return TRUE;
}
void
ATILeaveGraphics
(
ScrnInfoPtr pScreenInfo,
ATIPtr pATI
)
{
if (pScreenInfo->vtSema)
{
if (!xf86ServerIsExiting())
ATIModeSave(pScreenInfo, pATI, &pATI->NewHW);
ATIModeSet(pScreenInfo, pATI, &pATI->OldHW);
pScreenInfo->vtSema = FALSE;
}
ATILock(pATI);
#ifdef AVOID_DGA
if (!pATI->Closeable)
#else
if (!pATI->Closeable || !pATI->nDGAMode)
#endif
ATIUnmapApertures(pScreenInfo->scrnIndex, pATI);
SetTimeSinceLastInputEvent();
}
Bool
ATISwitchMode
(
int iScreen,
DisplayModePtr pMode,
int flags
)
{
ScrnInfoPtr pScreenInfo = xf86Screens[iScreen];
ATIPtr pATI = ATIPTR(pScreenInfo);
if (!ATIModeCalculate(iScreen, pATI, &pATI->NewHW, pMode))
return FALSE;
if (pScreenInfo->vtSema)
{
pScreenInfo->currentMode = pMode;
ATIModeSet(pScreenInfo, pATI, &pATI->NewHW);
}
SetTimeSinceLastInputEvent();
return TRUE;
}
Bool
ATIEnterVT
(
int iScreen,
int flags
)
{
ScrnInfoPtr pScreenInfo = xf86Screens[iScreen];
ScreenPtr pScreen = pScreenInfo->pScreen;
ATIPtr pATI = ATIPTR(pScreenInfo);
PixmapPtr pScreenPixmap;
DevUnion PixmapPrivate;
Bool Entered;
if (!ATIEnterGraphics(NULL, pScreenInfo, pATI))
return FALSE;
if (pATI->OptionShadowFB)
return TRUE;
#ifndef AVOID_CPIO
if (!miModifyBanking(pScreen, &pATI->BankInfo))
return FALSE;
#endif
pScreenPixmap = (*pScreen->GetScreenPixmap)(pScreen);
PixmapPrivate = pScreenPixmap->devPrivate;
if (!PixmapPrivate.ptr)
pScreenPixmap->devPrivate = pScreenInfo->pixmapPrivate;
Entered = (*pScreen->ModifyPixmapHeader)(pScreenPixmap,
-1, -1, -1, -1, -1, pATI->pMemory);
if (!PixmapPrivate.ptr)
{
pScreenInfo->pixmapPrivate = pScreenPixmap->devPrivate;
pScreenPixmap->devPrivate.ptr = NULL;
}
return Entered;
}
void
ATILeaveVT
(
int iScreen,
int flags
)
{
ScrnInfoPtr pScreenInfo = xf86Screens[iScreen];
ATILeaveGraphics(pScreenInfo, ATIPTR(pScreenInfo));
}
void
ATIFreeScreen
(
int iScreen,
int flags
)
{
ScreenPtr pScreen = screenInfo.screens[iScreen];
ScrnInfoPtr pScreenInfo = xf86Screens[iScreen];
ATIPtr pATI = ATIPTR(pScreenInfo);
if (pATI->Closeable || (serverGeneration > 1))
ATII2CFreeScreen(iScreen);
if (pATI->Closeable)
(void)(*pScreen->CloseScreen)(iScreen, pScreen);
ATILeaveGraphics(pScreenInfo, pATI);
#ifndef AVOID_CPIO
xfree(pATI->OldHW.frame_buffer);
xfree(pATI->NewHW.frame_buffer);
#endif
xfree(pATI->pShadow);
#ifndef AVOID_DGA
xfree(pATI->pDGAMode);
#endif
xfree(pATI);
pScreenInfo->driverPrivate = NULL;
}