|
|
@@ -29,6 +29,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;
|
|
|
@@ -40,7 +42,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;
|
|
|
@@ -213,7 +226,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;
|
|
|
@@ -252,8 +265,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
|