#ifdef HAVE_CONFIG_H
#include <kdrive-config.h>
#endif
#include "mga.h"
static Bool
mgaCardInit (KdCardInfo *card)
{
MgaCardInfo *mgac;
mgac = (MgaCardInfo *) xalloc (sizeof (MgaCardInfo));
if (!mgac)
return FALSE;
mgaMapReg (card, mgac);
if (!vesaInitialize (card, &mgac->vesa))
{
xfree (mgac);
return FALSE;
}
mgac->fifo_size = 0;
card->driver = mgac;
return TRUE;
}
static Bool
mgaScreenInit (KdScreenInfo *screen)
{
MgaScreenInfo *mgas;
mgas = (MgaScreenInfo *) xalloc (sizeof (MgaScreenInfo));
if (!mgas)
return FALSE;
memset (mgas, '\0', sizeof (MgaScreenInfo));
if (!vesaScreenInitialize (screen, &mgas->vesa))
{
xfree (mgas);
return FALSE;
}
#if 0
if (mgas->vesa.mapping != VESA_LINEAR)
screen->dumb = TRUE;
fprintf (stderr, "vesa mapping is %d\n", mgas->vesa.mapping);
#endif
screen->driver = mgas;
return TRUE;
}
static Bool
mgaInitScreen (ScreenPtr pScreen)
{
return vesaInitScreen (pScreen);
}
static Bool
mgaFinishInitScreen (ScreenPtr pScreen)
{
Bool ret;
ret = vesaFinishInitScreen (pScreen);
return ret;
}
static Bool
mgaCreateResources (ScreenPtr pScreen)
{
return vesaCreateResources (pScreen);
}
static void
mgaPreserve (KdCardInfo *card)
{
vesaPreserve (card);
}
Bool
mgaMapReg (KdCardInfo *card, MgaCardInfo *mgac)
{
mgac->reg_base = (CARD8 *) KdMapDevice (MGA_REG_BASE (card),
MGA_REG_SIZE (card));
if (!mgac->reg_base)
{
return FALSE;
}
KdSetMappedMode (MGA_REG_BASE (card),
MGA_REG_SIZE (card),
KD_MAPPED_MODE_REGISTERS);
return TRUE;
}
void
mgaUnmapReg (KdCardInfo *card, MgaCardInfo *mgac)
{
if (mgac->reg_base)
{
KdResetMappedMode (MGA_REG_BASE (card),
MGA_REG_SIZE (card),
KD_MAPPED_MODE_REGISTERS);
KdUnmapDevice ((void *) mgac->reg_base, MGA_REG_SIZE (card));
mgac->reg_base = 0;
}
}
void
mgaSetMMIO (KdCardInfo *card, MgaCardInfo *mgac)
{
if (!mgac->reg_base)
mgaMapReg (card, mgac);
}
void
mgaResetMMIO (KdCardInfo *card, MgaCardInfo *mgac)
{
mgaUnmapReg (card, mgac);
}
static Bool
mgaDPMS (ScreenPtr pScreen, int mode)
{
return TRUE;
}
static Bool
mgaEnable (ScreenPtr pScreen)
{
KdScreenPriv (pScreen);
MgaCardInfo *mgac = pScreenPriv->card->driver;
if (!vesaEnable (pScreen))
return FALSE;
mgaSetMMIO (pScreenPriv->card, mgac);
mgaDPMS (pScreen, KD_DPMS_NORMAL);
return TRUE;
}
static void
mgaDisable (ScreenPtr pScreen)
{
KdScreenPriv (pScreen);
MgaCardInfo *mgac = pScreenPriv->card->driver;
mgaResetMMIO (pScreenPriv->card, mgac);
vesaDisable (pScreen);
}
static void
mgaRestore (KdCardInfo *card)
{
MgaCardInfo *mgac = card->driver;
mgaResetMMIO (card, mgac);
vesaRestore (card);
}
static void
mgaScreenFini (KdScreenInfo *screen)
{
MgaScreenInfo *mgas = (MgaScreenInfo *) screen->driver;
vesaScreenFini (screen);
xfree (mgas);
screen->driver = 0;
}
static void
mgaCardFini (KdCardInfo *card)
{
MgaCardInfo *mgac = (MgaCardInfo *)card->driver;
mgaUnmapReg (card, mgac);
vesaCardFini (card);
}
KdCardFuncs mgaFuncs = {
mgaCardInit,
mgaScreenInit,
mgaInitScreen,
mgaFinishInitScreen,
mgaCreateResources,
mgaPreserve,
mgaEnable,
mgaDPMS,
mgaDisable,
mgaRestore,
mgaScreenFini,
mgaCardFini,
0,
0,
0,
0,
0,
mgaDrawInit,
mgaDrawEnable,
mgaDrawDisable,
mgaDrawFini,
vesaGetColors,
vesaPutColors,
};