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]> --- 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/pci/pci-host-common.c | 1 + xen/arch/arm/pci/pci.c | 30 ++++++++++++++++++++++++++++-- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/docs/misc/xen-command-line.pandoc b/docs/misc/xen-command-line.pandoc index 28a98321c7..3a59b2fce1 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/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..3ddee5cdbb 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 __initdata 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,29 @@ 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.34.1
