]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/xen/pci.c
Merge tag 'for-linus-2019-10-18' of git://git.kernel.dk/linux-block
[linux.git] / drivers / xen / pci.c
index 3eeb9bea7630023e1c7ef96020a5a066916ad50b..224df03ce42e3e7a93d46514a25c0283886191d4 100644 (file)
@@ -17,6 +17,8 @@
 #include "../pci/pci.h"
 #ifdef CONFIG_PCI_MMCONFIG
 #include <asm/pci_x86.h>
+
+static int xen_mcfg_late(void);
 #endif
 
 static bool __read_mostly pci_seg_supported = true;
@@ -28,7 +30,18 @@ static int xen_add_device(struct device *dev)
 #ifdef CONFIG_PCI_IOV
        struct pci_dev *physfn = pci_dev->physfn;
 #endif
-
+#ifdef CONFIG_PCI_MMCONFIG
+       static bool pci_mcfg_reserved = false;
+       /*
+        * Reserve MCFG areas in Xen on first invocation due to this being
+        * potentially called from inside of acpi_init immediately after
+        * MCFG table has been finally parsed.
+        */
+       if (!pci_mcfg_reserved) {
+               xen_mcfg_late();
+               pci_mcfg_reserved = true;
+       }
+#endif
        if (pci_seg_supported) {
                struct {
                        struct physdev_pci_device_add add;
@@ -201,7 +214,7 @@ static int __init register_xen_pci_notifier(void)
 arch_initcall(register_xen_pci_notifier);
 
 #ifdef CONFIG_PCI_MMCONFIG
-static int __init xen_mcfg_late(void)
+static int xen_mcfg_late(void)
 {
        struct pci_mmcfg_region *cfg;
        int rc;
@@ -240,8 +253,4 @@ static int __init xen_mcfg_late(void)
        }
        return 0;
 }
-/*
- * Needs to be done after acpi_init which are subsys_initcall.
- */
-subsys_initcall_sync(xen_mcfg_late);
 #endif