On 10/01/2019 14:17, Robin Murphy wrote: > On 10/01/2019 13:35, Jean-Philippe Brucker wrote: >> When executed for a PCI_ROOT_COMPLEX type, iort_match_node_callback() >> expects the opaque pointer argument to be a PCI bus device. At the >> moment rc_dma_get_range() passes the PCI endpoint instead of the bus, >> and we've been lucky to have pci_domain_nr(ptr) return 0 instead of >> crashing. Pass the bus device to iort_scan_node(). > > Oops - that makes sense, and I can now see the combination of > circumstances that would have led me to overlook it at the time. Sorry > about that! However.. > >> Reported-by: Eric Auger <eric.auger@xxxxxxxxxx> >> Fixes: 5ac65e8c8941 ("ACPI/IORT: Support address size limit for root complexes") >> Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@xxxxxxx> >> --- >> drivers/acpi/arm64/iort.c | 3 ++- >> 1 file changed, 2 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c >> index fdd90ffceb85..c08afe44c488 100644 >> --- a/drivers/acpi/arm64/iort.c >> +++ b/drivers/acpi/arm64/iort.c >> @@ -952,9 +952,10 @@ static int rc_dma_get_range(struct device *dev, u64 *size) >> { >> struct acpi_iort_node *node; >> struct acpi_iort_root_complex *rc; >> + struct pci_bus *pbus = to_pci_dev(dev)->bus; > > ...is this still right if the device is beyond a switch or other bridge > and not on the root bus? My understanding is that the pci_dev still has a valid ->bus representing its nearest upstream bridge, and the domain_nr attribute of each bus is copied from its parent by pci_alloc_bus(). Other places in the kernel seem to do the same thing, including iort_iommu_configure() in this file Thanks, Jean