On Mon, Sep 03, 2012 at 06:12:34PM +0200, Christian Gmeiner wrote: > 2012/9/3 Kevin O'Connor <[email protected]>: > > On Sat, Sep 01, 2012 at 05:12:59PM +0200, Christian Gmeiner wrote: > >> With the current code the following happens: > >> > >> VBE mode info request: 4101 > >> VBE mode 4101 not found > >> get_mode failed. > >> > >> Looking at the provided mode (cx register) only bits 8-0 > >> define the video mode number. I am not sure if the current > >> code ever worked. > >> > >> Signed-off-by: Christian Gmeiner <[email protected]> > >> --- > >> vgasrc/vbe.c | 17 ++++++++++++++++- > >> 1 file changed, 16 insertions(+), 1 deletion(-) > >> > >> diff --git a/vgasrc/vbe.c b/vgasrc/vbe.c > >> index 227a244..af72324 100644 > >> --- a/vgasrc/vbe.c > >> +++ b/vgasrc/vbe.c > >> @@ -72,9 +72,24 @@ vbe_104f01(struct bregs *regs) > >> struct vbe_mode_info *info = (void*)(regs->di+0); > >> u16 mode = regs->cx; > >> > >> + /* > >> + * Bitfields for VESA/VBE video mode number: > >> + * > >> + * Bit(s) Description (Table 04082) > >> + * 15 preserve display memory on mode change > >> + * 14 (VBE v2.0+) use linear (flat) frame buffer > >> + * 13 (VBE/AF 1.0P) VBE/AF initializes accelerator hardware > >> + * 12 reserved for VBE/AF > >> + * 11 (VBE v3.0) user user-specified CRTC refresh rate values > >> + * 10-9 reserved for future expansion > >> + * 8-0 video mode number (0xxh are non-VESA modes, 1xxh are > >> VESA-defined) > >> + * > >> + * see http://www.ctyme.com/intr/rb-0274.htm > >> + */ > > > > This is true for the call to set mode (vbe_104f02), but the spec does > > not say this for the get mode info call (104f01). It would be odd to > > pass in these additional bits when the caller just wants to get info > > on the given mode. > > But if I want more information's about mode 0x101 with linear > framebuffer support - thats > the only way to get it. Also this is triggered by src/bootsplash.c so > it seems to be a valid > use-case.
Okay - looking at this closer. It looks to me that what bootsplash is doing is wrong. However, it also looks like real vgabios will ignore the bits. So, I propose changing both bootsplash and the vbe code. Thanks. -Kevin >From c8a3d3ee0194f0bb76e7ec8eeb59d7b986c24016 Mon Sep 17 00:00:00 2001 From: Kevin O'Connor <[email protected]> Date: Mon, 3 Sep 2012 13:52:50 -0400 Subject: [PATCH 1/2] bootsplash: Don't pass mode flags to VBE get_mode_info call. To: [email protected] The spec doesn't specify one can pass flags into the get_mode_info call, so don't do that. Also, use the VBE_MODE_LINEAR_FRAME_BUFFER name where appropriate. Signed-off-by: Kevin O'Connor <[email protected]> --- src/bootsplash.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/bootsplash.c b/src/bootsplash.c index a85e2b2..78023a5 100644 --- a/src/bootsplash.c +++ b/src/bootsplash.c @@ -11,7 +11,8 @@ #include "util.h" // dprintf #include "jpeg.h" // splash #include "vbe.h" // struct vbe_info -#include "bmp.h" +#include "bmp.h" // bmp_alloc + /**************************************************************** * Helper functions @@ -63,7 +64,7 @@ find_videomode(struct vbe_info *vesa_info, struct vbe_mode_info *mode_info struct bregs br; memset(&br, 0, sizeof(br)); br.ax = 0x4f01; - br.cx = (1 << 14) | videomode; + br.cx = videomode; br.di = FLATPTR_TO_OFFSET(mode_info); br.es = FLATPTR_TO_SEG(mode_info); call16_int10(&br); @@ -216,7 +217,7 @@ enable_bootsplash(void) dprintf(5, "Switching to graphics mode\n"); memset(&br, 0, sizeof(br)); br.ax = 0x4f02; - br.bx = (1 << 14) | videomode; + br.bx = videomode | VBE_MODE_LINEAR_FRAME_BUFFER; call16_int10(&br); if (br.ax != 0x4f) { dprintf(1, "set_mode failed.\n"); -- 1.7.11.4 >From ef4f9e183751df5ccd32eb5dda2ce6816b53695f Mon Sep 17 00:00:00 2001 From: Kevin O'Connor <[email protected]> Date: Mon, 3 Sep 2012 13:54:28 -0400 Subject: [PATCH 2/2] vgabios: Ignore mode flags in vbe get_mode_info call. To: [email protected] Ignore any mode flags a caller may have set on the vbe get_mode_info call. The spec doesn't require ignoring of flags, but it appears at least some real-world vgabios vbe implementations do this. Signed-off-by: Kevin O'Connor <[email protected]> --- vgasrc/vbe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vgasrc/vbe.c b/vgasrc/vbe.c index 227a244..01c8071 100644 --- a/vgasrc/vbe.c +++ b/vgasrc/vbe.c @@ -74,7 +74,7 @@ vbe_104f01(struct bregs *regs) dprintf(1, "VBE mode info request: %x\n", mode); - struct vgamode_s *vmode_g = vgahw_find_mode(mode); + struct vgamode_s *vmode_g = vgahw_find_mode(mode & ~MF_VBEFLAGS); if (! vmode_g) { dprintf(1, "VBE mode %x not found\n", mode); regs->ax = 0x014f; -- 1.7.11.4 _______________________________________________ SeaBIOS mailing list [email protected] http://www.seabios.org/mailman/listinfo/seabios
