/* * 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. */ /* $XFree86: xc/programs/Xserver/hw/kdrive/smi/smi.c,v 1.11 2002/10/18 06:31:17 keithp Exp $ */ #ifdef HAVE_CONFIG_H #include #endif #include "smi.h" #include #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 */ };