Rework vesa driver for shadowing and multiple screen support. Allow enable

to fail and avoid crashing
This commit is contained in:
Keith Packard 2000-09-03 05:11:46 +00:00
parent 3805965684
commit c97fb611dd
28 changed files with 859 additions and 211 deletions

13
hw/kdrive/Kdrive.tmpl Normal file
View File

@ -0,0 +1,13 @@
XCOMM $XFree86$
#include <Server.tmpl>
#if BuildRender
RENDERINCS=-I$(KDRIVE)/../../render -I$(EXTINCSRC)
#endif
KDINCS = -I$(KDRIVE) -I$(XBUILDINCDIR) -I$(FONTINCSRC) \
-I$(KDRIVE)/../../fb -I$(KDRIVE)/../../mi \
-I$(KDRIVE)/../../miext/shadow \
-I$(KDRIVE)/../../include -I$(KDRIVE)/../../os \
-I$(EXTINCSRC) -I$(XINCLUDESRC) $(RENDERINCS)

View File

@ -1,14 +1,13 @@
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $ XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $ XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $
#include <Server.tmpl> KDRIVE=..
#include "../Kdrive.tmpl"
SRCS = fbdev.c fbinit.c SRCS = fbdev.c fbinit.c
OBJS = fbdev.o fbinit.o OBJS = fbdev.o fbinit.o
INCLUDES = -I.. -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \ INCLUDES = $(KDINCS) -I.
-I../../../fb -I../../../mi -I../../../include -I../../../os \
-I$(EXTINCSRC) -I$(XINCLUDESRC)
NormalLibraryObjectRule() NormalLibraryObjectRule()
NormalLibraryTarget(fbdev,$(OBJS)) NormalLibraryTarget(fbdev,$(OBJS))

View File

@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbdev.c,v 1.2 1999/12/30 03:03:08 robin Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbdev.c,v 1.4 2000/05/06 22:17:41 keithp Exp $ */
#include "fbdev.h" #include "fbdev.h"
@ -136,7 +136,7 @@ fbdevPreserve (KdCardInfo *card)
{ {
} }
void Bool
fbdevEnable (ScreenPtr pScreen) fbdevEnable (ScreenPtr pScreen)
{ {
KdScreenPriv(pScreen); KdScreenPriv(pScreen);
@ -148,7 +148,11 @@ fbdevEnable (ScreenPtr pScreen)
/* display it on the LCD */ /* display it on the LCD */
k = ioctl (priv->fd, FBIOPUT_VSCREENINFO, &priv->var); k = ioctl (priv->fd, FBIOPUT_VSCREENINFO, &priv->var);
if (k < 0) if (k < 0)
{
perror ("FBIOPUT_VSCREENINFO"); perror ("FBIOPUT_VSCREENINFO");
return FALSE;
}
return TRUE;
} }
Bool Bool

View File

@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbdev.h,v 1.2 1999/12/30 03:03:08 robin Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbdev.h,v 1.4 2000/05/06 22:17:42 keithp Exp $ */
#ifndef _FBDEV_H_ #ifndef _FBDEV_H_
#define _FBDEV_H_ #define _FBDEV_H_
@ -56,7 +56,7 @@ fbdevInitScreen (ScreenPtr pScreen);
void void
fbdevPreserve (KdCardInfo *card); fbdevPreserve (KdCardInfo *card);
void Bool
fbdevEnable (ScreenPtr pScreen); fbdevEnable (ScreenPtr pScreen);
Bool Bool

View File

@ -1,13 +1,12 @@
XCOMM $XFree86: xc/programs/Xserver/hw/kdrive/igs/Imakefile,v 1.1 2000/05/06 22:17:42 keithp Exp $ XCOMM $XFree86: xc/programs/Xserver/hw/kdrive/igs/Imakefile,v 1.2 2000/05/24 23:52:47 keithp Exp $
#include <Server.tmpl> KDRIVE=..
#include "../Kdrive.tmpl"
SRCS = igs.c igscmap.c igscurs.c igsdraw.c igsreg.c igsstub.c SRCS = igs.c igscmap.c igscurs.c igsdraw.c igsreg.c igsstub.c
OBJS = igs.o igscmap.o igscurs.o igsdraw.o igsreg.o igsstub.o OBJS = igs.o igscmap.o igscurs.o igsdraw.o igsreg.o igsstub.o
INCLUDES = -I.. -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \ INCLUDES = -I. $(KDINCS)
-I../../../fb -I../../../mi -I../../../include -I../../../os \
-I$(EXTINCSRC) -I$(XINCLUDESRC)
NormalLibraryObjectRule() NormalLibraryObjectRule()
NormalLibraryTarget(igs,$(OBJS)) NormalLibraryTarget(igs,$(OBJS))

View File

