- Update Xen patches to 3.3-rc5 and c/s 1157.
[linux-flexiantxendom0-3.2.10.git] / drivers / xen / core / firmware.c
1 #include <linux/kernel.h>
2 #include <linux/string.h>
3 #include <linux/errno.h>
4 #include <linux/init.h>
5 #include <linux/edd.h>
6 #include <video/edid.h>
7 #include <xen/interface/platform.h>
8 #include <asm/hypervisor.h>
9
10 #if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
11 void __init copy_edd(void)
12 {
13         int ret;
14         struct xen_platform_op op;
15
16         if (!is_initial_xendomain())
17                 return;
18
19         op.cmd = XENPF_firmware_info;
20
21         op.u.firmware_info.type = XEN_FW_DISK_INFO;
22         for (op.u.firmware_info.index = 0;
23              edd.edd_info_nr < EDDMAXNR;
24              op.u.firmware_info.index++) {
25                 struct edd_info *info = edd.edd_info + edd.edd_info_nr;
26
27                 info->params.length = sizeof(info->params);
28                 set_xen_guest_handle(op.u.firmware_info.u.disk_info.edd_params,
29                                      &info->params);
30                 ret = HYPERVISOR_platform_op(&op);
31                 if (ret)
32                         break;
33
34 #define C(x) info->x = op.u.firmware_info.u.disk_info.x
35                 C(device);
36                 C(version);
37                 C(interface_support);
38                 C(legacy_max_cylinder);
39                 C(legacy_max_head);
40                 C(legacy_sectors_per_track);
41 #undef C
42
43                 edd.edd_info_nr++;
44         }
45
46         op.u.firmware_info.type = XEN_FW_DISK_MBR_SIGNATURE;
47         for (op.u.firmware_info.index = 0;
48              edd.mbr_signature_nr < EDD_MBR_SIG_MAX;
49              op.u.firmware_info.index++) {
50                 ret = HYPERVISOR_platform_op(&op);
51                 if (ret)
52                         break;
53                 edd.mbr_signature[edd.mbr_signature_nr++] =
54                         op.u.firmware_info.u.disk_mbr_signature.mbr_signature;
55         }
56 }
57 #endif
58
59 void __init copy_edid(void)
60 {
61 #if defined(CONFIG_FIRMWARE_EDID) && defined(CONFIG_X86)
62         struct xen_platform_op op;
63
64         if (!is_initial_xendomain())
65                 return;
66
67         op.cmd = XENPF_firmware_info;
68         op.u.firmware_info.index = 0;
69         op.u.firmware_info.type = XEN_FW_VBEDDC_INFO;
70         set_xen_guest_handle(op.u.firmware_info.u.vbeddc_info.edid,
71                              edid_info.dummy);
72         if (HYPERVISOR_platform_op(&op) != 0)
73                 memset(edid_info.dummy, 0x13, sizeof(edid_info.dummy));
74 #endif
75 }