From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Jan Beulich" Subject: [PATCH] linux/x86: Obtain EDD info from Xen Date: Tue, 19 Jun 2007 11:43:13 +0100 Message-ID: <4677CF61.76E4.0078.0@novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Return-path: Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org Subject: Obtain EDD info from Xen Taken from our 2.6.22-rc4 tree and made apply - without further testing. The patch contains the necessary adjustment to the public headers - if that's being pushed to the linux tree automatically, the respective hunk must be removed before applying. Signed-off-by: Jan Beulich Index: head-2007-05-31/arch/i386/kernel/setup-xen.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- head-2007-05-31.orig/arch/i386/kernel/setup-xen.c 2007-06-04 = 14:09:07.000000000 +0200 +++ head-2007-05-31/arch/i386/kernel/setup-xen.c 2007-06-01 = 16:59:22.000000000 +0200 @@ -66,6 +66,7 @@ #include #include #include +#include #include #include #include @@ -170,6 +171,7 @@ struct edd edd; #ifdef CONFIG_EDD_MODULE EXPORT_SYMBOL(edd); #endif +#ifndef CONFIG_XEN /** * copy_edd() - Copy the BIOS EDD information * from boot_params into a safe place. @@ -182,6 +184,7 @@ static inline void copy_edd(void) edd.mbr_signature_nr =3D EDD_MBR_SIG_NR; edd.edd_info_nr =3D EDD_NR; } +#endif #else static inline void copy_edd(void) { Index: head-2007-05-31/arch/x86_64/kernel/setup-xen.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- head-2007-05-31.orig/arch/x86_64/kernel/setup-xen.c 2007-06-04 = 14:09:07.000000000 +0200 +++ head-2007-05-31/arch/x86_64/kernel/setup-xen.c 2007-06-01 = 16:59:22.000000000 +0200 @@ -71,6 +71,7 @@ #include #include #include +#include #include #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) #define PFN_PHYS(x) ((x) << PAGE_SHIFT) @@ -225,6 +226,7 @@ struct edd edd; #ifdef CONFIG_EDD_MODULE EXPORT_SYMBOL(edd); #endif +#ifndef CONFIG_XEN /** * copy_edd() - Copy the BIOS EDD information * from boot_params into a safe place. @@ -237,6 +239,7 @@ static inline void copy_edd(void) edd.mbr_signature_nr =3D EDD_MBR_SIG_NR; edd.edd_info_nr =3D EDD_NR; } +#endif #else static inline void copy_edd(void) { Index: head-2007-05-31/drivers/firmware/Kconfig =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- head-2007-05-31.orig/drivers/firmware/Kconfig 2007-06-04 = 14:09:07.000000000 +0200 +++ head-2007-05-31/drivers/firmware/Kconfig 2007-06-01 16:59:22.0000000= 00 +0200 @@ -8,7 +8,6 @@ menu "Firmware Drivers" config EDD tristate "BIOS Enhanced Disk Drive calls determine boot disk" depends on !IA64 - depends on !XEN help Say Y or M here if you want to enable BIOS Enhanced Disk Drive Services real mode BIOS calls to determine which disk Index: head-2007-05-31/drivers/xen/core/Makefile =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- head-2007-05-31.orig/drivers/xen/core/Makefile 2007-06-04 = 14:09:07.000000000 +0200 +++ head-2007-05-31/drivers/xen/core/Makefile 2007-06-04 14:09:17.0000000= 00 +0200 @@ -2,7 +2,7 @@ # Makefile for the linux kernel. # =20 -obj-y :=3D evtchn.o gnttab.o features.o reboot.o machine_reboot.o +obj-y :=3D evtchn.o gnttab.o features.o reboot.o machine_reboot.o = firmware.o =20 obj-$(CONFIG_PROC_FS) +=3D xen_proc.o obj-$(CONFIG_SYSFS) +=3D hypervisor_sysfs.o Index: head-2007-05-31/drivers/xen/core/firmware.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ head-2007-05-31/drivers/xen/core/firmware.c 2007-06-01 16:59:22.0000000= 00 +0200 @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include + +#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE) +void __init copy_edd(void) +{ + int ret; + xen_platform_op_t op; + + if (!is_initial_xendomain()) + return; + + op.cmd =3D XENPF_firmware_info; + + for (op.u.firmware_info.index =3D 0, ret =3D 0; + ret !=3D -ESRCH && ret !=3D -ENOSYS && edd.edd_info_nr < = EDDMAXNR; + ++op.u.firmware_info.index) { + struct edd_info *info =3D edd.edd_info + edd.edd_info_nr; + + op.u.firmware_info.type =3D XEN_FW_EDD_INFO; + ret =3D HYPERVISOR_platform_op(&op); + if (ret) + continue; + info->device =3D op.u.firmware_info.u.edd_info.d= evice; + info->version =3D op.u.firmware_info.u.edd_info.v= ersion; + info->interface_support =3D op.u.firmware_info.u.edd_info.i= nterface; + + op.u.firmware_info.type =3D XEN_FW_DISK_INFO; + ret =3D HYPERVISOR_platform_op(&op); + if (ret) + continue; + info->legacy_max_cylinder =3D op.u.firmware_info.u.dis= k_info.max_cylinder; + info->legacy_max_head =3D op.u.firmware_info.u.dis= k_info.max_head; + info->legacy_sectors_per_track =3D op.u.firmware_info.u.dis= k_info.sectors_per_track; + + op.u.firmware_info.type =3D XEN_FW_EDD_PARAMS; + info->params.length =3D sizeof(info->params); + set_xen_guest_handle(op.u.firmware_info.u.edd_params, = &info->params); + ret =3D HYPERVISOR_platform_op(&op); + if (ret) + continue; + + ++edd.edd_info_nr; + } + + op.u.firmware_info.type =3D XEN_FW_MBR_SIGNATURE; + for (op.u.firmware_info.index =3D 0, ret =3D 0; + ret !=3D -ESRCH && ret !=3D -ENOSYS && edd.mbr_signature_nr < = EDD_MBR_SIG_MAX; + ++op.u.firmware_info.index) { + + ret =3D HYPERVISOR_platform_op(&op); + if (ret) + continue; + edd.mbr_signature[edd.mbr_signature_nr++] =3D op.u.firmware= _info.u.mbr_signature; + } +} +#endif Index: head-2007-05-31/include/xen/firmware.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ head-2007-05-31/include/xen/firmware.h 2007-06-01 16:59:22.0000000= 00 +0200 @@ -0,0 +1,6 @@ +#ifndef __XEN_FIRMWARE_H__ +#define __XEN_FIRMWARE_H__ + +void copy_edd(void); + +#endif /* __XEN_FIRMWARE_H__ */ Index: head-2007-05-31/include/xen/interface/platform.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- head-2007-05-31.orig/include/xen/interface/platform.h 2007-06-04 = 14:09:07.000000000 +0200 +++ head-2007-05-31/include/xen/interface/platform.h 2007-06-01 = 16:59:22.000000000 +0200 @@ -114,6 +114,35 @@ struct xenpf_platform_quirk { typedef struct xenpf_platform_quirk xenpf_platform_quirk_t; DEFINE_XEN_GUEST_HANDLE(xenpf_platform_quirk_t); =20 +#define XENPF_firmware_info 50 +#define XEN_FW_DISK_INFO 1 /* from int 13 AH=3D08 */ +#define XEN_FW_EDD_INFO 2 /* from int 13 AH=3D41 */ +#define XEN_FW_EDD_PARAMS 3 /* from int 13 AH=3D48 */ +#define XEN_FW_MBR_SIGNATURE 4 +struct xenpf_firmware_info { + /* IN variables. */ + uint32_t type; + uint32_t index; + /* OUT variables. */ + union { + struct { + uint16_t max_cylinder; + uint8_t max_head; + uint8_t sectors_per_track; + } disk_info; + struct { + uint8_t device; + uint8_t version; + uint16_t interface; + } edd_info; + /* first uint16_t of buffer must be set to buffer size */ + XEN_GUEST_HANDLE(void) edd_params; + uint32_t mbr_signature; + } u; +}; +typedef struct xenpf_firmware_info xenpf_firmware_info_t; +DEFINE_XEN_GUEST_HANDLE(xenpf_firmware_info_t); + struct xen_platform_op { uint32_t cmd; uint32_t interface_version; /* XENPF_INTERFACE_VERSION */ @@ -124,6 +153,7 @@ struct xen_platform_op { struct xenpf_read_memtype read_memtype; struct xenpf_microcode_update microcode; struct xenpf_platform_quirk platform_quirk; + struct xenpf_firmware_info firmware_info; uint8_t pad[128]; } u; };