@ -1,5 +1,5 @@
/* /*
* $XFree86: xc/programs/Xserver/hw/kdrive/igs/igs.c,v 1.1 2000/05/06 22:17:43 keithp Exp $ * $XFree86: xc/programs/Xserver/hw/kdrive/igs/igs.c,v 1.2 2000/05/24 23:52:47 keithp Exp $
* *
* Copyright © 1999 SuSE, Inc. * Copyright © 1999 SuSE, Inc.
* *
@ -331,7 +331,7 @@ igsGetClock (int target, int *Mp, int *Np, int *Pp, int maxM, int maxN, int maxP
*Pp = P; *Pp = P;
} }
void Bool
igsEnable (ScreenPtr pScreen) igsEnable (ScreenPtr pScreen)
{ {
KdScreenPriv(pScreen); KdScreenPriv(pScreen);
@ -562,6 +562,7 @@ igsEnable (ScreenPtr pScreen)
VgaFetch (&igsvga->card, reg)); VgaFetch (&igsvga->card, reg));
} }
#endif #endif
return TRUE;
} }
Bool Bool

View File

@ -1,14 +1,13 @@
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $ XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $ XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $
#include <Server.tmpl> KDRIVE=..
#include "../Kdrive.tmpl"
SRCS = itsy.c ts.c kbd.c SRCS = itsy.c ts.c kbd.c
OBJS = itsy.o ts.o kbd.o OBJS = itsy.o ts.o kbd.o
INCLUDES = -I.. -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \ INCLUDES = -I. $(KDINCS)
-I../../../fb -I../../../mi -I../../../include -I../../../os \
-I$(EXTINCSRC) -I$(XINCLUDESRC)
NormalLibraryObjectRule() NormalLibraryObjectRule()
NormalLibraryTarget(itsy,$(OBJS)) NormalLibraryTarget(itsy,$(OBJS))

View File

@ -1,14 +1,13 @@
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $ XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
XCOMM $XFree86: $ XCOMM $XFree86: $
#include <Server.tmpl> KDRIVE=..
#include "../Kdrive.tmpl"
SRCS = keyboard.c linux.c ps2.c SRCS = keyboard.c linux.c ps2.c
OBJS = keyboard.o linux.o ps2.o OBJS = keyboard.o linux.o ps2.o
INCLUDES = -I. -I.. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \ INCLUDES = -I. $(KDINCS)
-I../../../fb -I../../../mi -I../../../include -I../../../os \
-I$(EXTINCSRC) -I$(XINCLUDESRC)
NormalLibraryObjectRule() NormalLibraryObjectRule()
NormalLibraryTarget(linux,$(OBJS)) NormalLibraryTarget(linux,$(OBJS))

View File

@ -1,14 +1,13 @@
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $ XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $ XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $
#include <Server.tmpl> KDRIVE=..
#include "../Kdrive.tmpl"
SRCS = s3.c s3clock.c s3cmap.c s3curs.c s3draw.c s3gc.c s3reg.c s3stub.c SRCS = s3.c s3clock.c s3cmap.c s3curs.c s3draw.c s3gc.c s3reg.c s3stub.c
OBJS = s3.o s3clock.o s3cmap.o s3curs.o s3draw.o s3gc.o s3reg.o s3stub.o OBJS = s3.o s3clock.o s3cmap.o s3curs.o s3draw.o s3gc.o s3reg.o s3stub.o
INCLUDES = -I.. -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \ INCLUDES = -I. $(KDINCS)
-I../../../fb -I../../../mi -I../../../include -I../../../os \
-I$(EXTINCSRC) -I$(XINCLUDESRC)
NormalLibraryObjectRule() NormalLibraryObjectRule()
NormalLibraryTarget(savage,$(OBJS)) NormalLibraryTarget(savage,$(OBJS))

View File

@ -964,7 +964,7 @@ s3SetGlobalBitmap (ScreenPtr pScreen, int ma)
} }
} }
void Bool
s3Enable (ScreenPtr pScreen) s3Enable (ScreenPtr pScreen)
{ {
KdScreenPriv(pScreen); KdScreenPriv(pScreen);
@ -1667,6 +1667,7 @@ s3Enable (ScreenPtr pScreen)
} }
} }
#endif #endif
return TRUE;
} }
void void

View File

@ -463,7 +463,7 @@ typedef struct _s3ScreenInfo {
Bool s3CardInit (KdCardInfo *); Bool s3CardInit (KdCardInfo *);
Bool s3ScreenInit (KdScreenInfo *); Bool s3ScreenInit (KdScreenInfo *);
void s3Enable (ScreenPtr pScreen); Bool s3Enable (ScreenPtr pScreen);
void s3Disable (ScreenPtr pScreen); void s3Disable (ScreenPtr pScreen);
void s3Fini (ScreenPtr pScreen); void s3Fini (ScreenPtr pScreen);

View File

@ -1,14 +1,13 @@
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $ XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $ XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $
#include <Server.tmpl> KDRIVE=..
#include "../Kdrive.tmpl"
SRCS = sis.c sisclock.c siscmap.c siscurs.c sisdraw.c sisio.c sisstub.c SRCS = sis.c sisclock.c siscmap.c siscurs.c sisdraw.c sisio.c sisstub.c
OBJS = sis.o sisclock.o siscmap.o siscurs.o sisdraw.o sisio.o sisstub.o OBJS = sis.o sisclock.o siscmap.o siscurs.o sisdraw.o sisio.o sisstub.o
INCLUDES = -I.. -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \ INCLUDES = -I. $(KDINCS)
-I../../../fb -I../../../mi -I../../../include -I../../../os \
-I$(EXTINCSRC) -I$(XINCLUDESRC)
NormalLibraryObjectRule() NormalLibraryObjectRule()
NormalLibraryTarget(sis530,$(OBJS)) NormalLibraryTarget(sis530,$(OBJS))

View File

@ -530,7 +530,7 @@ sisPreserve (KdCardInfo *card)
memcpy (sisc->save.text_save, sisc->frameBuffer, SIS_TEXT_SAVE); memcpy (sisc->save.text_save, sisc->frameBuffer, SIS_TEXT_SAVE);
} }
void Bool
sisEnable (ScreenPtr pScreen) sisEnable (ScreenPtr pScreen)
{ {
KdScreenPriv(pScreen); KdScreenPriv(pScreen);
@ -827,6 +827,7 @@ sisEnable (ScreenPtr pScreen)
#endif #endif
_sisSetCrtc (sisc, &crtc); _sisSetCrtc (sisc, &crtc);
return TRUE;
} }
Bool Bool

View File

@ -1149,7 +1149,7 @@ typedef struct _sisScreenInfo {
Bool sisCardInit (KdCardInfo *); Bool sisCardInit (KdCardInfo *);
Bool sisScreenInit (KdScreenInfo *); Bool sisScreenInit (KdScreenInfo *);
void sisEnable (ScreenPtr pScreen); Bool sisEnable (ScreenPtr pScreen);
void sisDisable (ScreenPtr pScreen); void sisDisable (ScreenPtr pScreen);
void sisFini (ScreenPtr pScreen); void sisFini (ScreenPtr pScreen);

View File

@ -1,6 +1,7 @@
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $ XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $ XCOMM $XFree86: xc/programs/Xserver/hw/kdrive/trident/Imakefile,v 1.2 2000/08/29 17:20:15 keithp Exp $
#include <Server.tmpl> KDRIVE=..
#include "../Kdrive.tmpl"
SRCS = trident.c tridentdraw.c tridentcurs.c tridentstub.c SRCS = trident.c tridentdraw.c tridentcurs.c tridentstub.c
@ -8,9 +9,7 @@ OBJS = trident.o tridentdraw.o tridentcurs.o tridentstub.o
DEFINES = -DVESA DEFINES = -DVESA
INCLUDES = -I.. -I../fbdev -I../vesa -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \ INCLUDES = -I. $(KDINCS) -I$(KDRIVE)/fbdev -I$(KDRIVE)/vesa
-I../../../fb -I../../../mi -I../../../include -I../../../os \
-I$(EXTINCSRC) -I$(XINCLUDESRC)
NormalLibraryObjectRule() NormalLibraryObjectRule()
NormalLibraryTarget(trident,$(OBJS)) NormalLibraryTarget(trident,$(OBJS))

View File

@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/trident/trident.c,v 1.6 2000/08/26 00:17:50 keithp Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/trident/trident.c,v 1.7 2000/08/29 17:20:15 keithp Exp $ */
#include "trident.h" #include "trident.h"
#define extern #define extern
@ -72,7 +72,7 @@ tridentScreenInit (KdScreenInfo *screen)
return FALSE; return FALSE;
memset (tridents, '\0', sizeof (TridentScreenInfo)); memset (tridents, '\0', sizeof (TridentScreenInfo));
#ifdef VESA #ifdef VESA
if (!vesaScreenInit (screen)) if (!vesaScreenInitialize (screen, &tridents->vesa))
#else #else
if (!fbdevScreenInit (screen)) if (!fbdevScreenInit (screen))
#endif #endif
@ -83,14 +83,16 @@ tridentScreenInit (KdScreenInfo *screen)
if (!tridentc->cop) if (!tridentc->cop)
screen->dumb = TRUE; screen->dumb = TRUE;
#ifdef VESA #ifdef VESA
tridentc->screen = tridentc->vesa.fb; if (tridents->vesa.mapping != VESA_LINEAR)
screen->dumb = TRUE;
tridents->screen = tridents->vesa.fb;
#else #else
tridentc->screen = tridentc->fb.fb; tridents->screen = tridentc->fb.fb;
#endif #endif
screen_size = screen->fb[0].byteStride * screen->height; screen_size = screen->fb[0].byteStride * screen->height;
memory = (2048 + 512) * 1024; memory = (2048 + 512) * 1024;
if (memory >= screen_size + 2048) if (tridents->screen && memory >= screen_size + 2048)
tridents->cursor_base = tridentc->screen + memory - 2048; tridents->cursor_base = tridents->screen + memory - 2048;
else else
tridents->cursor_base = 0; tridents->cursor_base = 0;
screen->driver = tridents; screen->driver = tridents;
@ -100,7 +102,11 @@ tridentScreenInit (KdScreenInfo *screen)
Bool Bool
tridentInitScreen (ScreenPtr pScreen) tridentInitScreen (ScreenPtr pScreen)
{ {
#ifdef VESA
return vesaInitScreen (pScreen);
#else
return fbdevInitScreen (pScreen); return fbdevInitScreen (pScreen);
#endif
} }
CARD8 CARD8
@ -215,18 +221,21 @@ tridentResetMMIO (TridentCardInfo *tridentc)
tridentPause (); tridentPause ();
} }
void Bool
tridentEnable (ScreenPtr pScreen) tridentEnable (ScreenPtr pScreen)
{ {
KdScreenPriv(pScreen); KdScreenPriv(pScreen);
TridentCardInfo *tridentc = pScreenPriv->card->driver; TridentCardInfo *tridentc = pScreenPriv->card->driver;
#ifdef VESA #ifdef VESA
vesaEnable (pScreen); if (!vesaEnable (pScreen))
return FALSE;
#else #else
fbdevEnable (pScreen); if (!fbdevEnable (pScreen))
return FALSE;
#endif #endif
tridentSetMMIO (tridentc); tridentSetMMIO (tridentc);
return TRUE;
} }
void void

View File

