xserver-multidpi/hw/kdrive/smi/smi.c
2006-07-21 17:56:00 -04:00

344 lines
7.2 KiB
C

/*
* Copyright © 2001 Keith Packard
*
* 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 Keith Packard not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Keith Packard makes no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL KEITH PACKARD 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.
*/
#ifdef HAVE_CONFIG_H
#include <kdrive-config.h>
#endif
#include "smi.h"
#include "kaa.h"
#include <sys/io.h>
static Bool
smiCardInit (KdCardInfo *card)
{
SmiCardInfo *smic;
ENTER ();
smic = (SmiCardInfo *) xalloc (sizeof (SmiCardInfo));
if (!smic)
return FALSE;
memset (smic, '\0', sizeof (SmiCardInfo));
(void) smiMapReg (card, smic);
if (!subInitialize (card, &smic->sub))
{
xfree (smic);
return FALSE;
}
card->driver = smic;
LEAVE();
return TRUE;
}
static Bool
smiScreenInit (KdScreenInfo *screen)
{
SmiCardInfo *smic = screen->card->driver;
SmiScreenInfo *smis;
ENTER();
smis = (SmiScreenInfo *) xalloc (sizeof (SmiScreenInfo));
if (!smis)
return FALSE;
memset (smis, '\0', sizeof (SmiScreenInfo));
screen->driver = smis;
if (!subScreenInitialize (screen, &smis->sub))
{
xfree (smis);
return FALSE;
}
if (!smic->reg_base)
screen->dumb = TRUE;
screen->softCursor = TRUE;
#if SMI_VESA
smis->screen = smis->sub.fb;
#else
smis->screen = smic->sub.fb;
#endif
LEAVE();
return TRUE;
}
static Bool
smiInitScreen (ScreenPtr pScreen)
{
Bool ret;
ENTER ();
#if 0
#ifdef XV
KdScreenPriv(pScreen);
SmiCardInfo *smic = pScreenPriv->screen->card->driver;
if (smic->media_reg && smic->reg)
smiInitVideo(pScreen);
#endif
#endif
ret = subInitScreen (pScreen);
LEAVE();
return ret;
}
#ifdef RANDR
static Bool
smiRandRSetConfig (ScreenPtr pScreen,
Rotation randr,
int rate,
RRScreenSizePtr pSize)
{
Bool ret;
ENTER ();
kaaWaitSync (pScreen);
ret = subRandRSetConfig (pScreen, randr, rate, pSize);
LEAVE();
return ret;
}
static Bool
smiRandRInit (ScreenPtr pScreen)
{
rrScrPriv(pScreen);
ENTER ();
pScrPriv->rrSetConfig = smiRandRSetConfig;
LEAVE ();
return TRUE;
}
#endif
static Bool
smiFinishInitScreen (ScreenPtr pScreen)
{
Bool ret;
ret = subFinishInitScreen (pScreen);
#ifdef RANDR
smiRandRInit (pScreen);
#endif
return ret;
}
void
smiPreserve (KdCardInfo *card)
{
ENTER ();
subPreserve(card);
LEAVE();
}
Bool
smiMapReg (KdCardInfo *card, SmiCardInfo *smic)
{
ENTER ();
smic->io_base = 0; /* only handles one SMI card at standard VGA address */
smic->reg_base = (CARD8 *) KdMapDevice (SMI_REG_BASE(card),
SMI_REG_SIZE(card));
if (!smic->reg_base)
{
smic->dpr = 0;
return FALSE;
}
KdSetMappedMode (SMI_REG_BASE(card),
SMI_REG_SIZE(card),
KD_MAPPED_MODE_REGISTERS);
smic->dpr = (DPR *) (smic->reg_base + SMI_DPR_OFF(card));
LEAVE ();
return TRUE;
}
void
smiUnmapReg (KdCardInfo *card, SmiCardInfo *smic)
{
ENTER ();
if (smic->reg_base)
{
KdResetMappedMode (SMI_REG_BASE(card),
SMI_REG_SIZE(card),
KD_MAPPED_MODE_REGISTERS);
KdUnmapDevice ((void *) smic->reg_base, SMI_REG_SIZE(card));
smic->reg_base = 0;
smic->dpr = 0;
}
LEAVE ();
}
void
smiOutb (CARD16 port, CARD8 val)
{
asm volatile ("outb %b0,%w1" : : "a" (val), "d" (port));
}
CARD8
smiInb (CARD16 port)
{
CARD8 v;
asm volatile ("inb %w1,%b0" : "=a" (v) : "d" (port));
return v;
}
CARD8
smiGetIndex (SmiCardInfo *smic, CARD16 addr, CARD16 data, CARD8 id)
{
smiOutb (smic->io_base + addr, id);
return smiInb (smic->io_base + data);
}
void
smiSetIndex (SmiCardInfo *smic, CARD16 addr, CARD16 data, CARD8 id, CARD8 val)
{
smiOutb (smic->io_base + addr, id);
smiOutb (smic->io_base + data, val);
}
void
smiSetMMIO (KdCardInfo *card, SmiCardInfo *smic)
{
ENTER ();
if (!smic->reg_base)
smiMapReg (card, smic);
LEAVE();
}
void
smiResetMMIO (KdCardInfo *card, SmiCardInfo *smic)
{
smiUnmapReg (card, smic);
}
static Bool
smiDPMS (ScreenPtr pScreen, int mode)
{
Bool ret;
ENTER ();
ret = subDPMS (pScreen, mode);
LEAVE ();
return ret;
}
Bool
smiEnable (ScreenPtr pScreen)
{
KdScreenPriv(pScreen);
SmiCardInfo *smic = pScreenPriv->card->driver;
ENTER ();
iopl (3);
if (!subEnable (pScreen))
return FALSE;
smiSetMMIO (pScreenPriv->card, smic);
smiDPMS (pScreen, KD_DPMS_NORMAL);
#if 0
#ifdef XV
KdXVEnable (pScreen);
#endif
#endif
LEAVE ();
return TRUE;
}
void
smiDisable (ScreenPtr pScreen)
{
KdScreenPriv(pScreen);
SmiCardInfo *smic = pScreenPriv->card->driver;
ENTER ();
#if 0
#ifdef XV
KdXVDisable (pScreen);
#endif
#endif
smiResetMMIO (pScreenPriv->card, smic);
subDisable (pScreen);
LEAVE ();
}
static void
smiRestore (KdCardInfo *card)
{
ENTER ();
subRestore (card);
LEAVE();
}
static void
smiScreenFini (KdScreenInfo *screen)
{
SmiScreenInfo *smis = (SmiScreenInfo *) screen->driver;
ENTER ();
subScreenFini (screen);
xfree (smis);
screen->driver = 0;
LEAVE ();
}
static void
smiCardFini (KdCardInfo *card)
{
SmiCardInfo *smic = card->driver;
ENTER ();
smiUnmapReg (card, smic);
subCardFini (card);
LEAVE ();
}
#define smiCursorInit 0 /* initCursor */
#define smiCursorEnable 0 /* enableCursor */
#define smiCursorDisable 0 /* disableCursor */
#define smiCursorFini 0 /* finiCursor */
#define smiRecolorCursor 0 /* recolorCursor */
KdCardFuncs smiFuncs = {
smiCardInit, /* cardinit */
smiScreenInit, /* scrinit */
smiInitScreen, /* initScreen */
smiFinishInitScreen, /* finishInitScreen */
subCreateResources, /* createRes */
smiPreserve, /* preserve */
smiEnable, /* enable */
smiDPMS, /* dpms */
smiDisable, /* disable */
smiRestore, /* restore */
smiScreenFini, /* scrfini */
smiCardFini, /* cardfini */
smiCursorInit, /* initCursor */
smiCursorEnable, /* enableCursor */
smiCursorDisable, /* disableCursor */
smiCursorFini, /* finiCursor */
smiRecolorCursor, /* recolorCursor */
smiDrawInit, /* initAccel */
smiDrawEnable, /* enableAccel */
smiDrawDisable, /* disableAccel */
smiDrawFini, /* finiAccel */
subGetColors, /* getColors */
subPutColors, /* putColors */
};