[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v1 1/3] arm/pci: Add pci-scan boot argument
From: Edward Pickup <Edward.Pickup@xxxxxxx> 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 patch also makes an existing debug function viewable outside its translation unit, and uses this to dump the PCI devices found. The debug message is controlled by config DEBUG. Additionally, this patch modifies segment loading to ensure that PCI devices on other segments are properly found. This will be needed ahead of dom0less support for pci passthrough on arm. Signed-off-by: Luca Fancellu <luca.fancellu@xxxxxxx> Signed-off-by: Edward Pickup <Edward.Pickup@xxxxxxx> Signed-off-by: Mykyta Poturai <mykyta_poturai@xxxxxxxx> --- (cherry picked from commit bce463e1588a45e1bfdf59fc0d5f88b16604e439 from the downstream branch poc/pci-passthrough from https://gitlab.com/xen-project/people/bmarquis/xen-arm-poc.git) changes since cherry-pick: * s/always_inline/inline/ * replace additional kconfig option with config DEBUG Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx> --- docs/misc/xen-command-line.pandoc | 7 +++++++ xen/arch/arm/include/asm/pci.h | 11 +++++++++++ xen/arch/arm/pci/pci-host-common.c | 1 + xen/arch/arm/pci/pci.c | 26 ++++++++++++++++++++++++-- xen/drivers/passthrough/pci.c | 2 +- xen/include/xen/pci.h | 1 + 6 files changed, 45 insertions(+), 3 deletions(-) diff --git a/docs/misc/xen-command-line.pandoc b/docs/misc/xen-command-line.pandoc index 6865a61220..72c122ea32 100644 --- a/docs/misc/xen-command-line.pandoc +++ b/docs/misc/xen-command-line.pandoc @@ -2058,6 +2058,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..0afdc90de0 100644 --- a/xen/arch/arm/include/asm/pci.h +++ b/xen/arch/arm/include/asm/pci.h @@ -23,6 +23,7 @@ #define pci_to_dev(pcidev) (&(pcidev)->arch.dev) extern bool pci_passthrough_enabled; +extern bool pci_scan_enabled; struct rangeset; @@ -128,6 +129,11 @@ static always_inline bool is_pci_passthrough_enabled(void) return pci_passthrough_enabled; } +static inline bool is_pci_scan_enabled(void) +{ + return pci_scan_enabled; +} + void arch_pci_init_pdev(struct pci_dev *pdev); int pci_get_new_domain_nr(void); @@ -155,6 +161,11 @@ bool arch_pci_device_physdevop(void); #else /*!CONFIG_HAS_PCI*/ +static inline bool is_pci_scan_enabled(void) +{ + return 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..eea264db0e 100644 --- a/xen/arch/arm/pci/pci.c +++ b/xen/arch/arm/pci/pci.c @@ -91,8 +91,13 @@ 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. */ +bool __read_mostly 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 +109,26 @@ 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 ) + return ret; + + if ( is_pci_scan_enabled() ) + { + ret = scan_pci_devices(); + + if ( ret < 0 ) + return ret; + +#ifdef DEBUG + dump_pci_devices('c'); +#endif + } + + return 0; } __initcall(pci_init); diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c index 3edcfa8a04..fa03dafac7 100644 --- a/xen/drivers/passthrough/pci.c +++ b/xen/drivers/passthrough/pci.c @@ -1384,7 +1384,7 @@ static int cf_check _dump_pci_devices(struct pci_seg *pseg, void *arg) return 0; } -static void cf_check dump_pci_devices(unsigned char ch) +void cf_check dump_pci_devices(unsigned char ch) { printk("==== PCI devices ====\n"); pcidevs_lock(); diff --git a/xen/include/xen/pci.h b/xen/include/xen/pci.h index 130c2a8c1a..5c242278b9 100644 --- a/xen/include/xen/pci.h +++ b/xen/include/xen/pci.h @@ -217,6 +217,7 @@ static always_inline bool pcidevs_trylock(void) bool pci_known_segment(u16 seg); bool pci_device_detect(u16 seg, u8 bus, u8 dev, u8 func); int scan_pci_devices(void); +void dump_pci_devices(unsigned char ch); enum pdev_type pdev_type(u16 seg, u8 bus, u8 devfn); int find_upstream_bridge(u16 seg, u8 *bus, u8 *devfn, u8 *secbus); -- 2.34.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |