2003-07-02 19:53:46 +02:00
|
|
|
|
/*
|
|
|
|
|
* Copyright <EFBFBD> 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.
|
|
|
|
|
*/
|
|
|
|
|
/* $XFree86: xc/programs/Xserver/hw/kdrive/smi/smi.c,v 1.11 2002/10/18 06:31:17 keithp Exp $ */
|
|
|
|
|
|
2003-10-02 04:30:28 +02:00
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
|
#include <config.h>
|
|
|
|
|
#endif
|
2003-07-02 19:53:46 +02:00
|
|
|
|
#include "smi.h"
|
|
|
|
|
#include <sys/io.h>
|
|
|
|
|
|
|
|
|
|
#define DEBUG
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
|
#define DBGOUT(fmt,a...) fprintf (stderr, fmt, ##a)
|
|
|
|
|
#else
|
|
|
|
|
#define DBGOUT(fmt,a...)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#define ENTER() DBGOUT("Enter %s\n", __FUNCTION__)
|
|
|
|
|
#define LEAVE() DBGOUT("Leave %s\n", __FUNCTION__)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Bool
|
|
|
|
|
smiCardInit (KdCardInfo *card)
|
|
|
|
|
{
|
|
|
|
|
SmiCardInfo *smic;
|
|
|
|
|
|
|
|
|
|
ENTER ();
|
|
|
|
|
smic = (SmiCardInfo *) xalloc (sizeof (SmiCardInfo));
|
|
|
|
|
if (!smic)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
(void) smiMapReg (card, smic);
|
|
|
|
|
|
|
|
|
|
if (!vesaInitialize (card, &smic->vesa))
|
|
|
|
|
{
|
|
|
|
|
xfree (smic);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
card->driver = smic;
|
|
|
|
|
LEAVE();
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Bool
|
|
|
|
|
smiScreenInit (KdScreenInfo *screen)
|
|
|
|
|
{
|
|
|
|
|
SmiCardInfo *smic = screen->card->driver;
|
|
|
|
|
SmiScreenInfo *smis;
|
|
|
|
|
int screen_size, memory;
|
|
|
|
|
|
|
|
|
|
ENTER();
|
|
|
|
|
smis = (SmiScreenInfo *) xalloc (sizeof (SmiScreenInfo));
|
|
|
|
|
if (!smis)
|
|
|
|
|
return FALSE;
|
|
|
|
|
memset (smis, '\0', sizeof (SmiScreenInfo));
|
|
|
|
|
if (!vesaScreenInitialize (screen, &smis->vesa))
|
|
|
|
|
{
|
|
|
|
|
xfree (smis);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
if (!smic->reg_base)
|
|
|
|
|
screen->dumb = TRUE;
|
|
|
|
|
if (smis->vesa.mapping != VESA_LINEAR)
|
|
|
|
|
screen->dumb = TRUE;
|
|
|
|
|
smis->screen = smis->vesa.fb;
|
|
|
|
|
memory = smis->vesa.fb_size;
|
|
|
|
|
screen_size = screen->fb[0].byteStride * screen->height;
|
|
|
|
|
screen->softCursor = TRUE;
|
|
|
|
|
memory -= screen_size;
|
|
|
|
|
if (memory > screen->fb[0].byteStride)
|
|
|
|
|
{
|
|
|
|
|
smis->off_screen = smis->screen + screen_size;
|
|
|
|
|
smis->off_screen_size = memory;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
smis->off_screen = 0;
|
|
|
|
|
smis->off_screen_size = 0;
|
|
|
|
|
}
|
|
|
|
|
screen->driver = smis;
|
|
|
|
|
LEAVE();
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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 = vesaInitScreen (pScreen);
|
|
|
|
|
LEAVE();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef RANDR
|
|
|
|
|
smiRandRSetConfig (ScreenPtr pScreen,
|
|
|
|
|
Rotation randr,
|
|
|
|
|
int rate,
|
|
|
|
|
RRScreenSizePtr pSize)
|
|
|
|
|
{
|
|
|
|
|
Bool ret;
|
|
|
|
|
KdScreenPriv(pScreen);
|
|
|
|
|
|
|
|
|
|
ENTER ();
|
|
|
|
|
KdCheckSync (pScreen);
|
|
|
|
|
|
|
|
|
|
ret = vesaRandRSetConfig (pScreen, randr, rate, pSize);
|
|
|
|
|
LEAVE();
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Bool
|
|
|
|
|
smiRandRInit (ScreenPtr pScreen)
|
|
|
|
|
{
|
|
|
|
|
rrScrPriv(pScreen);
|
|
|
|
|
|
|
|
|
|
ENTER ();
|
|
|
|
|
pScrPriv->rrSetConfig = smiRandRSetConfig;
|
|
|
|
|
LEAVE ();
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
Bool
|
|
|
|
|
smiFinishInitScreen (ScreenPtr pScreen)
|
|
|
|
|
{
|
|
|
|
|
ENTER ();
|
|
|
|
|
if (!vesaFinishInitScreen (pScreen))
|
|
|
|
|
return FALSE;
|
|
|
|
|
#ifdef RANDR
|
|
|
|
|
if (!smiRandRInit (pScreen))
|
|
|
|
|
return FALSE;
|
|
|
|
|
#endif
|
|
|
|
|
LEAVE ();
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
smiPreserve (KdCardInfo *card)
|
|
|
|
|
{
|
|
|
|
|
SmiCardInfo *smic = card->driver;
|
|
|
|
|
|
|
|
|
|
ENTER ();
|
|
|
|
|
vesaPreserve(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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Bool
|
|
|
|
|
smiEnable (ScreenPtr pScreen)
|
|
|
|
|
{
|
|
|
|
|
KdScreenPriv(pScreen);
|
|
|
|
|
SmiCardInfo *smic = pScreenPriv->card->driver;
|
|
|
|
|
|
|
|
|
|
ENTER ();
|
|
|
|
|
if (!vesaEnable (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 ();
|
|
|
|
|
#ifdef XV
|
|
|
|
|
KdXVDisable (pScreen);
|
|
|
|
|
#endif
|
|
|
|
|
smiResetMMIO (pScreenPriv->card, smic);
|
|
|
|
|
vesaDisable (pScreen);
|
|
|
|
|
LEAVE ();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Bool
|
|
|
|
|
smiDPMS (ScreenPtr pScreen, int mode)
|
|
|
|
|
{
|
|
|
|
|
Bool ret;
|
|
|
|
|
ENTER ();
|
|
|
|
|
ret = vesaDPMS (pScreen, mode);
|
|
|
|
|
LEAVE ();
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
smiRestore (KdCardInfo *card)
|
|
|
|
|
{
|
|
|
|
|
SmiCardInfo *smic = card->driver;
|
|
|
|
|
|
|
|
|
|
ENTER ();
|
|
|
|
|
vesaRestore (card);
|
|
|
|
|
LEAVE();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
smiScreenFini (KdScreenInfo *screen)
|
|
|
|
|
{
|
|
|
|
|
SmiScreenInfo *smis = (SmiScreenInfo *) screen->driver;
|
|
|
|
|
|
|
|
|
|
ENTER ();
|
|
|
|
|
vesaScreenFini (screen);
|
|
|
|
|
xfree (smis);
|
|
|
|
|
screen->driver = 0;
|
|
|
|
|
LEAVE ();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
smiCardFini (KdCardInfo *card)
|
|
|
|
|
{
|
|
|
|
|
SmiCardInfo *smic = card->driver;
|
|
|
|
|
|
|
|
|
|
ENTER ();
|
|
|
|
|
smiUnmapReg (card, smic);
|
|
|
|
|
vesaCardFini (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 */
|
|
|
|
|
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 */
|
|
|
|
|
smiDrawSync, /* syncAccel */
|
|
|
|
|
smiDrawDisable, /* disableAccel */
|
|
|
|
|
smiDrawFini, /* finiAccel */
|
|
|
|
|
|
|
|
|
|
vesaGetColors, /* getColors */
|
|
|
|
|
vesaPutColors, /* putColors */
|
|
|
|
|
|
|
|
|
|
smiFinishInitScreen, /* finishInitScreen */
|
|
|
|
|
};
|