|
@@ -69,6 +69,80 @@ static int check_platform_magic(void)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+bool xen_has_pv_devices()
|
|
|
+{
|
|
|
+ if (!xen_domain())
|
|
|
+ return false;
|
|
|
+
|
|
|
+ /* PV domains always have them. */
|
|
|
+ if (xen_pv_domain())
|
|
|
+ return true;
|
|
|
+
|
|
|
+ /* And user has xen_platform_pci=0 set in guest config as
|
|
|
+ * driver did not modify the value. */
|
|
|
+ if (xen_platform_pci_unplug == 0)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (xen_platform_pci_unplug & XEN_UNPLUG_NEVER)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (xen_platform_pci_unplug & XEN_UNPLUG_ALL)
|
|
|
+ return true;
|
|
|
+
|
|
|
+ /* This is an odd one - we are going to run legacy
|
|
|
+ * and PV drivers at the same time. */
|
|
|
+ if (xen_platform_pci_unplug & XEN_UNPLUG_UNNECESSARY)
|
|
|
+ return true;
|
|
|
+
|
|
|
+ /* And the caller has to follow with xen_pv_{disk,nic}_devices
|
|
|
+ * to be certain which driver can load. */
|
|
|
+ return false;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(xen_has_pv_devices);
|
|
|
+
|
|
|
+static bool __xen_has_pv_device(int state)
|
|
|
+{
|
|
|
+ /* HVM domains might or might not */
|
|
|
+ if (xen_hvm_domain() && (xen_platform_pci_unplug & state))
|
|
|
+ return true;
|
|
|
+
|
|
|
+ return xen_has_pv_devices();
|
|
|
+}
|
|
|
+
|
|
|
+bool xen_has_pv_nic_devices(void)
|
|
|
+{
|
|
|
+ return __xen_has_pv_device(XEN_UNPLUG_ALL_NICS | XEN_UNPLUG_ALL);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(xen_has_pv_nic_devices);
|
|
|
+
|
|
|
+bool xen_has_pv_disk_devices(void)
|
|
|
+{
|
|
|
+ return __xen_has_pv_device(XEN_UNPLUG_ALL_IDE_DISKS |
|
|
|
+ XEN_UNPLUG_AUX_IDE_DISKS | XEN_UNPLUG_ALL);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(xen_has_pv_disk_devices);
|
|
|
+
|
|
|
+/*
|
|
|
+ * This one is odd - it determines whether you want to run PV _and_
|
|
|
+ * legacy (IDE) drivers together. This combination is only possible
|
|
|
+ * under HVM.
|
|
|
+ */
|
|
|
+bool xen_has_pv_and_legacy_disk_devices(void)
|
|
|
+{
|
|
|
+ if (!xen_domain())
|
|
|
+ return false;
|
|
|
+
|
|
|
+ /* N.B. This is only ever used in HVM mode */
|
|
|
+ if (xen_pv_domain())
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (xen_platform_pci_unplug & XEN_UNPLUG_UNNECESSARY)
|
|
|
+ return true;
|
|
|
+
|
|
|
+ return false;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(xen_has_pv_and_legacy_disk_devices);
|
|
|
+
|
|
|
void xen_unplug_emulated_devices(void)
|
|
|
{
|
|
|
int r;
|