diff options
Diffstat (limited to 'trunk/2.6.22/20023_70-edid.patch1')
-rw-r--r-- | trunk/2.6.22/20023_70-edid.patch1 | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/trunk/2.6.22/20023_70-edid.patch1 b/trunk/2.6.22/20023_70-edid.patch1 new file mode 100644 index 0000000..cdec9d8 --- /dev/null +++ b/trunk/2.6.22/20023_70-edid.patch1 @@ -0,0 +1,118 @@ +# HG changeset 70 patch +# User kfraser@localhost.localdomain +# Date 1182364134 -3600 +# Node ID db1ad4e3caf50efd45726d4b6e483869e20a8e51 +# Parent 9f2badfda534e764a5c14291909595bbb8af2ee5 +Subject: linux/x86: Obtain EDID info from Xen +Signed-off-by: Jan Beulich <jbeulich@novell.com> +Signed-off-by: Keir Fraser <keir@xensource.com> + +--- + arch/i386/kernel/setup-xen.c | 5 ++++- + arch/x86_64/kernel/setup-xen.c | 2 +- + drivers/xen/core/firmware.c | 19 +++++++++++++++++++ + include/xen/firmware.h | 2 ++ + include/xen/interface/platform.h | 12 ++++++++++-- + 5 files changed, 36 insertions(+), 4 deletions(-) + +--- a/arch/i386/kernel/setup-xen.c 2007-08-27 14:01:25.000000000 -0400 ++++ b/arch/i386/kernel/setup-xen.c 2007-08-27 14:02:03.000000000 -0400 +@@ -156,6 +156,9 @@ struct sys_desc_table_struct { + }; + struct edid_info edid_info; + EXPORT_SYMBOL_GPL(edid_info); ++#ifndef CONFIG_XEN ++#define copy_edid() (edid_info = EDID_INFO) ++#endif + struct ist_info ist_info; + #if defined(CONFIG_X86_SPEEDSTEP_SMI) || \ + defined(CONFIG_X86_SPEEDSTEP_SMI_MODULE) +@@ -1623,7 +1626,7 @@ void __init setup_arch(char **cmdline_p) + ROOT_DEV = MKDEV(UNNAMED_MAJOR,0); + drive_info = DRIVE_INFO; + screen_info = SCREEN_INFO; +- edid_info = EDID_INFO; ++ copy_edid(); + apm_info.bios = APM_BIOS_INFO; + ist_info = IST_INFO; + saved_videomode = VIDEO_MODE; +--- a/arch/x86_64/kernel/setup-xen.c 2007-08-27 14:01:25.000000000 -0400 ++++ b/arch/x86_64/kernel/setup-xen.c 2007-08-27 14:02:03.000000000 -0400 +@@ -616,7 +616,7 @@ void __init setup_arch(char **cmdline_p) + } else + screen_info.orig_video_isVGA = 0; + +- edid_info = EDID_INFO; ++ copy_edid(); + saved_video_mode = SAVED_VIDEO_MODE; + bootloader_type = LOADER_TYPE; + +--- a/drivers/xen/core/firmware.c 2007-08-27 14:01:25.000000000 -0400 ++++ b/drivers/xen/core/firmware.c 2007-08-27 14:01:25.000000000 -0400 +@@ -2,6 +2,7 @@ + #include <linux/errno.h> + #include <linux/init.h> + #include <linux/edd.h> ++#include <video/edid.h> + #include <xen/interface/platform.h> + #include <asm/hypervisor.h> + +@@ -53,3 +54,21 @@ void __init copy_edd(void) + } + } + #endif ++ ++void __init copy_edid(void) ++{ ++#if defined(CONFIG_FIRMWARE_EDID) && defined(CONFIG_X86) ++ struct xen_platform_op op; ++ ++ if (!is_initial_xendomain()) ++ return; ++ ++ op.cmd = XENPF_firmware_info; ++ op.u.firmware_info.index = 0; ++ op.u.firmware_info.type = XEN_FW_VBEDDC_INFO; ++ set_xen_guest_handle(op.u.firmware_info.u.vbeddc_info.edid, ++ edid_info.dummy); ++ if (HYPERVISOR_platform_op(&op) != 0) ++ memset(edid_info.dummy, 0x13, sizeof(edid_info.dummy)); ++#endif ++} +--- a/include/xen/firmware.h 2007-08-27 14:01:25.000000000 -0400 ++++ b/include/xen/firmware.h 2007-08-27 14:01:25.000000000 -0400 +@@ -5,4 +5,6 @@ + void copy_edd(void); + #endif + ++void copy_edid(void); ++ + #endif /* __XEN_FIRMWARE_H__ */ +--- a/include/xen/interface/platform.h 2007-08-27 14:01:25.000000000 -0400 ++++ b/include/xen/interface/platform.h 2007-08-27 14:01:25.000000000 -0400 +@@ -115,8 +115,9 @@ typedef struct xenpf_platform_quirk xenp + DEFINE_XEN_GUEST_HANDLE(xenpf_platform_quirk_t); + + #define XENPF_firmware_info 50 +-#define XEN_FW_DISK_INFO 1 +-#define XEN_FW_DISK_MBR_SIGNATURE 2 ++#define XEN_FW_DISK_INFO 1 /* from int 13 AH=08/41/48 */ ++#define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */ ++#define XEN_FW_VBEDDC_INFO 3 /* from int 10 AX=4f15 */ + struct xenpf_firmware_info { + /* IN variables. */ + uint32_t type; +@@ -140,6 +141,13 @@ struct xenpf_firmware_info { + uint8_t device; /* bios device number */ + uint32_t mbr_signature; /* offset 0x1b8 in mbr */ + } disk_mbr_signature; /* XEN_FW_DISK_MBR_SIGNATURE */ ++ struct { ++ /* Int10, AX=4F15: Get EDID info. */ ++ uint8_t capabilities; ++ uint8_t edid_transfer_time; ++ /* must refer to 128-byte buffer */ ++ XEN_GUEST_HANDLE(uint8_t) edid; ++ } vbeddc_info; /* XEN_FW_VBEDDC_INFO */ + } u; + }; + typedef struct xenpf_firmware_info xenpf_firmware_info_t; |