x86, setup: Don't skip mode setting for the standard VGA modes
authorH. Peter Anvin <hpa@zytor.com>
Fri, 19 Feb 2010 21:21:38 +0000 (13:21 -0800)
committerH. Peter Anvin <hpa@zytor.com>
Fri, 19 Feb 2010 21:21:38 +0000 (13:21 -0800)
The code for setting standard VGA modes probes for the current mode,
and skips the mode setting if the mode is 3 (color text 80x25) or 7
(mono text 80x25).  Unfortunately, there are BIOSes, including the
VMware BIOS, which report the previous mode if function 0F is queried
while the screen is in a VESA mode, and of course, nothing can help a
mode poked directly into the hardware.

As such, the safe option is to set the mode anyway, and only query to
see if we should be using mode 7 rather than mode 3.  People who don't
want any mode setting at all should probably use vga=0x0f04
(VIDEO_CURRENT_MODE).  It's possible that should be the kernel
default.

Reported-by Rene Arends <R.R.Arends@hro.nl>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
LKML-Reference: <tip-*@git.kernel.org>

arch/x86/boot/video-vga.c

index 819caa1f200879887c3726de406cbf664a771960..ed7aeff786b277d01b281a47c418eb5c988ea249 100644 (file)
@@ -42,22 +42,15 @@ static u8 vga_set_basic_mode(void)
 {
        struct biosregs ireg, oreg;
        u16 ax;
-       u8 rows;
        u8 mode;
 
        initregs(&ireg);
 
+       /* Query current mode */
        ax = 0x0f00;
        intcall(0x10, &ireg, &oreg);
        mode = oreg.al;
 
-       set_fs(0);
-       rows = rdfs8(0x484);    /* rows minus one */
-
-       if ((oreg.ax == 0x5003 || oreg.ax == 0x5007) &&
-           (rows == 0 || rows == 24))
-               return mode;
-
        if (mode != 3 && mode != 7)
                mode = 3;