[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] xen: workaround missing device_type property in pci/pcie nodes
commit 5a4087004d1adbbb223925f3306db0e5824a2bdc Author: Stefano Stabellini <sstabellini@xxxxxxxxxx> AuthorDate: Tue Feb 9 11:53:34 2021 -0800 Commit: Stefano Stabellini <sstabellini@xxxxxxxxxx> CommitDate: Thu Feb 11 17:52:36 2021 -0800 xen: workaround missing device_type property in pci/pcie nodes PCI buses differ from default buses in a few important ways, so it is important to detect them properly. Normally, PCI buses are expected to have the following property: device_type = "pci" In reality, it is not always the case. To handle PCI bus nodes that don't have the device_type property, also consider the node name: if the node name is "pcie" or "pci" then consider the bus as a PCI bus. This commit is based on the Linux kernel commit d1ac0002dd29 "of: address: Work around missing device_type property in pcie nodes". This fixes Xen boot on RPi4. Some RPi4 kernels have the following node on their device trees: &pcie0 { pci@1,0 { #address-cells = <3>; #size-cells = <2>; ranges; reg = <0 0 0 0 0>; usb@1,0 { reg = <0x10000 0 0 0 0>; resets = <&reset RASPBERRYPI_FIRMWARE_RESET_ID_USB>; }; }; }; The pci@1,0 node is a PCI bus. If we parse the node and its children as a default bus, the reg property under usb@1,0 would have to be interpreted as an address range mappable by the CPU, which is not the case and would break. Link: https://lore.kernel.org/xen-devel/YBmQQ3Tzu++AadKx@xxxxxxxxxxxxxxxx/ [fix style on commit] Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxx> Tested-by: Elliott Mitchell <ehem+xen@xxxxxxx> Tested-by: Jukka Kaartinen <jukka.kaartinen@xxxxxxxxxx> Reviewed-by: Bertrand Marquis <bertrand.marquis@xxxxxxx> Acked-by: Julien Grall <jgrall@xxxxxxxxxx> --- xen/common/device_tree.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/xen/common/device_tree.c b/xen/common/device_tree.c index 18825e333e..03d25a81ce 100644 --- a/xen/common/device_tree.c +++ b/xen/common/device_tree.c @@ -563,14 +563,28 @@ static unsigned int dt_bus_default_get_flags(const __be32 *addr) * PCI bus specific translator */ +static bool dt_node_is_pci(const struct dt_device_node *np) +{ + bool is_pci = !strcmp(np->name, "pcie") || !strcmp(np->name, "pci"); + + if ( is_pci ) + printk(XENLOG_WARNING "%s: Missing device_type\n", np->full_name); + + return is_pci; +} + static bool_t dt_bus_pci_match(const struct dt_device_node *np) { /* * "pciex" is PCI Express "vci" is for the /chaos bridge on 1st-gen PCI * powermacs "ht" is hypertransport + * + * If none of the device_type match, and that the node name is + * "pcie" or "pci", accept the device as PCI (with a warning). */ return !strcmp(np->type, "pci") || !strcmp(np->type, "pciex") || - !strcmp(np->type, "vci") || !strcmp(np->type, "ht"); + !strcmp(np->type, "vci") || !strcmp(np->type, "ht") || + dt_node_is_pci(np); } static void dt_bus_pci_count_cells(const struct dt_device_node *np, -- generated by git-patchbot for /home/xen/git/xen.git#master
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |