diff --git a/hw/kdrive/chips/Imakefile b/hw/kdrive/chips/Imakefile new file mode 100644 index 000000000..d2a06d265 --- /dev/null +++ b/hw/kdrive/chips/Imakefile @@ -0,0 +1,14 @@ +XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $ +XCOMM $XFree86: xc/programs/Xserver/hw/kdrive/chips/Imakefile,v 1.6 2000/10/20 00:19:51 keithp Exp $ +KDRIVE=.. +#include "../Kdrive.tmpl" + +SRCS = chips.c chipsdraw.c chipsstub.c + +OBJS = chips.o chipsdraw.o chipsstub.o + +INCLUDES = -I. $(KDINCS) -I$(KDRIVE)/vesa + +NormalLibraryObjectRule() +NormalLibraryTarget(chips,$(OBJS)) +DependTarget() diff --git a/hw/kdrive/chips/chips.c b/hw/kdrive/chips/chips.c new file mode 100644 index 000000000..3ab05bf86 --- /dev/null +++ b/hw/kdrive/chips/chips.c @@ -0,0 +1,302 @@ +/* + * 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/trident/trident.c,v 1.18 2001/06/04 09:45:42 keithp Exp $ */ + +#include "chips.h" +#include + +#undef CHIPS_DEBUG + +Bool +chipsCardInit (KdCardInfo *card) +{ + int k; + char *pixels; + ChipsCardInfo *chipsc; + CARD8 r00, r01, r02; + CARD8 r39; + + chipsc = (ChipsCardInfo *) xalloc (sizeof (ChipsCardInfo)); + if (!chipsc) + return FALSE; + + iopl (3); + + if (!vesaInitialize (card, &chipsc->vesa)) + { + xfree (chipsc); + return FALSE; + } + +#ifdef USE_PCI + chipsc->window = (CARD32 *) (chipsc->cop_base + 0x10000); +#else + chipsc->window = 0; +#endif + card->driver = chipsc; + + return TRUE; +} + +Bool +chipsScreenInit (KdScreenInfo *screen) +{ + ChipsCardInfo *chipsc = screen->card->driver; + ChipsScreenInfo *chipss; + int screen_size, memory; + CARD32 mmio_base; + CARD32 mmio_size; + + chipss = (ChipsScreenInfo *) xalloc (sizeof (ChipsScreenInfo)); + if (!chipss) + return FALSE; + memset (chipss, '\0', sizeof (ChipsScreenInfo)); + if (!vesaScreenInitialize (screen, &chipss->vesa)) + { + xfree (chipss); + return FALSE; + } + + if (chipss->vesa.mapping != VESA_LINEAR) + screen->dumb = TRUE; + if (!screen->dumb) + { + chipss->mmio_base = (CARD8 *) KdMapDevice (CHIPS_MMIO_BASE(chipss), + CHIPS_MMIO_SIZE(chipss)); + + if (chipss->mmio_base) + { + KdSetMappedMode (CHIPS_MMIO_BASE(chipss), + CHIPS_MMIO_SIZE(chipss), + KD_MAPPED_MODE_REGISTERS); + } + else + screen->dumb = TRUE; + } + else + chipss->mmio_base = 0; + + chipss->screen = chipss->vesa.fb; + memory = chipss->vesa.fb_size; + + screen_size = screen->fb[0].byteStride * screen->height; + + if (chipss->screen && memory >= screen_size + 2048) + { + memory -= 2048; + chipss->cursor_base = chipss->screen + memory - 2048; + } + else + chipss->cursor_base = 0; + memory -= screen_size; + if (memory > screen->fb[0].byteStride) + { + chipss->off_screen = chipss->screen + screen_size; + chipss->off_screen_size = memory; + } + else + { + chipss->off_screen = 0; + chipss->off_screen_size = 0; + } + screen->driver = chipss; + return TRUE; +} + +Bool +chipsInitScreen (ScreenPtr pScreen) +{ + return vesaInitScreen (pScreen); +} + +Bool +chipsFinishInitScreen (ScreenPtr pScreen) +{ + return vesaFinishInitScreen (pScreen); +} + +CARD8 +chipsReadXR (ChipsScreenInfo *chipss, CARD8 index) +{ + CARD8 value; + outb (index, 0x3d6); + value = inb (0x3d7); + return value; +} + +void +chipsWriteXR (ChipsScreenInfo *chipss, CARD8 index, CARD8 value) +{ + outb (index, 0x3d6); + outb (value, 0x3d7); +} + +CARD8 +chipsReadFR (ChipsScreenInfo *chipss, CARD8 index) +{ + CARD8 value; + outb (index, 0x3d0); + value = inb (0x3d1); + return value; +} + +void +chipsWriteFR (ChipsScreenInfo *chipss, CARD8 index, CARD8 value) +{ + outb (index, 0x3d0); + outb (value, 0x3d1); +} + +CARD8 +chipsReadSeq (ChipsScreenInfo *chipss, CARD8 index) +{ + CARD8 value; + outb (index, 0x3c4); + value = inb (0x3c5); + return value; +} + +void +chipsWriteSeq (ChipsScreenInfo *chipss, CARD8 index, CARD8 value) +{ + outb (index, 0x3c4); + outb (value, 0x3c5); +} + +void +chipsPreserve (KdCardInfo *card) +{ + ChipsCardInfo *chipss = card->driver; + vesaPreserve(card); +} + +void +chipsSetMMIO (ChipsCardInfo *chipsc) +{ +} + +void +chipsResetMMIO (ChipsCardInfo *chipsc) +{ +} + +Bool +chipsEnable (ScreenPtr pScreen) +{ + KdScreenPriv(pScreen); + ChipsCardInfo *chipsc = pScreenPriv->card->driver; + + if (!vesaEnable (pScreen)) + return FALSE; + chipsSetMMIO (chipsc); + return TRUE; +} + +Bool +chipsDPMS (ScreenPtr pScreen, int mode) +{ + KdScreenPriv(pScreen); + chipsScreenInfo(pScreenPriv); + + ErrorF ("seqreg 0x01 0x%x\n", chipsReadSeq (chipss, 0x1)); + ErrorF ("dpmsreg XR61 0x%x\n", chipsReadXR (chipss, 0x61)); + ErrorF ("dpmsreg XR73 0x%x\n", chipsReadXR (chipss, 0x73)); + + ErrorF ("flat panel FR05 0x%x\n", chipsReadFR (chipss, 0x5)); + ErrorF ("flat panel XR52 0x%x\n", chipsReadXR (chipss, 0x52)); + return TRUE; +} + +void +chipsDisable (ScreenPtr pScreen) +{ + vesaDisable (pScreen); +} + +void +chipsRestore (KdCardInfo *card) +{ + ChipsCardInfo *chipsc = card->driver; + + chipsResetMMIO (chipsc); + vesaRestore (card); +} + +void +chipsScreenFini (KdScreenInfo *screen) +{ + ChipsScreenInfo *chipss = (ChipsScreenInfo *) screen->driver; + + if (chipss->mmio_base) + { + KdUnmapDevice ((void *) chipss->mmio_base, CHIPS_MMIO_SIZE(chipss)); + KdResetMappedMode (CHIPS_MMIO_BASE(chipss), + CHIPS_MMIO_SIZE(chipss), + KD_MAPPED_MODE_REGISTERS); + } + vesaScreenFini (screen); + xfree (chipss); + screen->driver = 0; +} + +void +chipsCardFini (KdCardInfo *card) +{ + ChipsCardInfo *chipsc = card->driver; + + vesaCardFini (card); +} + +#define chipsCursorInit (void *) 0 +#define chipsCursorEnable (void *) 0 +#define chipsCursorDisable (void *) 0 +#define chipsCursorFini (void *) 0 +#define chipsRecolorCursor (void *) 0 + +KdCardFuncs chipsFuncs = { + chipsCardInit, /* cardinit */ + chipsScreenInit, /* scrinit */ + chipsInitScreen, /* initScreen */ + chipsPreserve, /* preserve */ + chipsEnable, /* enable */ + vesaDPMS, /* dpms */ + chipsDisable, /* disable */ + chipsRestore, /* restore */ + chipsScreenFini, /* scrfini */ + chipsCardFini, /* cardfini */ + + chipsCursorInit, /* initCursor */ + chipsCursorEnable, /* enableCursor */ + chipsCursorDisable, /* disableCursor */ + chipsCursorFini, /* finiCursor */ + chipsRecolorCursor, /* recolorCursor */ + + chipsDrawInit, /* initAccel */ + chipsDrawEnable, /* enableAccel */ + chipsDrawSync, /* syncAccel */ + chipsDrawDisable, /* disableAccel */ + chipsDrawFini, /* finiAccel */ + + vesaGetColors, /* getColors */ + vesaPutColors, /* putColors */ + chipsFinishInitScreen /* finishInitScreen */ +}; diff --git a/hw/kdrive/chips/chips.h b/hw/kdrive/chips/chips.h new file mode 100644 index 000000000..82d081e7d --- /dev/null +++ b/hw/kdrive/chips/chips.h @@ -0,0 +1,122 @@ +/* + * Id: chips.h,v 1.2 1999/11/02 08:17:24 keithp Exp $ + * + * Copyright © 1999 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/chips/chips.h,v 1.9 2000/11/29 08:42:25 keithp Exp $ */ + +#ifndef _CHIPS_H_ +#define _CHIPS_H_ +#include + +/* + * offset from ioport beginning + */ + +#define HIQV +#ifdef HIQV +#define CHIPS_MMIO_BASE(c) ((c)->vesa.fb_phys + 0x400000) +#else +#define CHIPS_MMIO_BASE(c) ((c)->vesa.fb_phys + 0x200000) +#endif +#define CHIPS_MMIO_SIZE(c) (0x20000) + +typedef volatile CARD8 VOL8; +typedef volatile CARD16 VOL16; +typedef volatile CARD32 VOL32; + +typedef struct _chipsSave { + int dummy; +} ChipsSave; + +typedef struct _chipsCardInfo { + VesaCardPrivRec vesa; + CARD32 *window; + Bool mmio; + ChipsSave save; +} ChipsCardInfo; + +#define getChipsCardInfo(kd) ((ChipsCardInfo *) ((kd)->card->driver)) +#define chipsCardInfo(kd) ChipsCardInfo *chipsc = getChipsCardInfo(kd) + +typedef struct _chipsCursor { + int width, height; + int xhot, yhot; + Bool has_cursor; + CursorPtr pCursor; + Pixel source, mask; +} ChipsCursor; + +#define CHIPS_CURSOR_WIDTH 64 +#define CHIPS_CURSOR_HEIGHT 64 + +typedef struct _chipsScreenInfo { + VesaScreenPrivRec vesa; + CARD8 *mmio_base; + CARD8 *cursor_base; + CARD8 *screen; + CARD8 *off_screen; + int off_screen_size; + ChipsCursor cursor; +} ChipsScreenInfo; + +#define getChipsScreenInfo(kd) ((ChipsScreenInfo *) ((kd)->screen->driver)) +#define chipsScreenInfo(kd) ChipsScreenInfo *chipss = getChipsScreenInfo(kd) + +Bool +chipsDrawInit (ScreenPtr pScreen); + +void +chipsDrawEnable (ScreenPtr pScreen); + +void +chipsDrawSync (ScreenPtr pScreen); + +void +chipsDrawDisable (ScreenPtr pScreen); + +void +chipsDrawFini (ScreenPtr pScreen); + +CARD8 +chipsReadXR (ChipsScreenInfo *chipsc, CARD8 index); + +void +chipsWriteXR (ChipsScreenInfo *chipsc, CARD8 index, CARD8 value); + +Bool +chipsCursorInit (ScreenPtr pScreen); + +void +chipsCursorEnable (ScreenPtr pScreen); + +void +chipsCursorDisable (ScreenPtr pScreen); + +void +chipsCursorFini (ScreenPtr pScreen); + +void +chipsRecolorCursor (ScreenPtr pScreen, int ndef, xColorItem *pdef); + +extern KdCardFuncs chipsFuncs; + +#endif /* _CHIPS_H_ */ diff --git a/hw/kdrive/chips/chipsdraw.c b/hw/kdrive/chips/chipsdraw.c new file mode 100644 index 000000000..f23b9fa55 --- /dev/null +++ b/hw/kdrive/chips/chipsdraw.c @@ -0,0 +1,490 @@ +/* + * Id: tridentdraw.c,v 1.1 1999/11/02 03:54:47 keithp Exp $ + * + * Copyright © 1999 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/trident/tridentdraw.c,v 1.10 2001/06/03 18:48:19 keithp Exp $ */ + +#include "chips.h" + +#include "Xmd.h" +#include "gcstruct.h" +#include "scrnintstr.h" +#include "pixmapstr.h" +#include "regionstr.h" +#include "mistruct.h" +#include "fontstruct.h" +#include "dixfontstr.h" +#include "fb.h" +#include "migc.h" +#include "miline.h" + +CARD8 chipsBltRop[16] = { + /* GXclear */ 0x00, /* 0 */ + /* GXand */ 0x88, /* src AND dst */ + /* GXandReverse */ 0x44, /* src AND NOT dst */ + /* GXcopy */ 0xcc, /* src */ + /* GXandInverted*/ 0x22, /* NOT src AND dst */ + /* GXnoop */ 0xaa, /* dst */ + /* GXxor */ 0x66, /* src XOR dst */ + /* GXor */ 0xee, /* src OR dst */ + /* GXnor */ 0x11, /* NOT src AND NOT dst */ + /* GXequiv */ 0x99, /* NOT src XOR dst */ + /* GXinvert */ 0x55, /* NOT dst */ + /* GXorReverse */ 0xdd, /* src OR NOT dst */ + /* GXcopyInverted*/ 0x33, /* NOT src */ + /* GXorInverted */ 0xbb, /* NOT src OR dst */ + /* GXnand */ 0x77, /* NOT src OR NOT dst */ + /* GXset */ 0xff, /* 1 */ +}; + +CARD8 chipsSolidRop[16] = { + /* GXclear */ 0x00, /* 0 */ + /* GXand */ 0xa0, /* src AND dst */ + /* GXandReverse */ 0x50, /* src AND NOT dst */ + /* GXcopy */ 0xf0, /* src */ + /* GXandInverted*/ 0x0a, /* NOT src AND dst */ + /* GXnoop */ 0xaa, /* dst */ + /* GXxor */ 0x5a, /* src XOR dst */ + /* GXor */ 0xfa, /* src OR dst */ + /* GXnor */ 0x05, /* NOT src AND NOT dst */ + /* GXequiv */ 0xa5, /* NOT src XOR dst */ + /* GXinvert */ 0x55, /* NOT dst */ + /* GXorReverse */ 0xf5, /* src OR NOT dst */ + /* GXcopyInverted*/ 0x0f, /* NOT src */ + /* GXorInverted */ 0xaf, /* NOT src OR dst */ + /* GXnand */ 0x5f, /* NOT src OR NOT dst */ + /* GXset */ 0xff, /* 1 */ +}; + +/* Definitions for the Chips and Technology BitBLT engine communication. */ +/* These are done using Memory Mapped IO, of the registers */ +/* BitBLT modes for register 93D0. */ + +#ifdef HIQV +#define ctPATCOPY 0xF0 +#define ctLEFT2RIGHT 0x000 +#define ctRIGHT2LEFT 0x100 +#define ctTOP2BOTTOM 0x000 +#define ctBOTTOM2TOP 0x200 +#define ctSRCSYSTEM 0x400 +#define ctDSTSYSTEM 0x800 +#define ctSRCMONO 0x1000 +#define ctBGTRANSPARENT 0x22000 +#define ctCOLORTRANSENABLE 0x4000 +#define ctCOLORTRANSDISABLE 0x0 +#define ctCOLORTRANSDST 0x8000 +#define ctCOLORTRANSROP 0x0 +#define ctCOLORTRANSEQUAL 0x10000L +#define ctCOLORTRANSNEQUAL 0x0 +#define ctPATMONO 0x40000L +#define ctPATSOLID 0x80000L +#define ctPATSTART0 0x000000L +#define ctPATSTART1 0x100000L +#define ctPATSTART2 0x200000L +#define ctPATSTART3 0x300000L +#define ctPATSTART4 0x400000L +#define ctPATSTART5 0x500000L +#define ctPATSTART6 0x600000L +#define ctPATSTART7 0x700000L +#define ctSRCFG 0x000000L /* Where is this for the 65550?? */ +#else +#define ctPATCOPY 0xF0 +#define ctTOP2BOTTOM 0x100 +#define ctBOTTOM2TOP 0x000 +#define ctLEFT2RIGHT 0x200 +#define ctRIGHT2LEFT 0x000 +#define ctSRCFG 0x400 +#define ctSRCMONO 0x800 +#define ctPATMONO 0x1000 +#define ctBGTRANSPARENT 0x2000 +#define ctSRCSYSTEM 0x4000 +#define ctPATSOLID 0x80000L +#define ctPATSTART0 0x00000L +#define ctPATSTART1 0x10000L +#define ctPATSTART2 0x20000L +#define ctPATSTART3 0x30000L +#define ctPATSTART4 0x40000L +#define ctPATSTART5 0x50000L +#define ctPATSTART6 0x60000L +#define ctPATSTART7 0x70000L +#endif + +#define chipsFillPix(bpp,pixel) {\ + if (bpp == 8) \ + { \ + pixel = pixel & 0xff; \ + } \ + else if (bpp == 16) \ + { \ + pixel = pixel & 0xffff; \ + } \ +} + +static VOL8 *mmio; +static CARD32 byteStride; +static CARD32 bytesPerPixel; +static CARD32 pixelStride; + +void +chipsSet (ScreenPtr pScreen) +{ + KdScreenPriv(pScreen); + chipsScreenInfo(pScreenPriv); + + mmio = chipss->mmio_base; + byteStride = pScreenPriv->screen->fb[0].byteStride; + bytesPerPixel = pScreenPriv->screen->fb[0].bitsPerPixel >> 3; + pixelStride = pScreenPriv->screen->fb[0].pixelStride; +} + +#ifdef HIQV +#define CHIPS_BR0 0x00 /* offset */ +#define CHIPS_BR1 0x04 /* bg */ +#define CHIPS_BR2 0x08 /* fg */ +#define CHIPS_BR3 0x0c /* monochrome */ +#define CHIPS_BR4 0x10 /* bitblt */ +#define CHIPS_BR5 0x14 /* pattern addr */ +#define CHIPS_BR6 0x18 /* source addr */ +#define CHIPS_BR7 0x1c /* dst addr */ +#define CHIPS_BR8 0x20 /* dst w/h */ +#else +#define CHIPS_DR0 0x83d0 +#define CHIPS_DR1 0x87d0 +#define CHIPS_DR2 0x8bd0 +#define CHIPS_DR3 0x8fd0 +#define CHIPS_DR4 0x93d0 +#define CHIPS_DR5 0x97d0 +#define CHIPS_DR6 0x9bd0 +#define CHIPS_DR7 0x9fd0 +#endif + +#define DBG(x) + +void +chipsPitch (int src, int dst) +{ + CARD32 p; + + p = ((dst & 0xffff) << 16) | (src & 0xffff); + DBG(ErrorF ("\tpitch 0x%x\n", p)); +#ifdef HIQV + *(VOL32 *) (mmio + CHIPS_BR0) = p; +#else + *(VOL32 *) (mmio + CHIPS_DR0) = p; +#endif +} + +void +chipsBg (Pixel bg) +{ + DBG(ErrorF ("\tbg 0x%x\n", bg)); +#ifdef HIQV + *(VOL32 *) (mmio + CHIPS_BR1) = bg & 0xffff; +#else + *(VOL32 *) (mmio + CHIPS_DR2) = bg; +#endif +} + +void +chipsFg (Pixel fg) +{ + DBG(ErrorF ("\tfg 0x%x\n", fg)); +#ifdef HIQV + *(VOL32 *) (mmio + CHIPS_BR2) = fg; +#else + *(VOL32 *) (mmio + CHIPS_DR3) = fg; +#endif +} + +void +chipsOp (CARD32 op) +{ + DBG(ErrorF ("\top 0x%x\n", op)); +#ifdef HIQV + *(VOL32 *) (mmio + CHIPS_BR4) = op; +#else + *(VOL32 *) (mmio + CHIPS_DR4) = op; +#endif +} + +void +chipsRopSolid (int rop) +{ + CARD32 op; + + op = chipsSolidRop[rop] | ctTOP2BOTTOM | ctLEFT2RIGHT | ctPATSOLID | ctPATMONO; + chipsOp (op); +} + +void +chipsSrc (int addr) +{ + DBG(ErrorF ("\tsrc 0x%x\n", addr)); +#ifdef HIQV + *(VOL32 *) (mmio + CHIPS_BR6) = addr; +#else + *(VOL32 *) (mmio + CHIPS_DR5) = addr; +#endif +} + +void +chipsDst (int addr) +{ + DBG(ErrorF ("\tdst 0x%x\n", addr)); +#ifdef HIQV + *(VOL32 *) (mmio + CHIPS_BR7) = addr; +#else + *(VOL32 *) (mmio + CHIPS_DR6) = addr; +#endif +} + +void +chipsWidthHeightGo (int w, int h) +{ + DBG(ErrorF ("\twidth height %d/%d\n", w, h)); +#ifdef HIQV + *(VOL32 *) (mmio + CHIPS_BR8) = ((h & 0xffff) << 16) | (w & 0xffff); +#else + *(VOL32 *) (mmio + CHIPS_DR7) = ((h & 0xffff) << 16) | (w & 0xffff); +#endif +} + +void +chipsWaitIdle () +{ +#ifdef HIQV + int timeout = 0; + CARD8 tmp; + VOL32 *br4 = (VOL32 *) (mmio + CHIPS_BR4); + + DBG(ErrorF ("\tBR4 0x%x 0x%x\n", mmio + CHIPS_BR4, *br4)); + DBG(ErrorF ("\tXR20 0x%x\n", chipsReadXR (0, 0x20))); + for (;;) + { + if ((*br4 & 0x80000000) == 0) + break; + tmp = chipsReadXR (0, 0x20); + if ((tmp & 1) == 0) + break; + if (++timeout > 1000000) + { + ErrorF ("timeout\n"); + tmp = chipsReadXR (0, 0x20); + chipsWriteXR (0, 0x20, tmp | 2); + sleep (1); + chipsWriteXR (0, 0x20, tmp); + sleep (1); + } + } +#else + while (*(VOL32 *) (mmio + CHIPS_DR4) & 0x00100000) + ; +#endif +} + +Bool +chipsPrepareSolid (DrawablePtr pDrawable, + int alu, + Pixel pm, + Pixel fg) +{ + FbBits depthMask; + + DBG(ErrorF ("PrepareSolid %d 0x%x\n", alu, fg)); + depthMask = FbFullMask(pDrawable->depth); + if ((pm & depthMask) != depthMask) + return FALSE; + else + { + chipsSet (pDrawable->pScreen); + chipsWaitIdle (); + chipsFillPix(pDrawable->bitsPerPixel,fg); + chipsFg (fg); + chipsBg (fg); + chipsRopSolid (alu); + chipsPitch (byteStride, byteStride); + return TRUE; + } +} + +void +chipsSolid (int x1, int y1, int x2, int y2) +{ + CARD32 dst; + int w, h; + + DBG(ErrorF (" Solid %dx%d %dx%d\n", x1, y1, x2, y2)); + dst = y1 * byteStride + x1 * bytesPerPixel; + w = (x2 - x1) * bytesPerPixel; + h = (y2 - y1); + chipsWaitIdle (); + chipsDst (dst); + chipsWidthHeightGo (w, h); +} + +void +chipsDoneSolid (void) +{ +} + +static CARD32 copyOp; +Bool +chipsPrepareCopy (DrawablePtr pSrcDrawable, + DrawablePtr pDstDrawable, + int dx, + int dy, + int alu, + Pixel pm) +{ + FbBits depthMask; + + DBG(ErrorF ("PrepareSolid %d 0x%x\n", alu, fg)); + depthMask = FbFullMask(pDstDrawable->depth); + if ((pm & depthMask) != depthMask) + return FALSE; + else + { + copyOp = chipsBltRop[alu]; + if (dy >= 0) + copyOp |= ctTOP2BOTTOM; + else + copyOp |= ctBOTTOM2TOP; + if (dx >= 0) + copyOp |= ctLEFT2RIGHT; + else + copyOp |= ctRIGHT2LEFT; + chipsSet (pDstDrawable->pScreen); + chipsWaitIdle (); + chipsOp (copyOp); + chipsPitch (byteStride, byteStride); + return TRUE; + } +} + +void +chipsCopy (int srcX, + int srcY, + int dstX, + int dstY, + int w, + int h) +{ + int src, dst; + if ((copyOp & (ctTOP2BOTTOM|ctBOTTOM2TOP)) == ctBOTTOM2TOP) + { + src = (srcY + h - 1) * byteStride; + dst = (dstY + h - 1) * byteStride; + } + else + { + src = srcY * byteStride; + dst = dstY * byteStride; + } + if ((copyOp & (ctLEFT2RIGHT|ctRIGHT2LEFT)) == ctRIGHT2LEFT) + { + src = src + (srcX + w) * bytesPerPixel - 1; + dst = dst + (dstX + w) * bytesPerPixel - 1; + } + else + { + src = src + srcX * bytesPerPixel; + dst = dst + dstX * bytesPerPixel; + } + chipsWaitIdle (); + chipsSrc (src); + chipsDst (dst); + chipsWidthHeightGo (w * bytesPerPixel, h); +} + +void +chipsDoneCopy (void) +{ +} + +KaaScreenPrivRec chipsKaa = { + chipsPrepareSolid, + chipsSolid, + chipsDoneSolid, + + chipsPrepareCopy, + chipsCopy, + chipsDoneCopy, +}; + +Bool +chipsDrawInit (ScreenPtr pScreen) +{ + KdScreenPriv(pScreen); + chipsScreenInfo(pScreenPriv); + + switch (pScreenPriv->screen->fb[0].bitsPerPixel) { + case 8: + case 16: + break; + default: + return FALSE; + } + + if (!kaaDrawInit (pScreen, &chipsKaa)) + return FALSE; + + return TRUE; +} + +void +chipsDrawEnable (ScreenPtr pScreen) +{ + KdScreenPriv(pScreen); + chipsScreenInfo(pScreenPriv); + CARD8 mode; + + switch (pScreenPriv->screen->fb[0].bitsPerPixel) { + case 8: + mode = 0x00; + break; + case 16: + mode = 0x10; + break; + } + chipsSet (pScreen); + chipsWaitIdle (); + chipsWriteXR (chipss, 0x20, mode); + + KdMarkSync (pScreen); +} + +void +chipsDrawDisable (ScreenPtr pScreen) +{ +} + +void +chipsDrawFini (ScreenPtr pScreen) +{ +} + +void +chipsDrawSync (ScreenPtr pScreen) +{ + chipsSet (pScreen); + chipsWaitIdle (); +} diff --git a/hw/kdrive/chips/chipsstub.c b/hw/kdrive/chips/chipsstub.c new file mode 100644 index 000000000..5c8a6d4c6 --- /dev/null +++ b/hw/kdrive/chips/chipsstub.c @@ -0,0 +1,59 @@ +/* + * Id: chipsstub.c,v 1.1 1999/11/02 08:19:15 keithp Exp $ + * + * Copyright 1999 SuSE, Inc. + * + * 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 SuSE not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. SuSE makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE + * 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. + * + * Author: Keith Packard, SuSE, Inc. + */ +/* $XFree86: xc/programs/Xserver/hw/kdrive/chips/chipsstub.c,v 1.5 2000/11/29 08:42:25 keithp Exp $ */ + +#include "chips.h" + +extern int chips_clk, chips_mclk; + +void +InitCard (char *name) +{ + KdCardAttr attr; + + KdCardInfoAdd (&chipsFuncs, &attr, 0); +} + +void +InitOutput (ScreenInfo *pScreenInfo, int argc, char **argv) +{ + KdInitOutput (pScreenInfo, argc, argv); +} + +void +InitInput (int argc, char **argv) +{ + KdInitInput (&Ps2MouseFuncs, &LinuxKeyboardFuncs); +} + +int +ddxProcessArgument (int argc, char **argv, int i) +{ + int ret; + + if (!(ret = vesaProcessArgument (argc, argv, i))) + ret = KdProcessArgument(argc, argv, i); + return ret; +} diff --git a/hw/kdrive/vesa/vbe.c b/hw/kdrive/vesa/vbe.c index cb6d0d3a3..e0cdd0775 100644 --- a/hw/kdrive/vesa/vbe.c +++ b/hw/kdrive/vesa/vbe.c @@ -19,7 +19,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vbe.c,v 1.7 2000/11/19 20:51:12 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vbe.c,v 1.9 2001/05/29 04:54:12 keithp Exp $ */ #include "vesa.h" @@ -251,7 +251,7 @@ VbeGetMode(Vm86InfoPtr vi, int *mode) } void * -VbeMapFramebuffer(Vm86InfoPtr vi, VbeInfoPtr vbe, int mode, int *ret_size) +VbeMapFramebuffer(Vm86InfoPtr vi, VbeInfoPtr vbe, int mode, int *ret_size, CARD32 *ret_phys) { U8 *fb; VbeInfoBlock vib; @@ -270,6 +270,7 @@ VbeMapFramebuffer(Vm86InfoPtr vi, VbeInfoPtr vbe, int mode, int *ret_size) size = 1024 * 64L * vib.TotalMemory; *ret_size = size; + *ret_phys = vmib.PhysBasePtr; before = vmib.PhysBasePtr % pagesize; after = pagesize - ((vmib.PhysBasePtr + size) % pagesize); @@ -501,6 +502,48 @@ windowB: return ((U8*)&(LM(vi, MAKE_POINTER(vbe->vmib.WinBSegment, 0)))) + offset - vbe->windowB_offset; } +static const int VbeDPMSModes[4] = { + 0x00, /* KD_DPMS_NORMAL */ + 0x01, /* KD_DPMS_STANDBY */ + 0x02, /* KD_DPMS_SUSPEND */ + 0x04, /* KD_DPMS_POWERDOWN */ +}; + +Bool +VbeDPMS(Vm86InfoPtr vi, VbeInfoBlock *vib, int mode) +{ + int code; + + /* + * Check which modes are supported + */ + vi->vms.regs.eax = 0x4f10; + vi->vms.regs.ebx = 0x0000; + vi->vms.regs.es = 0; + vi->vms.regs.edi = 0; + code = VbeDoInterrupt10 (vi); + if (code < 0) + { + ErrorF ("No DPMS Support\n"); + return FALSE; + } + /* Skip this stage if it's not supported */ + if (((vi->vms.regs.ebx >> 4) & VbeDPMSModes[mode]) != VbeDPMSModes[mode]) + return FALSE; + + /* Select this mode */ + vi->vms.regs.eax = 0x4f10; + vi->vms.regs.ebx = (VbeDPMSModes[mode] << 8) | 0x01; + code = VbeDoInterrupt10 (vi); + if (code < 0) + { + ErrorF ("DPMS failed %d\n", code); + return FALSE; + } + + return TRUE; +} + int VbeReportVib(Vm86InfoPtr vi, VbeInfoBlock *vib) { diff --git a/hw/kdrive/vesa/vbe.h b/hw/kdrive/vesa/vbe.h index bf347fc6b..6e74cc3b5 100644 --- a/hw/kdrive/vesa/vbe.h +++ b/hw/kdrive/vesa/vbe.h @@ -19,7 +19,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vbe.h,v 1.5 2000/10/20 00:19:50 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vbe.h,v 1.6 2001/05/29 04:54:12 keithp Exp $ */ #ifndef _VBE_H #define _VBE_H @@ -134,7 +134,7 @@ int VbeGetMode(Vm86InfoPtr vi, int *mode); void * -VbeMapFramebuffer(Vm86InfoPtr vi, VbeInfoPtr vbe, int mode, int *size); +VbeMapFramebuffer(Vm86InfoPtr vi, VbeInfoPtr vbe, int mode, int *size, CARD32 *phys); void VbeUnmapFramebuffer(Vm86InfoPtr vi, VbeInfoPtr vbe, int mode, void *fb); diff --git a/hw/kdrive/vesa/vesa.c b/hw/kdrive/vesa/vesa.c index ab8ea41e5..960de6795 100644 --- a/hw/kdrive/vesa/vesa.c +++ b/hw/kdrive/vesa/vesa.c @@ -19,7 +19,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesa.c,v 1.15 2001/07/20 19:35:30 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesa.c,v 1.16 2001/07/24 19:06:04 keithp Exp $ */ #include "vesa.h" #ifdef RANDR @@ -33,6 +33,7 @@ Bool vesa_shadow = FALSE; Bool vesa_linear_fb = TRUE; Bool vesa_restore = FALSE; Bool vesa_verbose = FALSE; +Bool vesa_force_text = FALSE; #define VesaPriv(scr) ((VesaScreenPrivPtr) (scr)->driver) @@ -959,11 +960,13 @@ vesaMapFramebuffer (KdScreenInfo *screen) if (pscr->mode.vbe) pscr->fb = VbeMapFramebuffer(priv->vi, priv->vbeInfo, pscr->mode.mode, - &pscr->fb_size); + &pscr->fb_size, + &pscr->fb_phys); else pscr->fb = VgaMapFramebuffer (priv->vi, pscr->mode.mode, - &pscr->fb_size); + &pscr->fb_size, + &pscr->fb_phys); if (!pscr->fb) return FALSE; break; @@ -1451,11 +1454,13 @@ vesaEnable(ScreenPtr pScreen) if (pscr->mode.vbe) pscr->fb = VbeMapFramebuffer(priv->vi, priv->vbeInfo, pscr->mode.mode, - &pscr->fb_size); + &pscr->fb_size, + &pscr->fb_phys); else pscr->fb = VgaMapFramebuffer (priv->vi, pscr->mode.mode, - &pscr->fb_size); + &pscr->fb_size, + &pscr->fb_phys); if (!pscr->fb) return FALSE; screen->fb[0].frameBuffer = (CARD8 *)(pscr->fb); @@ -1501,6 +1506,77 @@ vesaEnable(ScreenPtr pScreen) return TRUE; } +#ifndef TOSHIBA_SMM + +# ifdef linux +# define TOSHIBA_SMM 1 +# endif + +# ifndef TOSHIBA_SMM +# define TOSHIBA_SMM 0 +# endif + +#endif + +#if TOSHIBA_SMM +/* + * Toshiba laptops use a special interface to operate the backlight + */ +#include +#define TOSH_PROC "/proc/toshiba" +#define TOSH_DEVICE "/dev/toshiba" +#define TOSH_SMM _IOWR('t', 0x90, 24) + +typedef struct { + unsigned int eax; + unsigned int ebx __attribute__ ((packed)); + unsigned int ecx __attribute__ ((packed)); + unsigned int edx __attribute__ ((packed)); + unsigned int esi __attribute__ ((packed)); + unsigned int edi __attribute__ ((packed)); +} SMMRegisters; + +#define HCI_BACKLIGHT 0x0002 +#define HCI_DISABLE 0x0000 +#define HCI_ENABLE 0x0001 +#define HCI_GET 0xfe00, +#define HCI_SET 0xff00 + +Bool +toshibaDPMS (ScreenPtr pScreen, int mode) +{ + SMMRegisters regs; + static int fd; + + if (!fd) + fd = open (TOSH_DEVICE, 2); + if (fd < 0) + return FALSE; + regs.eax = HCI_SET; + regs.ebx = HCI_BACKLIGHT; + regs.ecx = mode ? HCI_DISABLE : HCI_ENABLE; + if (ioctl (fd, TOSH_SMM, ®s) < 0) + return FALSE; + return TRUE; +} +#endif /* TOSHIBA_SMM */ + +Bool +vesaDPMS (ScreenPtr pScreen, int mode) +{ + KdScreenPriv(pScreen); + VesaCardPrivPtr priv = pScreenPriv->card->driver; + VesaScreenPrivPtr pscr = pScreenPriv->screen->driver; + +#if TOSHIBA_SMM + if (toshibaDPMS (pScreen, mode)) + return TRUE; +#endif + if (pscr->mode.vbe) + return VbeDPMS (priv->vi, priv->vbeInfo, mode); + return FALSE; +} + void vesaDisable(ScreenPtr pScreen) { @@ -1569,6 +1645,13 @@ vesaRestore(KdCardInfo *card) VesaCardPrivPtr priv = card->driver; int n; + if (vesa_force_text) + { + if (vesa_verbose) + ErrorF ("Forcing switch back to mode 3 text\n"); + priv->old_vbe_mode = -1; + priv->old_vga_mode = 3; + } for (n = 0; n < priv->nmode; n++) if (priv->modes[n].vbe && priv->modes[n].mode == (priv->old_vbe_mode&0x3fff)) break; @@ -1774,6 +1857,9 @@ vesaProcessArgument (int argc, char **argv, int i) } else if(!strcmp(argv[i], "-verbose")) { vesa_verbose = TRUE; return 1; + } else if(!strcmp(argv[i], "-force-text")) { + vesa_force_text = TRUE; + return 1; } return 0; diff --git a/hw/kdrive/vesa/vesa.h b/hw/kdrive/vesa/vesa.h index b84d58d2b..fc8f7fa19 100644 --- a/hw/kdrive/vesa/vesa.h +++ b/hw/kdrive/vesa/vesa.h @@ -19,7 +19,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesa.h,v 1.10 2001/06/04 09:45:42 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesa.h,v 1.11 2001/07/20 19:35:30 keithp Exp $ */ #ifndef _VESA_H_ #define _VESA_H_ @@ -101,6 +101,7 @@ typedef struct _VesaScreenPriv { int layerKind; void *fb; int fb_size; + CARD32 fb_phys; LayerPtr pLayer; } VesaScreenPrivRec, *VesaScreenPrivPtr; @@ -137,6 +138,9 @@ vesaFinishInitScreen(ScreenPtr pScreen); Bool vesaEnable(ScreenPtr pScreen); +Bool +vesaDPMS (ScreenPtr pScreen, int mode); + void vesaDisable(ScreenPtr pScreen); diff --git a/hw/kdrive/vesa/vesainit.c b/hw/kdrive/vesa/vesainit.c index 3019e4f12..a409fc4fb 100644 --- a/hw/kdrive/vesa/vesainit.c +++ b/hw/kdrive/vesa/vesainit.c @@ -19,7 +19,7 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesainit.c,v 1.5 2000/12/08 21:40:29 keithp Exp $ */ +/* $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vesainit.c,v 1.6 2001/06/04 09:45:42 keithp Exp $ */ #include "vesa.h" @@ -29,7 +29,7 @@ const KdCardFuncs vesaFuncs = { vesaInitScreen, /* initScreen */ vesaPreserve, /* preserve */ vesaEnable, /* enable */ - 0, /* dpms */ + vesaDPMS, /* dpms */ vesaDisable, /* disable */ vesaRestore, /* restore */ vesaScreenFini, /* scrfini */ diff --git a/hw/kdrive/vesa/vga.c b/hw/kdrive/vesa/vga.c index 24b23e885..a87b70a2d 100644 --- a/hw/kdrive/vesa/vga.c +++ b/hw/kdrive/vesa/vga.c @@ -1,5 +1,5 @@ /* - * $XFree86$ + * $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vga.c,v 1.1 2000/10/20 00:19:51 keithp Exp $ * * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. * @@ -225,12 +225,13 @@ VgaSetWindow (Vm86InfoPtr vi, int vmode, int bytes, int mode, int *size) } void * -VgaMapFramebuffer (Vm86InfoPtr vi, int vmode, int *size) +VgaMapFramebuffer (Vm86InfoPtr vi, int vmode, int *size, CARD32 *ret_phys) { if (VGA_FB(vmode) == 0xa0000) *size = 0x10000; else *size = 0x4000; + *ret_phys = VGA_FB(vmode); return &LM(vi,VGA_FB(vmode)); } diff --git a/hw/kdrive/vesa/vga.h b/hw/kdrive/vesa/vga.h index 0637c2177..873c1ee95 100644 --- a/hw/kdrive/vesa/vga.h +++ b/hw/kdrive/vesa/vga.h @@ -1,5 +1,5 @@ /* - * $XFree86$ + * $XFree86: xc/programs/Xserver/hw/kdrive/vesa/vga.h,v 1.1 2000/10/20 00:19:51 keithp Exp $ * * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. * @@ -53,7 +53,7 @@ void * VgaSetWindow (Vm86InfoPtr vi, int vmode, int bytes, int mode, int *size); void * -VgaMapFramebuffer (Vm86InfoPtr vi, int vmode, int *size); +VgaMapFramebuffer (Vm86InfoPtr vi, int vmode, int *size, CARD32 *phys); void VgaUnmapFramebuffer (Vm86InfoPtr vi);