Merge tag 'samsung-fixes-v3.19' of git://git.kernel.org/pub/scm/linux/kernel/git...
[cascardo/linux.git] / arch / x86 / xen / platform-pci-unplug.c
index 0a78524..a826171 100644 (file)
 #define XEN_PLATFORM_ERR_PROTOCOL -2
 #define XEN_PLATFORM_ERR_BLACKLIST -3
 
-/* store the value of xen_emul_unplug after the unplug is done */
-int xen_platform_pci_unplug;
-EXPORT_SYMBOL_GPL(xen_platform_pci_unplug);
 #ifdef CONFIG_XEN_PVHVM
+/* store the value of xen_emul_unplug after the unplug is done */
+static int xen_platform_pci_unplug;
 static int xen_emul_unplug;
 
 static int check_platform_magic(void)
@@ -69,6 +68,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;