[PATCH] fbdev: Firmware EDID fixes
authorAntonino A. Daplas <adaplas@gmail.com>
Mon, 26 Jun 2006 07:26:37 +0000 (00:26 -0700)
committerLinus Torvalds <torvalds@g5.osdl.org>
Mon, 26 Jun 2006 16:58:30 +0000 (09:58 -0700)
- make firmware edid independent from framebuffer (No need to choose
  framebuffer just to disable this option

- enable this option in X86_64

- check if VBE/DDC function is implemented before calling actual function

Signed-off-by: Antonino Daplas <adaplas@pol.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/i386/boot/video.S
arch/x86_64/boot/video.S
arch/x86_64/kernel/setup.c
drivers/video/Kconfig
drivers/video/fbmon.c

index c9343c3a8082c4d1d2e8fe906c1a757e7fd918d4..8c2a6faeeae51b128e27b43e4669a7ac75dcf792 100644 (file)
@@ -1929,7 +1929,7 @@ skip10:   movb    %ah, %al
        ret
 
 store_edid:
-#ifdef CONFIG_FB_FIRMWARE_EDID
+#ifdef CONFIG_FIRMWARE_EDID
        pushw   %es                             # just save all registers
        pushw   %ax
        pushw   %bx
@@ -1947,6 +1947,22 @@ store_edid:
        rep
        stosl
 
+       pushw   %es                             # save ES
+       xorw    %di, %di                        # Report Capability
+       pushw   %di
+       popw    %es                             # ES:DI must be 0:0
+       movw    $0x4f15, %ax
+       xorw    %bx, %bx
+       xorw    %cx, %cx
+       int     $0x10
+       popw    %es                             # restore ES
+
+       cmpb    $0x00, %ah                      # call successful
+       jne     no_edid
+
+       cmpb    $0x4f, %al                      # function supported
+       jne     no_edid
+
        movw    $0x4f15, %ax                    # do VBE/DDC
        movw    $0x01, %bx
        movw    $0x00, %cx
@@ -1954,6 +1970,7 @@ store_edid:
        movw    $0x140, %di
        int     $0x10
 
+no_edid:
        popw    %di                             # restore all registers
        popw    %dx
        popw    %cx
index 32327bb37aff863323e0602a1d070cd6be0435f2..2aa565c136e5acff6dfc6e9beec303fc6cac9d9e 100644 (file)
@@ -1929,6 +1929,7 @@ skip10:   movb    %ah, %al
        ret
 
 store_edid:
+#ifdef CONFIG_FIRMWARE_EDID
        pushw   %es                             # just save all registers
        pushw   %ax
        pushw   %bx
@@ -1946,6 +1947,22 @@ store_edid:
        rep
        stosl
 
+       pushw   %es                             # save ES
+       xorw    %di, %di                        # Report Capability
+       pushw   %di
+       popw    %es                             # ES:DI must be 0:0
+       movw    $0x4f15, %ax
+       xorw    %bx, %bx
+       xorw    %cx, %cx
+       int     $0x10
+       popw    %es                             # restore ES
+
+       cmpb    $0x00, %ah                      # call successful
+       jne     no_edid
+
+       cmpb    $0x4f, %al                      # function supported
+       jne     no_edid
+
        movw    $0x4f15, %ax                    # do VBE/DDC
        movw    $0x01, %bx
        movw    $0x00, %cx
@@ -1953,12 +1970,14 @@ store_edid:
        movw    $0x140, %di
        int     $0x10
 
+no_edid:
        popw    %di                             # restore all registers
        popw    %dx
        popw    %cx
        popw    %bx
        popw    %ax
        popw    %es
+#endif
        ret
 
 # VIDEO_SELECT-only variables
index fb850b52b4da73a625e59940eb07681468c039c3..143c65031539825b70f14a68370312ebddf5f9ea 100644 (file)
@@ -109,6 +109,7 @@ struct sys_desc_table_struct {
 };
 
 struct edid_info edid_info;
+EXPORT_SYMBOL_GPL(edid_info);
 struct e820map e820;
 
 extern int root_mountflags;
index 90cd5587d4e3aea5dc63fff5ebff12b41dd8592f..2a265e1c7cbcf7b41a8f4e658c161616209a8668 100644 (file)
@@ -4,6 +4,21 @@
 
 menu "Graphics support"
 
+config FIRMWARE_EDID
+       bool "Enable firmware EDID"
+       default y
+       ---help---
+         This enables access to the EDID transferred from the firmware.
+        On the i386, this is from the Video BIOS. Enable this if DDC/I2C
+        transfers do not work for your driver and if you are using
+        nvidiafb, i810fb or savagefb.
+
+        In general, choosing Y for this option is safe.  If you
+        experience extremely long delays while booting before you get
+        something on your display, try setting this to N.  Matrox cards in
+        combination with certain motherboards and monitors are known to
+        suffer from this problem.
+
 config FB
        tristate "Support for frame buffer devices"
        ---help---
@@ -70,22 +85,6 @@ config FB_MACMODES
        depends on FB
        default n
 
-config FB_FIRMWARE_EDID
-       bool "Enable firmware EDID"
-       depends on FB
-       default y
-       ---help---
-         This enables access to the EDID transferred from the firmware.
-        On the i386, this is from the Video BIOS. Enable this if DDC/I2C
-        transfers do not work for your driver and if you are using
-        nvidiafb, i810fb or savagefb.
-
-        In general, choosing Y for this option is safe.  If you
-        experience extremely long delays while booting before you get
-        something on your display, try setting this to N.  Matrox cards in
-        combination with certain motherboards and monitors are known to
-        suffer from this problem.
-
 config FB_BACKLIGHT
        bool
        depends on FB
index 87b0224d234731a529dc51690431f1ec63dcdabf..3ccfff715a5147c18b266b512c9bfbd4342efe96 100644 (file)
@@ -1301,7 +1301,7 @@ int fb_validate_mode(const struct fb_var_screeninfo *var, struct fb_info *info)
                -EINVAL : 0;
 }
 
-#if defined(CONFIG_FB_FIRMWARE_EDID) && defined(__i386__)
+#if defined(CONFIG_FIRMWARE_EDID) && defined(CONFIG_X86)
 
 /*
  * We need to ensure that the EDID block is only returned for