[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] linux/x86: Obtain EDD info from Xen



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 <jbeulich@xxxxxxxxxx>

Index: head-2007-05-31/arch/i386/kernel/setup-xen.c
===================================================================
--- 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 <xen/interface/physdev.h>
 #include <xen/interface/memory.h>
 #include <xen/features.h>
+#include <xen/firmware.h>
 #include <xen/xencons.h>
 #include <setup_arch.h>
 #include <bios_ebda.h>
@@ -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 = EDD_MBR_SIG_NR;
      edd.edd_info_nr = EDD_NR;
 }
+#endif
 #else
 static inline void copy_edd(void)
 {
Index: head-2007-05-31/arch/x86_64/kernel/setup-xen.c
===================================================================
--- 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 <asm/hypervisor.h>
 #include <xen/interface/nmi.h>
 #include <xen/features.h>
+#include <xen/firmware.h>
 #include <xen/xencons.h>
 #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 = EDD_MBR_SIG_NR;
      edd.edd_info_nr = EDD_NR;
 }
+#endif
 #else
 static inline void copy_edd(void)
 {
Index: head-2007-05-31/drivers/firmware/Kconfig
===================================================================
--- 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.000000000 
+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
===================================================================
--- 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.000000000 
+0200
@@ -2,7 +2,7 @@
 # Makefile for the linux kernel.
 #
 
-obj-y := evtchn.o gnttab.o features.o reboot.o machine_reboot.o
+obj-y := evtchn.o gnttab.o features.o reboot.o machine_reboot.o firmware.o
 
 obj-$(CONFIG_PROC_FS)          += xen_proc.o
 obj-$(CONFIG_SYSFS)            += hypervisor_sysfs.o
Index: head-2007-05-31/drivers/xen/core/firmware.c
===================================================================
--- /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.000000000 
+0200
@@ -0,0 +1,61 @@
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/edd.h>
+#include <xen/interface/platform.h>
+#include <asm/hypervisor.h>
+
+#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 = XENPF_firmware_info;
+
+       for (op.u.firmware_info.index = 0, ret = 0;
+            ret != -ESRCH && ret != -ENOSYS && edd.edd_info_nr < EDDMAXNR;
+            ++op.u.firmware_info.index) {
+               struct edd_info *info = edd.edd_info + edd.edd_info_nr;
+
+               op.u.firmware_info.type = XEN_FW_EDD_INFO;
+               ret = HYPERVISOR_platform_op(&op);
+               if (ret)
+                       continue;
+               info->device            = op.u.firmware_info.u.edd_info.device;
+               info->version           = op.u.firmware_info.u.edd_info.version;
+               info->interface_support = 
op.u.firmware_info.u.edd_info.interface;
+
+               op.u.firmware_info.type = XEN_FW_DISK_INFO;
+               ret = HYPERVISOR_platform_op(&op);
+               if (ret)
+                       continue;
+               info->legacy_max_cylinder      = 
op.u.firmware_info.u.disk_info.max_cylinder;
+               info->legacy_max_head          = 
op.u.firmware_info.u.disk_info.max_head;
+               info->legacy_sectors_per_track = 
op.u.firmware_info.u.disk_info.sectors_per_track;
+
+               op.u.firmware_info.type = XEN_FW_EDD_PARAMS;
+               info->params.length = sizeof(info->params);
+               set_xen_guest_handle(op.u.firmware_info.u.edd_params, 
&info->params);
+               ret = HYPERVISOR_platform_op(&op);
+               if (ret)
+                       continue;
+
+               ++edd.edd_info_nr;
+       }
+
+       op.u.firmware_info.type = XEN_FW_MBR_SIGNATURE;
+       for (op.u.firmware_info.index = 0, ret = 0;
+            ret != -ESRCH && ret != -ENOSYS && edd.mbr_signature_nr < 
EDD_MBR_SIG_MAX;
+            ++op.u.firmware_info.index) {
+
+               ret = HYPERVISOR_platform_op(&op);
+               if (ret)
+                       continue;
+               edd.mbr_signature[edd.mbr_signature_nr++] = 
op.u.firmware_info.u.mbr_signature;
+       }
+}
+#endif
Index: head-2007-05-31/include/xen/firmware.h
===================================================================
--- /dev/null   1970-01-01 00:00:00.000000000 +0000
+++ head-2007-05-31/include/xen/firmware.h      2007-06-01 16:59:22.000000000 
+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
===================================================================
--- 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);
 
+#define XENPF_firmware_info       50
+#define XEN_FW_DISK_INFO          1 /* from int 13 AH=08 */
+#define XEN_FW_EDD_INFO           2 /* from int 13 AH=41 */
+#define XEN_FW_EDD_PARAMS         3 /* from int 13 AH=48 */
+#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;
 };



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.