@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/trident/trident.h,v 1.2 1999/12/30 03:03:16 robin Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/trident/trident.h,v 1.4 2000/08/29 17:20:15 keithp Exp $ */
#ifndef _TRIDENT_H_ #ifndef _TRIDENT_H_
#define _TRIDENT_H_ #define _TRIDENT_H_
@ -151,11 +151,10 @@ typedef struct _tridentSave {
typedef struct _tridentCardInfo { typedef struct _tridentCardInfo {
#ifdef VESA #ifdef VESA
VesaPrivRec vesa; VesaCardPrivRec vesa;
#else #else
FbdevPriv fb; FbdevPriv fb;
#endif #endif
CARD8 *screen;
CARD8 *cop_base; CARD8 *cop_base;
Cop *cop; Cop *cop;
CARD32 cop_depth; CARD32 cop_depth;
@ -178,7 +177,11 @@ typedef struct _tridentCursor {
#define TRIDENT_CURSOR_HEIGHT 64 #define TRIDENT_CURSOR_HEIGHT 64
typedef struct _tridentScreenInfo { typedef struct _tridentScreenInfo {
#ifdef VESA
VesaScreenPrivRec vesa;
#endif
CARD8 *cursor_base; CARD8 *cursor_base;
CARD8 *screen;
TridentCursor cursor; TridentCursor cursor;
} TridentScreenInfo; } TridentScreenInfo;

View File

@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/trident/tridentcurs.c,v 1.4 2000/05/06 22:17:51 keithp Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/trident/tridentcurs.c,v 1.5 2000/08/29 17:20:15 keithp Exp $ */
#include "trident.h" #include "trident.h"
#include "cursorstr.h" #include "cursorstr.h"
@ -221,7 +221,7 @@ tridentLoadCursor (ScreenPtr pScreen, int x, int y)
} }
/* Set address for cursor bits */ /* Set address for cursor bits */
offset = tridents->cursor_base - (CARD8 *) tridentc->screen; offset = tridents->cursor_base - (CARD8 *) tridents->screen;
offset >>= 10; offset >>= 10;
tridentWriteIndex (tridentc, 0x3d4, 0x44, (CARD8) (offset & 0xff)); tridentWriteIndex (tridentc, 0x3d4, 0x44, (CARD8) (offset & 0xff));
tridentWriteIndex (tridentc, 0x3d4, 0x45, (CARD8) (offset >> 8)); tridentWriteIndex (tridentc, 0x3d4, 0x45, (CARD8) (offset >> 8));

View File

@ -1,14 +1,13 @@
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $ XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $ XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $
#include <Server.tmpl> KDRIVE=..
#include "../Kdrive.tmpl"
SRCS = s3.c s3clock.c s3cmap.c s3curs.c s3draw.c s3gc.c s3stub.c SRCS = s3.c s3clock.c s3cmap.c s3curs.c s3draw.c s3gc.c s3stub.c
OBJS = s3.o s3clock.o s3cmap.o s3curs.o s3draw.o s3gc.o s3stub.o OBJS = s3.o s3clock.o s3cmap.o s3curs.o s3draw.o s3gc.o s3stub.o
INCLUDES = -I.. -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \ INCLUDES = -I. $(KDINCS)
-I../../../fb -I../../../mi -I../../../include -I../../../os \
-I$(EXTINCSRC) -I$(XINCLUDESRC)
DEFINES = -DS3_TRIO DEFINES = -DS3_TRIO

View File

@ -636,7 +636,7 @@ s3Preserve (KdCardInfo *card)
* Enable the card for rendering. Manipulate the initial settings * Enable the card for rendering. Manipulate the initial settings
* of the card here. * of the card here.
*/ */
void Bool
s3Enable (ScreenPtr pScreen) s3Enable (ScreenPtr pScreen)
{ {
KdScreenPriv(pScreen); KdScreenPriv(pScreen);
@ -904,6 +904,7 @@ s3Enable (ScreenPtr pScreen)
LockS3 (s3c); LockS3 (s3c);
_s3SetDepth (s3c->s3, crtc); _s3SetDepth (s3c->s3, crtc);
UnlockS3 (s3c); UnlockS3 (s3c);
return TRUE;
} }
void void

View File

@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/trio/s3.h,v 1.2 1999/12/30 03:03:19 robin Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/trio/s3.h,v 1.4 2000/05/06 22:17:53 keithp Exp $ */
#ifndef _S3_H_ #ifndef _S3_H_
#define _S3_H_ #define _S3_H_
@ -1126,7 +1126,7 @@ typedef struct _s3ScreenInfo {
Bool s3CardInit (KdCardInfo *); Bool s3CardInit (KdCardInfo *);
Bool s3ScreenInit (KdScreenInfo *); Bool s3ScreenInit (KdScreenInfo *);
void s3Enable (ScreenPtr pScreen); Bool s3Enable (ScreenPtr pScreen);
void s3Disable (ScreenPtr pScreen); void s3Disable (ScreenPtr pScreen);
void s3Fini (ScreenPtr pScreen); void s3Fini (ScreenPtr pScreen);

View File

@ -1,14 +1,13 @@
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $ XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $ XCOMM $XFree86: xc/programs/Xserver/hw/nvfb/Imakefile,v 3.8 1996/12/23 06:30:19 dawes Exp $
#include <Server.tmpl> KDRIVE=..
#include "../Kdrive.tmpl"
SRCS = ts300.c SRCS = ts300.c
OBJS = ts300.o OBJS = ts300.o
INCLUDES = -I../trio -I../sis530 -I.. -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \ INCLUDES = -I. $(KDINCS) -I../trio -I../sis530
-I../../../fb -I../../../mi -I../../../include -I../../../os \
-I$(EXTINCSRC) -I$(XINCLUDESRC)
NormalLibraryObjectRule() NormalLibraryObjectRule()
NormalLibraryTarget(ts300,$(OBJS)) NormalLibraryTarget(ts300,$(OBJS))

View File

@ -1,14 +1,12 @@
XCOMM $XFree86$ XCOMM $XFree86$
KDRIVE=..
#include <Server.tmpl> #include "../Kdrive.tmpl"
SRCS = vesa.c vesainit.c vbe.c SRCS = vesa.c vesainit.c vbe.c
OBJS = vesa.o vesainit.o vbe.o OBJS = vesa.o vesainit.o vbe.o
INCLUDES = -I.. -I. -I$(XBUILDINCDIR) -I$(FONTINCSRC) \ INCLUDES = -I. $(KDINCS)
-I../../../fb -I../../../mi -I../../../include -I../../../os \
-I$(EXTINCSRC) -I$(XINCLUDESRC)
NormalLibraryObjectRule() NormalLibraryObjectRule()
NormalLibraryTarget(vesa,$(OBJS)) NormalLibraryTarget(vesa,$(OBJS))

View File

@ -7,8 +7,12 @@ Xvesa \- VESA VBE tiny X server
.RI [ :display ] .RI [ :display ]
.RI [ option ...] .RI [ option ...]
.SH DESCRIPTION .SH DESCRIPTION
Xvesa is an X server for Linux on the x86 platform. Xvesa manipulates .B Xvesa
the video hardware by running the VESA BIOS in VM86 mode. It is a generic X server for Linux on the x86 platform.
.B Xvesa
doesn't know about any particular hardware, and sets the video mode by
running the video BIOS in VM86 mode.
.B Xvesa
therefore runs untrusted code with full priviledges, and is one of the therefore runs untrusted code with full priviledges, and is one of the
most insecure X servers available. most insecure X servers available.
.B Run at your own risk. .B Run at your own risk.
@ -23,11 +27,10 @@ specifies the VESA video mode to use. If mode
.I n .I n
is not supported by your BIOS and hardware, is not supported by your BIOS and hardware,
.B Xvesa .B Xvesa
will fail, hang your system, or make your monitor explode. You are on will fail, hang your system, or make your monitor explode; you are on
your own. The list of video modes that your BIOS claims to support your own. This option is ignored if the
can be obtained by using the .B -screen
.B -listmodes option was used.
option.
.TP 8 .TP 8
.B -listmodes .B -listmodes
tells the server to list all supported video modes. If tells the server to list all supported video modes. If
@ -40,8 +43,20 @@ the
server won't be able to use. server won't be able to use.
.TP 8 .TP 8
.B -force .B -force
tells the server to disable some sanity checks and use the specified disables some sanity checks and use the specified mode even if the
mode even if the BIOS claims not to support it. BIOS claims not to support it.
.TP 8
.B -shadow
use a shadow framebuffer even if it is not strictly necessary. This
may dramatically improve performance on some machines.
.TP 8
.B -nolinear
don't use a linear framebuffer even if one is available. You don't
want to use this option.
.TP 8
.B -swaprgb
pass RGB values in the order that works on my machine. Use this if
the colours are wrong in PseudoColor modes.
.SH KEYBOARD .SH KEYBOARD
Xvesa handles the keyboard in the same manner as the Xvesa handles the keyboard in the same manner as the
.B Xfbdev .B Xfbdev

View File

@ -114,6 +114,7 @@ VbeSetup()
MAP_SHARED | MAP_FIXED, MAP_SHARED | MAP_FIXED,
devmem, HIMEM_BASE); devmem, HIMEM_BASE);
if(hiMem == MAP_FAILED) { if(hiMem == MAP_FAILED) {
ErrorF("Couldn't map high memory\n");
munmap(magicMem, MAGICMEM_SIZE); munmap(magicMem, MAGICMEM_SIZE);
munmap(loMem, LOMEM_SIZE); munmap(loMem, LOMEM_SIZE);
goto fail; goto fail;
@ -128,7 +129,6 @@ VbeSetup()
vi->magicMem = magicMem; vi->magicMem = magicMem;
vi->loMem = loMem; vi->loMem = loMem;
vi->hiMem = hiMem; vi->hiMem = hiMem;
vi->fb = NULL;
vi->brk = LOMEM_BASE; vi->brk = LOMEM_BASE;
stack_base = VbeAllocateMemory(vi, STACK_SIZE); stack_base = VbeAllocateMemory(vi, STACK_SIZE);
@ -152,6 +152,9 @@ VbeSetup()
vi->palette_scratch_base = ~0; vi->palette_scratch_base = ~0;
vi->palette_format = 6; vi->palette_format = 6;
vi->palette_wait = 0; vi->palette_wait = 0;
vi->windowA_offset = vi->windowB_offset = -1;
vi->last_window = 1;
vi->vga_palette = 1;
memset(&vi->vms, 0, sizeof(struct vm86_struct)); memset(&vi->vms, 0, sizeof(struct vm86_struct));
vi->vms.flags = 0; vi->vms.flags = 0;
@ -181,8 +184,6 @@ VbeSetup()
void void
VbeCleanup(VbeInfoPtr vi) VbeCleanup(VbeInfoPtr vi)
{ {
if(vi->fb)
VbeUnmapFramebuffer(vi);
munmap(vi->magicMem, MAGICMEM_SIZE); munmap(vi->magicMem, MAGICMEM_SIZE);
munmap(vi->loMem, LOMEM_SIZE); munmap(vi->loMem, LOMEM_SIZE);
munmap(vi->hiMem, HIMEM_SIZE); munmap(vi->hiMem, HIMEM_SIZE);
@ -233,12 +234,17 @@ VbeGetModeInfo(VbeInfoPtr vi, int mode)
} }
int int
VbeSetMode(VbeInfoPtr vi, int mode) VbeSetMode(VbeInfoPtr vi, int mode, int linear)
{ {
int code; int code;
vi->windowA_offset = vi->windowB_offset = -1;
vi->last_window = 1;
vi->vms.regs.eax = 0x4F02; vi->vms.regs.eax = 0x4F02;
vi->vms.regs.ebx = (mode & 0xFFFF) | 0xC000; vi->vms.regs.ebx = (mode & 0xFFFF) | 0x8000;
if(linear)
vi->vms.regs.ebx |= 0x4000;
code = VbeDoInterrupt10(vi); code = VbeDoInterrupt10(vi);
if(code < 0) if(code < 0)
return -1; return -1;
@ -306,11 +312,24 @@ VbeRestoreState(VbeInfoPtr vi)
return 0; return 0;
} }
int
VbeSetTextMode(VbeInfoPtr vi, int mode)
{
int code;
vi->vms.regs.eax = mode & 0x7f;
code = VbeDoInterrupt10(vi);
if(code < 0)
return -1;
return 0;
}
void * void *
VbeMapFramebuffer(VbeInfoPtr vi) { VbeMapFramebuffer(VbeInfoPtr vi,
VbeModeInfoBlock *vmib)
{
U8 *fb; U8 *fb;
VbeInfoBlock *vib = (VbeInfoBlock*)&(LM(vi, vi->vib_base)); VbeInfoBlock *vib = (VbeInfoBlock*)&(LM(vi, vi->vib_base));
VbeModeInfoBlock *vmib = (VbeModeInfoBlock*)&(LM(vi, vi->vmib_base));
int size; int size;
int pagesize = getpagesize(), before, after; int pagesize = getpagesize(), before, after;
@ -329,18 +348,28 @@ VbeMapFramebuffer(VbeInfoPtr vi) {
return NULL; return NULL;
} }
vi->fb = fb;
vi->fb_size = before + size + after;
return fb + before; return fb + before;
} }
int int
VbeUnmapFramebuffer(VbeInfoPtr vi) VbeUnmapFramebuffer(VbeInfoPtr vi,
VbeModeInfoBlock *vmib,
void *fb)
{ {
int code; int code;
if(!vi->fb) VbeInfoBlock *vib = (VbeInfoBlock*)&(LM(vi, vi->vib_base));
ErrorF("Unmapping frambuffer not mapped\n"); int size;
code = munmap(vi->fb, vi->fb_size); int pagesize = getpagesize(), before, after;
size = 1024 * 64L * vib->TotalMemory;
before = vmib->PhysBasePtr % pagesize;
after = pagesize - ((vmib->PhysBasePtr + size) % pagesize);
if(after == pagesize)
after = 0;
fb = (void *) ((char *) fb - before);
code = munmap(fb, before + size + after);
if(code) { if(code) {
ErrorF("Couldn't unmap framebuffer: %d\n", errno); ErrorF("Couldn't unmap framebuffer: %d\n", errno);
return -1; return -1;
@ -375,7 +404,7 @@ int
VbeSetPalette(VbeInfoPtr vi, int first, int number, U8 *entries) VbeSetPalette(VbeInfoPtr vi, int first, int number, U8 *entries)
{ {
U8 *palette_scratch; U8 *palette_scratch;
int i, code; int i, j, code;
if(number == 0) if(number == 0)
return 0; return 0;
@ -395,6 +424,25 @@ VbeSetPalette(VbeInfoPtr vi, int first, int number, U8 *entries)
return -1; return -1;
} }
if (vi->vga_palette)
{
vi->vms.regs.eax = 0x1012;
vi->vms.regs.ebx = first;
vi->vms.regs.ecx = number;
vi->vms.regs.es = POINTER_SEGMENT(vi->palette_scratch_base);
vi->vms.regs.edx = POINTER_OFFSET(vi->palette_scratch_base);
j = 0;
i = 0;
while (number--)
{
palette_scratch[j++] = entries[i++] >> (8-vi->palette_format);
palette_scratch[j++] = entries[i++] >> (8-vi->palette_format);
palette_scratch[j++] = entries[i++] >> (8-vi->palette_format);
i++;
}
}
else
{
for(i=0; i<number*4; i++) for(i=0; i<number*4; i++)
palette_scratch[i] = entries[i] >> (8 - vi->palette_format); palette_scratch[i] = entries[i] >> (8 - vi->palette_format);
@ -407,6 +455,7 @@ VbeSetPalette(VbeInfoPtr vi, int first, int number, U8 *entries)
vi->vms.regs.edx = first; vi->vms.regs.edx = first;
vi->vms.regs.es = POINTER_SEGMENT(vi->palette_scratch_base); vi->vms.regs.es = POINTER_SEGMENT(vi->palette_scratch_base);
vi->vms.regs.edi = POINTER_OFFSET(vi->palette_scratch_base); vi->vms.regs.edi = POINTER_OFFSET(vi->palette_scratch_base);
}
code = VbeDoInterrupt10(vi); code = VbeDoInterrupt10(vi);
if(code < 0) if(code < 0)
return -1; return -1;
@ -417,7 +466,7 @@ int
VbeGetPalette(VbeInfoPtr vi, int first, int number, U8 *entries) VbeGetPalette(VbeInfoPtr vi, int first, int number, U8 *entries)
{ {
U8 *palette_scratch; U8 *palette_scratch;
int i, code; int i, j, code;
code = PreparePalette(vi); code = PreparePalette(vi);
if(code < 0) if(code < 0)
@ -434,6 +483,29 @@ VbeGetPalette(VbeInfoPtr vi, int first, int number, U8 *entries)
return -1; return -1;
} }
retry:
if (vi->vga_palette)
{
vi->vms.regs.eax = 0x1017;
vi->vms.regs.ebx = first;
vi->vms.regs.ecx = number;
vi->vms.regs.es = POINTER_SEGMENT(vi->palette_scratch_base);
vi->vms.regs.edx = POINTER_OFFSET(vi->palette_scratch_base);
code = VbeDoInterrupt10(vi);
if(code < 0)
return -1;
j = 0;
i = 0;
while (number--)
{
entries[i++] = palette_scratch[j++] << (8-vi->palette_format);
entries[i++] = palette_scratch[j++] << (8-vi->palette_format);
entries[i++] = palette_scratch[j++] << (8-vi->palette_format);
entries[i++] = 0;
}
}
else
{
vi->vms.regs.eax = 0x4F09; vi->vms.regs.eax = 0x4F09;
vi->vms.regs.ebx = 0x01; vi->vms.regs.ebx = 0x01;
vi->vms.regs.ecx = number; vi->vms.regs.ecx = number;
@ -442,10 +514,14 @@ VbeGetPalette(VbeInfoPtr vi, int first, int number, U8 *entries)
vi->vms.regs.edi = POINTER_OFFSET(vi->palette_scratch_base); vi->vms.regs.edi = POINTER_OFFSET(vi->palette_scratch_base);
code = VbeDoInterrupt10(vi); code = VbeDoInterrupt10(vi);
if(code < 0) if(code < 0)
return -1; {
vi->vga_palette = TRUE;
goto retry;
}
for(i=0; i<number*4; i++) for(i=0; i<number*4; i++)
entries[i] = palette_scratch[i] << (8-vi->palette_format); entries[i] = palette_scratch[i] << (8-vi->palette_format);
}
return 0; return 0;
} }
@ -458,7 +534,6 @@ VbeSetPaletteOptions(VbeInfoPtr vi, U8 bits, int wait)
ErrorF("Impossible palette format %d\n", vi->palette_format); ErrorF("Impossible palette format %d\n", vi->palette_format);
return -1; return -1;
} }
ErrorF("Setting palette format to %d\n", vi->palette_format);
if(bits != vi->palette_format) { if(bits != vi->palette_format) {
vi->palette_format = 0; vi->palette_format = 0;
vi->vms.regs.eax = 0x4F08; vi->vms.regs.eax = 0x4F08;
@ -472,6 +547,94 @@ VbeSetPaletteOptions(VbeInfoPtr vi, U8 bits, int wait)
return 0; return 0;
} }
static int
VbeReallySetWindow(VbeInfoPtr vi, U8 window, U16 winnum)
{
int code;
vi->vms.regs.eax = 0x4F05;
vi->vms.regs.ebx = window;
vi->vms.regs.edx = winnum;
code = VbeDoInterrupt10(vi);
if(code < 0)
return -1;
return 0;
}
void *
VbeSetWindow(VbeInfoPtr vi, int offset, int purpose, int *size_return)
{
VbeModeInfoBlock *vmib = (VbeModeInfoBlock*)&(LM(vi, vi->vmib_base));
int window_size = vmib->WinSize * 1024;
int code;
int winnum;
if(vi->windowA_offset >= 0)
if(vi->windowA_offset <= offset && vi->windowA_offset + window_size > offset)
if(vmib->WinAAttributes & purpose)
goto windowA;
if(vi->windowB_offset >= 0)
if(vi->windowB_offset <= offset && vi->windowB_offset + window_size > offset)
if(vmib->WinBAttributes & purpose)
goto windowB;
if(!(vmib->WinBAttributes & purpose) ||
!(vmib->WinBAttributes & VBE_WINDOW_RELOCATE))
goto set_windowA;
if(!(vmib->WinAAttributes & purpose) ||
!(vmib->WinAAttributes & VBE_WINDOW_RELOCATE))
goto set_windowB;
if(vi->last_window)
goto set_windowA;
else
goto set_windowB;
set_windowA:
winnum = offset / (vmib->WinGranularity * 1024);
code = VbeReallySetWindow(vi, 0, winnum);
if(code < 0) {
ErrorF("Couldn't set window A to %d*%d\n",
(int)winnum, (int)vmib->WinGranularity);
return NULL;
}
vi->windowA_offset = winnum * vmib->WinGranularity * 1024;
windowA:
vi->last_window = 0;
*size_return = vmib->WinSize * 1024 - (offset - vi->windowA_offset);
return ((U8*)&(LM(vi, MAKE_POINTER(vmib->WinASegment, 0)))) +
offset - vi->windowA_offset;
set_windowB:
winnum = offset / (vmib->WinGranularity * 1024);
code = VbeReallySetWindow(vi, 1, winnum);
if(code < 0) {
ErrorF("Couldn't set window B to %d*%d\n",
(int)winnum, (int)vmib->WinGranularity);
return NULL;
}
vi->windowB_offset = winnum * vmib->WinGranularity * 1024;
windowB:
vi->last_window = 1;
*size_return = vmib->WinSize * 1024 - (offset - vi->windowB_offset);
return ((U8*)&(LM(vi, MAKE_POINTER(vmib->WinBSegment, 0)))) + offset - vi->windowB_offset;
}
int
VbeSetWritePlaneMask(VbeInfoPtr vi, int mask)
{
asm volatile ("outb %b0,%w1" : : "a" (2), "d" (0x3c4));
asm volatile ("outb %b0,%w1" : : "a" (mask), "d" (0x3c5));
}
int
VbeSetReadPlaneMap(VbeInfoPtr vi, int map)
{
asm volatile ("outb %b0,%w1" : : "a" (4), "d" (0x3ce));
asm volatile ("outb %b0,%w1" : : "a" (map), "d" (0x3cf));
}
int int
VbeReportInfo(VbeInfoPtr vi, VbeInfoBlock *vib) VbeReportInfo(VbeInfoPtr vi, VbeInfoBlock *vib)
{ {
@ -496,7 +659,7 @@ VbeReportInfo(VbeInfoPtr vi, VbeInfoBlock *vib)
(vib->Capabilities[0]&1)?"fixed":"switchable", (vib->Capabilities[0]&1)?"fixed":"switchable",
(vib->Capabilities[0]&2)?"not ":"", (vib->Capabilities[0]&2)?"not ":"",
(vib->Capabilities[0]&3)?", RAMDAC causes snow":""); (vib->Capabilities[0]&3)?", RAMDAC causes snow":"");
ErrorF("Total memory: %lu bytes\n", 64L*vib->TotalMemory); ErrorF("Total memory: %lu kilobytes\n", 64L*vib->TotalMemory);
if(error) if(error)
return -1; return -1;
return 0; return 0;
@ -572,7 +735,7 @@ VbeDoInterrupt10(VbeInfoPtr vi)
if(code < 0) if(code < 0)
return -1; return -1;
if((vi->vms.regs.eax & 0xFFFF) != 0x4F) { if((vi->vms.regs.eax & 0xFFFF) != 0x4F && (oldax & 0xFF00) == 0x4F00) {
ErrorF("Int 10h (0x%04X) failed: 0x%04X", ErrorF("Int 10h (0x%04X) failed: 0x%04X",
oldax, vi->vms.regs.eax & 0xFFFF); oldax, vi->vms.regs.eax & 0xFFFF);
if((oldax & 0xFF00) == 0x4F00) { if((oldax & 0xFF00) == 0x4F00) {
@ -627,7 +790,9 @@ VbeDoInterrupt(VbeInfoPtr vi, int num)
PUSHW(vi, POINTER_OFFSET(vi->ret_code)); PUSHW(vi, POINTER_OFFSET(vi->ret_code));
vi->vms.regs.cs = seg; vi->vms.regs.cs = seg;
vi->vms.regs.eip = off; vi->vms.regs.eip = off;
OsBlockSignals ();
code = vm86_loop(vi); code = vm86_loop(vi);
OsReleaseSignals ();
if(code < 0) { if(code < 0) {
perror("vm86 failed"); perror("vm86 failed");
return -1; return -1;
@ -873,6 +1038,7 @@ static int
vm86_loop(VbeInfoPtr vi) vm86_loop(VbeInfoPtr vi)
{ {
int code; int code;
while(1) { while(1) {
code = vm86old(&vi->vms); code = vm86old(&vi->vms);
switch(VM86_TYPE(code)) { switch(VM86_TYPE(code)) {
@ -1030,6 +1196,7 @@ static int
vm86old(struct vm86_struct *vm) vm86old(struct vm86_struct *vm)
{ {
int res; int res;
asm volatile ( asm volatile (
"pushl %%ebx\n\t" "pushl %%ebx\n\t"
"movl %2, %%ebx\n\t" "movl %2, %%ebx\n\t"
@ -1042,6 +1209,7 @@ vm86old(struct vm86_struct *vm)
res = -1; res = -1;
} else } else
errno = 0; errno = 0;
OsReleaseSignals ();
return res; return res;
} }

View File

@ -23,6 +23,10 @@ THE SOFTWARE.
#ifndef _VBE_H #ifndef _VBE_H
#define _VBE_H #define _VBE_H
#define VBE_WINDOW_RELOCATE 1
#define VBE_WINDOW_READ 2
#define VBE_WINDOW_WRITE 4
#ifndef U8 #ifndef U8
#define U8 unsigned char #define U8 unsigned char
#define U16 unsigned short #define U16 unsigned short
@ -61,13 +65,16 @@ THE SOFTWARE.
typedef struct _VbeInfoRec { typedef struct _VbeInfoRec {
int devmem, devzero; int devmem, devzero;
void *magicMem, *loMem, *hiMem, *fb; void *magicMem, *loMem, *hiMem;
U32 fb_size;
U32 brk; U32 brk;
struct vm86_struct vms; struct vm86_struct vms;
U32 ret_code, stack_base, vib_base, vmib_base, statebuffer_base, palette_scratch_base; U32 ret_code, stack_base, vib_base, vmib_base, statebuffer_base, palette_scratch_base;
U8 palette_format; U8 palette_format;
int palette_wait; int palette_wait;
int windowA_offset;
int windowB_offset;
int last_window;
int vga_palette;
} VbeInfoRec, *VbeInfoPtr; } VbeInfoRec, *VbeInfoPtr;
typedef struct _VbeInfoBlock { typedef struct _VbeInfoBlock {
@ -143,15 +150,16 @@ VbeInfoPtr VbeSetup(void);
void VbeCleanup(VbeInfoPtr vi); void VbeCleanup(VbeInfoPtr vi);
VbeInfoBlock *VbeGetInfo(VbeInfoPtr vi); VbeInfoBlock *VbeGetInfo(VbeInfoPtr vi);
VbeModeInfoBlock *VbeGetModeInfo(VbeInfoPtr vi, int mode); VbeModeInfoBlock *VbeGetModeInfo(VbeInfoPtr vi, int mode);
int VbeSetMode(VbeInfoPtr vi, int mode); int VbeSetMode(VbeInfoPtr vi, int mode, int linear);
int VbeGetMode(VbeInfoPtr vi, int *mode); int VbeGetMode(VbeInfoPtr vi, int *mode);
int VbeSetupStateBuffer(VbeInfoPtr vi); int VbeSetupStateBuffer(VbeInfoPtr vi);
int VbeSaveState(VbeInfoPtr vi); int VbeSaveState(VbeInfoPtr vi);
int VbeRestoreState(VbeInfoPtr vi); int VbeRestoreState(VbeInfoPtr vi);
void *VbeMapFramebuffer(VbeInfoPtr vi); void *VbeMapFramebuffer(VbeInfoPtr vi, VbeModeInfoBlock *vmib);
int VbeUnmapFrambuffer(VbeInfoPtr vi); int VbeUnmapFrambuffer(VbeInfoPtr vi, VbeModeInfoBlock *vmib, void *fb);
int VbeSetPalette(VbeInfoPtr vi, int first, int number, U8 *entries); int VbeSetPalette(VbeInfoPtr vi, int first, int number, U8 *entries);
int VbeSetPaletteOptions(VbeInfoPtr vi, U8 bits, int wait); int VbeSetPaletteOptions(VbeInfoPtr vi, U8 bits, int wait);
void *VbeSetWindow(VbeInfoPtr vi, int offset, int purpose, int *size_return);
int VbeReportInfo(VbeInfoPtr, VbeInfoBlock *); int VbeReportInfo(VbeInfoPtr, VbeInfoBlock *);
int VbeReportModeInfo(VbeInfoPtr, U16 mode, VbeModeInfoBlock *); int VbeReportModeInfo(VbeInfoPtr, U16 mode, VbeModeInfoBlock *);

View File

@ -22,11 +22,12 @@ THE SOFTWARE.
#include "vesa.h" #include "vesa.h"
#define DEFAULT_MODE 0x115 int vesa_video_mode = 0;
int vesa_video_mode = DEFAULT_MODE;
Bool vesa_force_mode = FALSE; Bool vesa_force_mode = FALSE;
Bool vesa_swap_rgb = FALSE; Bool vesa_swap_rgb = FALSE;
Bool vesa_shadow = FALSE;
Bool vesa_linear_fb = TRUE;
Bool vesa_restore = FALSE;
static Bool static Bool
vesaModeSupported(VbeInfoPtr vi, VbeModeInfoBlock *vmib, Bool complain) vesaModeSupported(VbeInfoPtr vi, VbeModeInfoBlock *vmib, Bool complain)
@ -36,17 +37,19 @@ vesaModeSupported(VbeInfoPtr vi, VbeModeInfoBlock *vmib, Bool complain)
ErrorF("Text mode specified.\n"); ErrorF("Text mode specified.\n");
return FALSE; return FALSE;
} }
if(vmib->MemoryModel != 0x06 && vmib->MemoryModel != 0x04) { if(vmib->MemoryModel != 0x06 && vmib->MemoryModel != 0x04 && vmib->MemoryModel != 0x03) {
if(complain) if(complain)
ErrorF("Unsupported memory model 0x%X\n", vmib->MemoryModel); ErrorF("Unsupported memory model 0x%X\n", vmib->MemoryModel);
return FALSE; return FALSE;
} }
if((vmib->ModeAttributes & 0x80) == 0) { if((vmib->ModeAttributes & 0x80) == 0) {
if ((vmib->WinAAttributes & 0x5) != 0x5) {
if(complain) if(complain)
ErrorF("No linear framebuffer available in this mode\n"); ErrorF("Neither linear nor windowed framebuffer available in this mode\n");
return FALSE; return FALSE;
} }
if(!(vmib->ModeAttributes&1)) { }
if(!(vmib->ModeAttributes & 1)) {
if(complain) if(complain)
ErrorF("Mode not supported on this hardware\n"); ErrorF("Mode not supported on this hardware\n");
return FALSE; return FALSE;
@ -61,7 +64,8 @@ vesaListModes()
VbeInfoPtr vi = NULL; VbeInfoPtr vi = NULL;
VbeInfoBlock *vib; VbeInfoBlock *vib;
VbeModeInfoBlock *vmib; VbeModeInfoBlock *vmib;
unsigned i; unsigned p, num_modes, i;
CARD16 *modes_list = NULL;
vi = VbeSetup(); vi = VbeSetup();
if(!vi) if(!vi)
@ -72,32 +76,91 @@ vesaListModes()
goto fail; goto fail;
VbeReportInfo(vi, vib); VbeReportInfo(vi, vib);
i = MAKE_POINTER_1(vib->VideoModePtr); /* The spec says you need to copy the list */
p = MAKE_POINTER_1(vib->VideoModePtr);
num_modes = 0;
while(VbeMemoryW(vi, p) != 0xFFFF) {
num_modes++;
p+=2;
}
modes_list = ALLOCATE_LOCAL(num_modes * sizeof(CARD16));
if(!modes_list)
goto fail;
p = MAKE_POINTER_1(vib->VideoModePtr);
for(i=0; i<num_modes; i++) {
modes_list[i] = VbeMemoryW(vi, p);
p += 2;
}
while(VbeMemoryW(vi, i) != 0xFFFF) { for(i=0; i<num_modes; i++) {
vmib = VbeGetModeInfo(vi, VbeMemoryW(vi, i)); vmib = VbeGetModeInfo(vi, modes_list[i]);
if(!vmib) if(!vmib)
goto fail; goto fail;
if(vesa_force_mode || vesaModeSupported(vi, vmib, FALSE)) if(vesa_force_mode || vesaModeSupported(vi, vmib, FALSE))
VbeReportModeInfo(vi, VbeMemoryW(vi, i), vmib); VbeReportModeInfo(vi, modes_list[i], vmib);
i+=2;
} }
if(modes_list)
DEALLOCATE_LOCAL(modes_list);
VbeCleanup(vi); VbeCleanup(vi);
return TRUE; return TRUE;
fail: fail:
if(modes_list)
DEALLOCATE_LOCAL(modes_list);
VbeCleanup(vi); VbeCleanup(vi);
return FALSE; return FALSE;
} }
Bool Bool
vesaInitialize (KdCardInfo *card, VesaPrivPtr priv) vesaGetModes (KdCardInfo *card, VesaCardPrivPtr priv)
{
VesaModePtr mode;
int nmode;
unsigned int i;
VbeInfoPtr vi = priv->vi;
VbeInfoBlock *vib = priv->vib;
VbeModeInfoBlock *vmib;
/* The spec says you need to copy the list */
i = MAKE_POINTER_1(vib->VideoModePtr);
nmode = 0;
while(VbeMemoryW(vi, i) != 0xFFFF) {
nmode++;
i+=2;
}
if (!nmode)
return FALSE;
priv->modes = xalloc (nmode * sizeof (VesaModeRec));
if (!priv->modes)
return FALSE;
priv->nmode = nmode;
i = MAKE_POINTER_1(vib->VideoModePtr);
nmode = 0;
while(nmode < priv->nmode) {
priv->modes[nmode].mode = VbeMemoryW(vi, i);
nmode++;
i+=2;
}
i = MAKE_POINTER_1(vib->VideoModePtr);
nmode = 0;
while(nmode < priv->nmode) {
vmib = VbeGetModeInfo(vi, priv->modes[nmode].mode);
if(!vmib)
break;
priv->modes[nmode].vmib = *vmib;
i += 2;
nmode++;
}
return TRUE;
}
Bool
vesaInitialize (KdCardInfo *card, VesaCardPrivPtr priv)
{ {
int code; int code;
priv->mode = vesa_video_mode;
priv->vi = VbeSetup(); priv->vi = VbeSetup();
if(!priv->vi) if(!priv->vi)
goto fail; goto fail;
@ -106,13 +169,6 @@ vesaInitialize (KdCardInfo *card, VesaPrivPtr priv)
if(!priv->vib) if(!priv->vib)
goto fail; goto fail;
priv->vmib = VbeGetModeInfo(priv->vi, priv->mode);
if(!priv->vmib)
goto fail;
if(!vesa_force_mode && !vesaModeSupported(priv->vi, priv->vmib, TRUE))
goto fail;
code = VbeSetupStateBuffer(priv->vi); code = VbeSetupStateBuffer(priv->vi);
if(code < 0) if(code < 0)
goto fail; goto fail;
@ -121,8 +177,7 @@ vesaInitialize (KdCardInfo *card, VesaPrivPtr priv)
if(code<0) if(code<0)
goto fail; goto fail;
priv->fb = VbeMapFramebuffer(priv->vi); if (!vesaGetModes (card, priv))
if(!priv->vi)
goto fail; goto fail;
card->driver = priv; card->driver = priv;
@ -138,9 +193,9 @@ vesaInitialize (KdCardInfo *card, VesaPrivPtr priv)
Bool Bool
vesaCardInit(KdCardInfo *card) vesaCardInit(KdCardInfo *card)
{ {
VesaPrivPtr priv; VesaCardPrivPtr priv;
priv = xalloc(sizeof(VesaPrivRec)); priv = xalloc(sizeof(VesaCardPrivRec));
if(!priv) if(!priv)
return FALSE; return FALSE;
@ -153,30 +208,137 @@ vesaCardInit(KdCardInfo *card)
return TRUE; return TRUE;
} }
Bool int
vesaScreenInit(KdScreenInfo *screen) vesaDepth (VbeModeInfoBlock *m)
{ {
VesaPrivPtr priv = screen->card->driver; if (m->MemoryModel == 0x06)
return (m->RedMaskSize +
m->GreenMaskSize +
m->BlueMaskSize);
else
return m->BitsPerPixel;
}
Bool
vesaModeGood (KdScreenInfo *screen,
VbeModeInfoBlock *a)
{
if (a->XResolution <= screen->width &&
a->YResolution <= screen->height &&
vesaDepth (a) >= screen->fb[0].depth)
{
return TRUE;
}
}
#define vabs(a) ((a) >= 0 ? (a) : -(a))
int
vesaSizeError (KdScreenInfo *screen,
VbeModeInfoBlock *a)
{
int xdist, ydist;
xdist = vabs (screen->width - a->XResolution);
ydist = vabs (screen->height - a->YResolution);
return xdist * xdist + ydist * ydist;
}
Bool
vesaModeBetter (KdScreenInfo *screen,
VbeModeInfoBlock *a,
VbeModeInfoBlock *b)
{
int aerr, berr;
if (vesaModeGood (screen, a))
{
if (!vesaModeGood (screen, b))
return TRUE;
}
else
{
if (vesaModeGood (screen, b))
return FALSE;
}
aerr = vesaSizeError (screen, a);
berr = vesaSizeError (screen, b);
if (aerr < berr)
return TRUE;
if (berr < aerr)
return FALSE;
if (vabs (screen->fb[0].depth - vesaDepth (a)) <
vabs (screen->fb[0].depth - vesaDepth (b)))
return TRUE;
return FALSE;
}
VesaModePtr
vesaSelectMode (KdScreenInfo *screen)
{
VesaCardPrivPtr priv = screen->card->driver;
int i, best;
if (vesa_video_mode)
{
for (best = 0; best < priv->nmode; best++)
if (priv->modes[best].mode == vesa_video_mode &&
(vesaModeSupported (priv->vi, &priv->modes[best].vmib, FALSE) ||
vesa_force_mode))
return &priv->modes[best];
}
for (best = 0; best < priv->nmode; best++)
{
if (vesaModeSupported (priv->vi, &priv->modes[best].vmib, FALSE))
break;
}
if (best == priv->nmode)
return 0;
for (i = best + 1; i < priv->nmode; i++)
if (vesaModeSupported (priv->vi, &priv->modes[i].vmib, FALSE) &&
vesaModeBetter (screen, &priv->modes[i].vmib,
&priv->modes[best].vmib))
best = i;
return &priv->modes[best];
}
Bool
vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr)
{
VesaCardPrivPtr priv = screen->card->driver;
VbeModeInfoBlock *vmib;
Pixel allbits; Pixel allbits;
int depth; int depth;
screen->width = priv->vmib->XResolution; pscr->mode = vesaSelectMode (screen);
screen->height = priv->vmib->YResolution; if (!pscr->mode)
screen->fb[0].depth = priv->vmib->BitsPerPixel; return FALSE;
screen->fb[0].bitsPerPixel = priv->vmib->BitsPerPixel;
screen->fb[0].byteStride = priv->vmib->BytesPerScanLine;
screen->fb[0].pixelStride =
(priv->vmib->BytesPerScanLine * 8) / priv->vmib->BitsPerPixel;
if(priv->vmib->MemoryModel == 0x06) { pscr->shadow = vesa_shadow;
if (vesa_linear_fb)
pscr->mapping = VESA_LINEAR;
else
pscr->mapping = VESA_WINDOWED;
vmib = &pscr->mode->vmib;
screen->width = vmib->XResolution;
screen->height = vmib->YResolution;
screen->fb[0].depth = vesaDepth (vmib);
screen->fb[0].bitsPerPixel = vmib->BitsPerPixel;
screen->fb[0].byteStride = vmib->BytesPerScanLine;
screen->fb[0].pixelStride = ((vmib->BytesPerScanLine * 8) /
vmib->BitsPerPixel);
switch (vmib->MemoryModel) {
case 0x06:
/* TrueColor or DirectColor */ /* TrueColor or DirectColor */
screen->fb[0].visuals = (1 << TrueColor); screen->fb[0].visuals = (1 << TrueColor);
screen->fb[0].redMask = screen->fb[0].redMask =
FbStipMask(priv->vmib->RedFieldPosition, priv->vmib->RedMaskSize); FbStipMask(vmib->RedFieldPosition, vmib->RedMaskSize);
screen->fb[0].greenMask = screen->fb[0].greenMask =
FbStipMask(priv->vmib->GreenFieldPosition, priv->vmib->GreenMaskSize); FbStipMask(vmib->GreenFieldPosition, vmib->GreenMaskSize);
screen->fb[0].blueMask = screen->fb[0].blueMask =
FbStipMask(priv->vmib->BlueFieldPosition, priv->vmib->BlueMaskSize); FbStipMask(vmib->BlueFieldPosition, vmib->BlueMaskSize);
allbits = allbits =
screen->fb[0].redMask | screen->fb[0].redMask |
screen->fb[0].greenMask | screen->fb[0].greenMask |
@ -185,7 +347,8 @@ vesaScreenInit(KdScreenInfo *screen)
while (depth && !(allbits & (1 << (depth - 1)))) while (depth && !(allbits & (1 << (depth - 1))))
depth--; depth--;
screen->fb[0].depth = depth; screen->fb[0].depth = depth;
} else if (priv->vmib->MemoryModel == 0x04) { break;
case 0x04:
/* PseudoColor */ /* PseudoColor */
screen->fb[0].visuals = ((1 << StaticGray) | screen->fb[0].visuals = ((1 << StaticGray) |
(1 << GrayScale) | (1 << GrayScale) |
@ -196,35 +359,204 @@ vesaScreenInit(KdScreenInfo *screen)
screen->fb[0].blueMask = 0x00; screen->fb[0].blueMask = 0x00;
screen->fb[0].greenMask = 0x00; screen->fb[0].greenMask = 0x00;
screen->fb[0].redMask = 0x00; screen->fb[0].redMask = 0x00;
} else { break;
case 0x03:
/* 4 plane planar */
screen->fb[0].visuals = (1 << StaticColor);
screen->fb[0].blueMask = 0x00;
screen->fb[0].greenMask = 0x00;
screen->fb[0].redMask = 0x00;
screen->fb[0].depth = 4;
screen->fb[0].bitsPerPixel = 4;
pscr->mapping = VESA_PLANAR;
break;
default:
ErrorF("Unsupported VESA MemoryModel 0x%02X\n", ErrorF("Unsupported VESA MemoryModel 0x%02X\n",
priv->vmib->MemoryModel); vmib->MemoryModel);
return FALSE; return FALSE;
} }
if (pscr->mapping == VESA_LINEAR && !(vmib->ModeAttributes & 0x80))
pscr->mapping = VESA_WINDOWED;
switch (pscr->mapping) {
case VESA_LINEAR:
pscr->fb = VbeMapFramebuffer(priv->vi, vmib);
break;
case VESA_WINDOWED:
pscr->fb = NULL;
pscr->shadow = TRUE;
break;
case VESA_PLANAR:
pscr->fb = NULL;
pscr->shadow = TRUE;
break;
}
screen->rate = 72; screen->rate = 72;
screen->fb[0].frameBuffer = (CARD8 *)(priv->fb); screen->fb[0].frameBuffer = (CARD8 *)(pscr->fb);
if (pscr->shadow)
return KdShadowScreenInit (screen);
return TRUE; return TRUE;
} }
Bool Bool
vesaInitScreen(ScreenPtr pScreen) vesaScreenInit(KdScreenInfo *screen)
{ {
VesaScreenPrivPtr pscr;
pscr = xcalloc (1, sizeof (VesaScreenPrivRec));
if (!pscr)
return FALSE;
if (!vesaScreenInitialize (screen, pscr))
return FALSE;
screen->driver = pscr;
return TRUE; return TRUE;
} }
void void *
vesaWindowPlanar (ScreenPtr pScreen,
CARD32 row,
CARD32 offset,
int mode,
CARD32 *size)
{
KdScreenPriv(pScreen);
VesaCardPrivPtr priv = pScreenPriv->card->driver;
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
VbeModeInfoBlock *vmib = &pscr->mode->vmib;
static int plane;
int winSize;
void *base;
if (!pScreenPriv->enabled)
return 0;
plane = offset & 3;
VbeSetWritePlaneMask (priv->vi, (1 << plane));
offset = offset >> 2;
base = VbeSetWindow (priv->vi,
vmib->BytesPerScanLine * row + offset,
mode,
&winSize);
*size = (CARD32) winSize;
return base;
}
void *
vesaWindowLinear (ScreenPtr pScreen,
CARD32 row,
CARD32 offset,
int mode,
CARD32 *size)
{
KdScreenPriv(pScreen);
VesaCardPrivPtr priv = pScreenPriv->card->driver;
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
VbeModeInfoBlock *vmib = &pscr->mode->vmib;
if (!pScreenPriv->enabled)
return 0;
*size = vmib->BytesPerScanLine;
return (CARD8 *) pscr->fb + row * vmib->BytesPerScanLine + offset;
}
void *
vesaWindowWindowed (ScreenPtr pScreen,
CARD32 row,
CARD32 offset,
int mode,
CARD32 *size)
{
KdScreenPriv(pScreen);
VesaCardPrivPtr priv = pScreenPriv->card->driver;
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
VbeModeInfoBlock *vmib = &pscr->mode->vmib;
int winSize;
void *base;
if (!pScreenPriv->enabled)
return 0;
base = VbeSetWindow (priv->vi,
vmib->BytesPerScanLine * row + offset,
mode,
&winSize);
*size = (CARD32) winSize;
return base;
}
static CARD16 vga16Colors[16][3] = {
{ 0, 0, 0, }, /* 0 */
{ 0x80,0, 0, }, /* 1 */
{ 0, 0x80,0, }, /* 2 */
{ 0x80,0x80,0, }, /* 3 */
{ 0, 0, 0x80,}, /* 4 */
{ 0x80,0, 0x80,}, /* 5 */
{ 0, 0x80,0x80,}, /* 6 */
{ 0x80,0x80,0x80,}, /* 7 */
{ 0xC0,0xC0,0xC0,}, /* 8 */
{ 0xFF,0, 0 ,}, /* 9 */
{ 0, 0xFF,0 ,}, /* 10 */
{ 0xFF,0xFF,0 ,}, /* 11 */
{ 0 ,0, 0xFF,}, /* 12 */
{ 0xFF,0, 0xFF,}, /* 13 */
{ 0, 0xFF,0xFF,}, /* 14 */
{ 0xFF,0xFF,0xFF,}, /* 15 */
};
Bool
vesaCreateColormap16 (ColormapPtr pmap)
{
int i;
for (i = 0; i < 16; i++)
{
pmap->red[i].co.local.red = (vga16Colors[i][0]<<8)|vga16Colors[i][0];
pmap->red[i].co.local.green = (vga16Colors[i][1]<<8)|vga16Colors[i][1];
pmap->red[i].co.local.blue = (vga16Colors[i][2]<<8)|vga16Colors[i][2];
}
return TRUE;
}
Bool
vesaInitScreen(ScreenPtr pScreen)
{
KdScreenPriv(pScreen);
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
if (pscr->shadow)
{
switch (pscr->mapping) {
case VESA_LINEAR:
return KdShadowInitScreen (pScreen, shadowUpdatePacked, vesaWindowLinear);
case VESA_WINDOWED:
return KdShadowInitScreen (pScreen, shadowUpdatePacked, vesaWindowWindowed);
case VESA_PLANAR:
pScreen->CreateColormap = vesaCreateColormap16;
return KdShadowInitScreen (pScreen, shadowUpdatePlanar4, vesaWindowPlanar);
}
}
return TRUE;
}
Bool
vesaEnable(ScreenPtr pScreen) vesaEnable(ScreenPtr pScreen)
{ {
KdScreenPriv(pScreen); KdScreenPriv(pScreen);
VesaPrivPtr priv = pScreenPriv->card->driver; VesaCardPrivPtr priv = pScreenPriv->card->driver;
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
int code; int code;
int palette_wait = 0, palette_hi = 0; int palette_wait = 0, palette_hi = 0;
int i=0;
int size;
char *p;
code = VbeSetMode(priv->vi, priv->mode); code = VbeSetMode(priv->vi, pscr->mode->mode, pscr->mapping == VESA_LINEAR);
if(code < 0) if(code < 0)
FatalError("Couldn't set mode\n"); return FALSE;
if(priv->vib->Capabilities[0] & 1) if(priv->vib->Capabilities[0] & 1)
palette_hi = 1; palette_hi = 1;
@ -233,23 +565,85 @@ vesaEnable(ScreenPtr pScreen)
if(palette_hi || palette_wait) if(palette_hi || palette_wait)
VbeSetPaletteOptions(priv->vi, palette_hi?8:6, palette_wait); VbeSetPaletteOptions(priv->vi, palette_hi?8:6, palette_wait);
return; switch (pscr->mapping) {
case VESA_LINEAR:
memcpy (priv->text, pscr->fb, VESA_TEXT_SAVE);
break;
case VESA_WINDOWED:
while(i < VESA_TEXT_SAVE) {
p = VbeSetWindow(priv->vi, i, VBE_WINDOW_READ, &size);
if(!p) {
ErrorF("Couldn't set window for saving VGA font\n");
break;
}
if(i + size > VESA_TEXT_SAVE)
size = VESA_TEXT_SAVE - i;
memcpy(((char*)priv->text) + i, p, size);
i += size;
}
break;
case VESA_PLANAR:
p = VbeSetWindow (priv->vi, 0, VBE_WINDOW_READ, &size);
for (i = 0; i < 4; i++)
{
VbeSetReadPlaneMap (priv->vi, i);
memcpy (((char *)priv->text) + i * (VESA_TEXT_SAVE/4), p,
(VESA_TEXT_SAVE/4));
}
break;
}
return TRUE;
} }
void void
vesaDisable(ScreenPtr pScreen) vesaDisable(ScreenPtr pScreen)
{ {
KdScreenPriv(pScreen); KdScreenPriv(pScreen);
VesaPrivPtr priv = pScreenPriv->card->driver; VesaCardPrivPtr priv = pScreenPriv->card->driver;
VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
int i=0;
int size;
char *p;
switch (pscr->mapping) {
case VESA_LINEAR:
memcpy(pscr->fb, priv->text, VESA_TEXT_SAVE);
break;
case VESA_WINDOWED:
while(i < VESA_TEXT_SAVE) {
p = VbeSetWindow(priv->vi, i, VBE_WINDOW_WRITE, &size);
if(!p) {
ErrorF("Couldn't set window for restoring VGA font\n");
break;
}
if(i + size > VESA_TEXT_SAVE)
size = VESA_TEXT_SAVE - i;
memcpy(p, ((char*)priv->text) + i, size);
i += size;
}
break;
case VESA_PLANAR:
p = VbeSetWindow (priv->vi, 0, VBE_WINDOW_WRITE, &size);
for (i = 0; i < 4; i++)
{
VbeSetWritePlaneMask (priv->vi, 1 << i);
memcpy (p,
((char *)priv->text) + i * (VESA_TEXT_SAVE/4),
(VESA_TEXT_SAVE/4));
}
break;
}
} }
void void
vesaPreserve(KdCardInfo *card) vesaPreserve(KdCardInfo *card)
{ {
VesaPrivPtr priv = card->driver; VesaCardPrivPtr priv = card->driver;
int code; int code;
/* The framebuffer might not be valid at this point, so we cannot
save the VGA fonts now; we do it in vesaEnable. */
code = VbeSaveState(priv->vi); code = VbeSaveState(priv->vi);
if(code < 0) if(code < 0)
FatalError("Couldn't save state\n"); FatalError("Couldn't save state\n");
@ -260,7 +654,7 @@ vesaPreserve(KdCardInfo *card)
void void
vesaRestore(KdCardInfo *card) vesaRestore(KdCardInfo *card)
{ {
VesaPrivPtr priv = card->driver; VesaCardPrivPtr priv = card->driver;
VbeRestoreState(priv->vi); VbeRestoreState(priv->vi);
return; return;
} }
@ -268,8 +662,9 @@ vesaRestore(KdCardInfo *card)
void void
vesaCardFini(KdCardInfo *card) vesaCardFini(KdCardInfo *card)
{ {
VesaPrivPtr priv = card->driver; VesaCardPrivPtr priv = card->driver;
VbeUnmapFramebuffer(priv->vi); if (vesa_restore)
VbeSetTextMode(priv->vi,3);
VbeCleanup(priv->vi); VbeCleanup(priv->vi);
return; return;
} }
@ -277,6 +672,11 @@ vesaCardFini(KdCardInfo *card)
void void
vesaScreenFini(KdScreenInfo *screen) vesaScreenFini(KdScreenInfo *screen)
{ {
VesaScreenPrivPtr pscr = screen->driver;
VesaCardPrivPtr priv = screen->card->driver;
if (pscr->fb)
VbeUnmapFramebuffer(priv->vi, &pscr->mode->vmib, pscr->fb);
return; return;
} }
@ -284,8 +684,9 @@ void
vesaPutColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs) vesaPutColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs)
{ {
KdScreenPriv(pScreen); KdScreenPriv(pScreen);
VesaPrivPtr priv = pScreenPriv->card->driver; VesaScreenPrivPtr pscr = pScreenPriv->screen->driver;
int i, j, k; VesaCardPrivPtr priv = pScreenPriv->card->driver;
int i, j, k, start;
CARD8 scratch[4*256]; CARD8 scratch[4*256];
int red, green, blue; int red, green, blue;
@ -314,7 +715,14 @@ vesaPutColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs)
scratch[k+blue] = pdefs[i+k].blue >> 8; scratch[k+blue] = pdefs[i+k].blue >> 8;
scratch[k+3] = 0; scratch[k+3] = 0;
} }
VbeSetPalette(priv->vi, pdefs[i].pixel, j - i, scratch); start = pdefs[i].pixel;
if (pscr->mapping == VESA_PLANAR)
{
for (start = pdefs[i].pixel; start < 256; start += 16)
VbeSetPalette(priv->vi, start, j - i, scratch);
}
else
VbeSetPalette(priv->vi, start, j - i, scratch);
i = j; i = j;
} }
} }
@ -323,7 +731,7 @@ void
vesaGetColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs) vesaGetColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs)
{ {
KdScreenPriv(pScreen); KdScreenPriv(pScreen);
VesaPrivPtr priv = pScreenPriv->card->driver; VesaCardPrivPtr priv = pScreenPriv->card->driver;
int first, i, j, k; int first, i, j, k;
CARD8 scratch[4]; CARD8 scratch[4];
int red, green, blue; int red, green, blue;
@ -367,6 +775,15 @@ vesaProcessArgument (int argc, char **argv, int i)
} else if(!strcmp(argv[i], "-swaprgb")) { } else if(!strcmp(argv[i], "-swaprgb")) {
vesa_swap_rgb = TRUE; vesa_swap_rgb = TRUE;
return 1; return 1;
} else if(!strcmp(argv[i], "-shadow")) {
vesa_shadow = TRUE;
return 1;
} else if(!strcmp(argv[i], "-nolinear")) {
vesa_linear_fb = FALSE;
return 1;
} else if(!strcmp(argv[i], "-restore")) {
vesa_restore = TRUE;
return 1;
} }
return 0; return 0;

View File

@ -27,24 +27,42 @@ THE SOFTWARE.
#include <sys/vm86.h> #include <sys/vm86.h>
#include "vbe.h" #include "vbe.h"
typedef struct _VesaPriv { #define VESA_TEXT_SAVE (64*1024)
typedef struct _VesaMode {
int mode; int mode;
VbeModeInfoBlock vmib;
} VesaModeRec, *VesaModePtr;
typedef struct _VesaCardPriv {
VbeInfoPtr vi; VbeInfoPtr vi;
VbeInfoBlock *vib; VbeInfoBlock *vib;
VbeModeInfoBlock *vmib; VesaModePtr modes;
int nmode;
char text[VESA_TEXT_SAVE];
} VesaCardPrivRec, *VesaCardPrivPtr;
#define VESA_LINEAR 0
#define VESA_WINDOWED 1
#define VESA_PLANAR 2
typedef struct _VesaScreenPriv {
VesaModePtr mode;
Bool shadow;
int mapping;
void *fb; void *fb;
} VesaPrivRec, *VesaPrivPtr; } VesaScreenPrivRec, *VesaScreenPrivPtr;
extern int vesa_video_mode; extern int vesa_video_mode;
extern Bool vesa_force_mode; extern Bool vesa_force_mode;
Bool vesaListModes(void); Bool vesaListModes(void);
Bool vesaInitialize(KdCardInfo *card, VesaPrivPtr priv); Bool vesaInitialize(KdCardInfo *card, VesaCardPrivPtr priv);
Bool vesaCardInit(KdCardInfo *card); Bool vesaCardInit(KdCardInfo *card);
Bool vesaInitialize (KdCardInfo *card, VesaPrivPtr priv); Bool vesaInitialize (KdCardInfo *card, VesaCardPrivPtr priv);
Bool vesaScreenInitialize (KdScreenInfo *screen, VesaScreenPrivPtr pscr);
Bool vesaScreenInit(KdScreenInfo *screen); Bool vesaScreenInit(KdScreenInfo *screen);
Bool vesaInitScreen(ScreenPtr pScreen); Bool vesaInitScreen(ScreenPtr pScreen);
void vesaEnable(ScreenPtr pScreen); Bool vesaEnable(ScreenPtr pScreen);
void vesaDisable(ScreenPtr pScreen); void vesaDisable(ScreenPtr pScreen);
void vesaPreserve(KdCardInfo *card); void vesaPreserve(KdCardInfo *card);
void vesaRestore(KdCardInfo *card); void vesaRestore(KdCardInfo *card);