From: Edward Pickup <[email protected]> This patch adds a Xen boot arguments that, if enabled, causes a call to existing code to scan pci devices enumerated by the firmware.
This will be needed ahead of dom0less support for pci passthrough on arm. Signed-off-by: Luca Fancellu <[email protected]> Signed-off-by: Stewart Hildebrand <[email protected]> Signed-off-by: Mykyta Poturai <[email protected]> --- v2->v3: * add define for cases when HAS_PCI is not set v1->v2: * remove dead code * don't return errors from pci_init, but report them changes from previous series: * remove is_pci_scan_enabled wrapper * make pci_scan_enabled ro_after_init * drop debug prints * drop Edward's SOB --- docs/misc/xen-command-line.pandoc | 7 +++++++ xen/arch/arm/include/asm/pci.h | 2 ++ xen/arch/arm/pci/pci-host-common.c | 1 + xen/arch/arm/pci/pci.c | 29 +++++++++++++++++++++++++++-- 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/docs/misc/xen-command-line.pandoc b/docs/misc/xen-command-line.pandoc index 34004ce282..e5f7275bdc 100644 --- a/docs/misc/xen-command-line.pandoc +++ b/docs/misc/xen-command-line.pandoc @@ -2079,6 +2079,13 @@ This option can be specified more than once (up to 8 times at present). Flag to enable or disable support for PCI passthrough +### pci-scan (arm) +> `= <boolean>` + +> Default: `false` + +Flag to enable or disable Xen PCI scan at boot. + ### pcid (x86) > `= <boolean> | xpti=<bool>` diff --git a/xen/arch/arm/include/asm/pci.h b/xen/arch/arm/include/asm/pci.h index 08ffcd4438..0680b2f50c 100644 --- a/xen/arch/arm/include/asm/pci.h +++ b/xen/arch/arm/include/asm/pci.h @@ -155,6 +155,8 @@ bool arch_pci_device_physdevop(void); #else /*!CONFIG_HAS_PCI*/ +#define pci_scan_enabled false + struct pci_dev; static inline void arch_pci_init_pdev(struct pci_dev *pdev) {} diff --git a/xen/arch/arm/pci/pci-host-common.c b/xen/arch/arm/pci/pci-host-common.c index 487c545f3a..d3481b05eb 100644 --- a/xen/arch/arm/pci/pci-host-common.c +++ b/xen/arch/arm/pci/pci-host-common.c @@ -284,6 +284,7 @@ pci_host_common_probe(struct dt_device_node *dev, } pci_add_host_bridge(bridge); + pci_add_segment(bridge->segment); return bridge; diff --git a/xen/arch/arm/pci/pci.c b/xen/arch/arm/pci/pci.c index beb1f971fa..49ee003c5e 100644 --- a/xen/arch/arm/pci/pci.c +++ b/xen/arch/arm/pci/pci.c @@ -91,8 +91,14 @@ bool arch_pci_device_physdevop(void) bool __read_mostly pci_passthrough_enabled; boolean_param("pci-passthrough", pci_passthrough_enabled); +/* By default pci scan is disabled. */ +static __ro_after_init bool pci_scan_enabled; +boolean_param("pci-scan", pci_scan_enabled); + static int __init pci_init(void) { + int ret; + /* * Enable PCI passthrough when has been enabled explicitly * (pci-passthrough=on). @@ -104,9 +110,28 @@ static int __init pci_init(void) panic("Could not initialize PCI segment 0\n"); if ( acpi_disabled ) - return dt_pci_init(); + ret = dt_pci_init(); else - return acpi_pci_init(); + ret = acpi_pci_init(); + + if ( ret < 0 ) + { + printk(XENLOG_ERR "PCI: Failed to initialize PCI host bridges (rc=%d)\n", ret); + return 0; + } + + if ( pci_scan_enabled ) + { + ret = scan_pci_devices(); + + if ( ret < 0 ) + { + printk(XENLOG_ERR "PCI: Failed to scan PCI devices (rc=%d)\n", ret); + return 0; + } + } + + return 0; } __initcall(pci_init); -- 2.51.2
