From f15f881727cee9a879bd43be8dc849320f8d3cbd Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 26 Jul 2004 17:14:27 +0000 Subject: [PATCH] Eliminate bogus rate check in fbdevModeSupported. Hmm. Potentially bogus rate selection necessary for Mac fbdev Don't know about fb changes to pixmaps, so can't track dirt. Add Mac specific 1280x854 mode. Warn when requested mode isn't found. Add ability to soft-boot video cards. Add region expand request. FIXME: need test cases --- hw/kdrive/fbdev/fbdev.c | 6 +----- hw/kdrive/src/kaa.c | 2 ++ hw/kdrive/src/kmode.c | 9 ++++++++- hw/kdrive/vesa/vbe.c | 28 ++++++++++++++++++++++++++++ hw/kdrive/vesa/vbe.h | 6 ++++++ hw/kdrive/vesa/vesa.c | 8 ++++++++ hw/kdrive/vesa/vm86.c | 37 ++++++++++++++++++++++++++++++++++++- hw/kdrive/vesa/vm86.h | 3 +++ 8 files changed, 92 insertions(+), 7 deletions(-) diff --git a/hw/kdrive/fbdev/fbdev.c b/hw/kdrive/fbdev/fbdev.c index 599aff104..aaf121f15 100644 --- a/hw/kdrive/fbdev/fbdev.c +++ b/hw/kdrive/fbdev/fbdev.c @@ -115,10 +115,6 @@ static Bool fbdevModeSupported (KdScreenInfo *screen, const KdMonitorTiming *t) { - /* XXX: Remove this */ - if (t->rate > 75) - return FALSE; - return TRUE; } @@ -172,7 +168,7 @@ fbdevScreenInitialize (KdScreenInfo *screen, FbdevScrPriv *scrpriv) screen->width = 1024; screen->height = 768; } - screen->rate = 75; + screen->rate = 103; /* FIXME: should get proper value from fb driver */ } if (!screen->fb[0].depth) screen->fb[0].depth = 16; diff --git a/hw/kdrive/src/kaa.c b/hw/kdrive/src/kaa.c index 0555f0307..ea2e5c738 100644 --- a/hw/kdrive/src/kaa.c +++ b/hw/kdrive/src/kaa.c @@ -100,8 +100,10 @@ kaaPixmapSave (ScreenPtr pScreen, KdOffscreenArea *area) pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER; pKaaPixmap->area = NULL; +#if 0 if (!pKaaPixmap->dirty) return; +#endif KdCheckSync (pPixmap->drawable.pScreen); diff --git a/hw/kdrive/src/kmode.c b/hw/kdrive/src/kmode.c index 7b3c43457..e79f5ff62 100644 --- a/hw/kdrive/src/kmode.c +++ b/hw/kdrive/src/kmode.c @@ -146,7 +146,13 @@ const KdMonitorTiming kdMonitorTimings[] = { 32, 208, 384, KdSyncPositive, /* 61.849 */ 1, 32, 38, KdSyncPositive, /* 65.937 */ }, - + + /* 1280x854 modes */ + { 1280, 854, 103, 12500, /* ADDED */ + 56, 16, 128, KdSyncPositive, /* 102.554 */ + 1, 216, 12, KdSyncPositive, + }, + /* 1280x960 modes */ { 1280, 960, 85, 148500, /* VESA */ 64, 224, 448, KdSyncPositive, /* 85.938 */ @@ -263,6 +269,7 @@ KdFindMode (KdScreenInfo *screen, return t; } } + ErrorF("Warning: mode not found, using default\n"); return &kdMonitorTimings[MONITOR_TIMING_DEFAULT]; } diff --git a/hw/kdrive/vesa/vbe.c b/hw/kdrive/vesa/vbe.c index 4bcedf08d..7fc891a09 100644 --- a/hw/kdrive/vesa/vbe.c +++ b/hw/kdrive/vesa/vbe.c @@ -638,6 +638,20 @@ VbeDPMS(Vm86InfoPtr vi, int mode) return TRUE; } +Bool +VbeBoot(Vm86InfoPtr vi) +{ + int code; + int bus = 1; + int device = 0; + int function = 0; + + vi->vms.regs.eax = (bus << 8) | (device << 3) | (function & 0x7); + code = VbeDoInterruptE6 (vi); + ErrorF ("Boot: %d\n", code); + return TRUE; +} + int VbeDoInterrupt10(Vm86InfoPtr vi) { @@ -677,3 +691,17 @@ VbeDoInterrupt10(Vm86InfoPtr vi) } return code; } + +int +VbeDoInterruptE6(Vm86InfoPtr vi) +{ + int code; + int oldax; + + oldax = vi->vms.regs.eax & 0xffff; + + code = Vm86DoPOST (vi); + ErrorF("POST (0x%04X): 0x%04X\n", + oldax, vi->vms.regs.eax & 0xffff); + return code; +} diff --git a/hw/kdrive/vesa/vbe.h b/hw/kdrive/vesa/vbe.h index 8aa3276d8..5d0ff5142 100644 --- a/hw/kdrive/vesa/vbe.h +++ b/hw/kdrive/vesa/vbe.h @@ -157,4 +157,10 @@ VbeDPMS(Vm86InfoPtr vi, int mode); int VbeDoInterrupt10(Vm86InfoPtr vi); +Bool +VbeBoot(Vm86InfoPtr vi); + +int +VbeDoInterruptE6(Vm86InfoPtr vi); + #endif diff --git a/hw/kdrive/vesa/vesa.c b/hw/kdrive/vesa/vesa.c index 004f35981..bcc871907 100644 --- a/hw/kdrive/vesa/vesa.c +++ b/hw/kdrive/vesa/vesa.c @@ -41,6 +41,7 @@ Bool vesa_verbose = FALSE; Bool vesa_force_text = FALSE; Bool vesa_restore_font = TRUE; Bool vesa_map_holes = TRUE; +Bool vesa_boot = FALSE; #define VesaPriv(scr) ((VesaScreenPrivPtr) (scr)->driver) @@ -216,6 +217,9 @@ vesaInitialize (KdCardInfo *card, VesaCardPrivPtr priv) if(!priv->vi) goto fail; + if (vesa_boot) + VbeBoot (priv->vi); + priv->modes = vesaGetModes (priv->vi, &priv->nmode); if (!priv->modes) @@ -1756,6 +1760,7 @@ vesaUseMsg (void) ErrorF("-map-holes Use contiguous memory map (For seg fault with rare BIOS)\n"); ErrorF("-verbose Emit diagnostic messages during BIOS initialization\n"); ErrorF("-force-text Always use standard 25x80 text mode on server exit or VT switch\n"); + ErrorF("-boot Soft boot video card\n"); /* XXX: usage for -vesatest, -no-map-holes (don't need?), * XXX: and -trash-font. Also in man page. */ } @@ -1802,6 +1807,9 @@ vesaProcessArgument (int argc, char **argv, int i) } else if(!strcmp(argv[i], "-trash-font")) { vesa_restore_font = FALSE; return 1; + } else if(!strcmp(argv[i], "-boot")) { + vesa_boot = TRUE; + return 1; } return 0; diff --git a/hw/kdrive/vesa/vm86.c b/hw/kdrive/vesa/vm86.c index d5289983b..9d1fa8bcf 100644 --- a/hw/kdrive/vesa/vm86.c +++ b/hw/kdrive/vesa/vm86.c @@ -219,7 +219,8 @@ Vm86DoInterrupt(Vm86InfoPtr vi, int num) off = MMW(vi,num * 4); if(MAKE_POINTER(seg, off) < ROM_BASE || MAKE_POINTER(seg, off) >= ROM_BASE + ROM_SIZE) { - ErrorF("Interrupt pointer doesn't point at ROM\n"); + ErrorF("Interrupt pointer (seg %x off %x) doesn't point at ROM\n", + seg, off); return -1; } memcpy(&(LM(vi,vi->ret_code)), retcode_data, sizeof(retcode_data)); @@ -244,6 +245,40 @@ Vm86DoInterrupt(Vm86InfoPtr vi, int num) return 0; } +int +Vm86DoPOST(Vm86InfoPtr vi) +{ + U16 seg, off; + int code; + + seg = 0xC000; + off = 3; + if(MAKE_POINTER(seg, off) < ROM_BASE || + MAKE_POINTER(seg, off) >= ROM_BASE + ROM_SIZE) { + ErrorF("BIOS pointer (seg %x off %x) doesn't point at ROM\n", + seg, off); + return -1; + } + memcpy(&(LM(vi,vi->ret_code)), retcode_data, sizeof(retcode_data)); + vi->vms.regs.ss = POINTER_SEGMENT(vi->stack_base); + vi->vms.regs.esp = STACK_SIZE; + PUSHW(vi, POINTER_SEGMENT(vi->ret_code)); + PUSHW(vi, POINTER_OFFSET(vi->ret_code)); + vi->vms.regs.cs = seg; + vi->vms.regs.eip = off; + OsBlockSignals (); + code = vm86_loop(vi); + OsReleaseSignals (); + if(code < 0) { + ErrorF("vm86 failed (errno %d)\n", errno); + return -1; + } else if(code != 0) { + ErrorF("vm86 returned 0x%04X\n", code); + return -1; + } else + return 0; +} + #define DEBUG_VBE 0 #if DEBUG_VBE #define DBG(x) ErrorF x; usleep(10*1000) diff --git a/hw/kdrive/vesa/vm86.h b/hw/kdrive/vesa/vm86.h index dce777b39..bd1ad43c0 100644 --- a/hw/kdrive/vesa/vm86.h +++ b/hw/kdrive/vesa/vm86.h @@ -136,6 +136,9 @@ Vm86Cleanup(Vm86InfoPtr vi); int Vm86DoInterrupt(Vm86InfoPtr vi, int num); +int +Vm86DoPOST(Vm86InfoPtr vi); + int Vm86IsMemory(Vm86InfoPtr vi, U32 i);