diff options
Diffstat (limited to 'drivers/xen/pci.c')
| -rw-r--r-- | drivers/xen/pci.c | 21 | 
1 files changed, 15 insertions, 6 deletions
diff --git a/drivers/xen/pci.c b/drivers/xen/pci.c index 3eeb9bea7630..224df03ce42e 100644 --- a/drivers/xen/pci.c +++ b/drivers/xen/pci.c @@ -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  |