From: Volodymyr Babchuk <volodymyr_babc...@epam.com> According to ATU documentation, bits [18:16] of accessed memory address correspond to a function number. This is somewhat similar to ECAM, but with huge holes between regions.
We can use this to minimize number of ATU re-programmings: configure ATU to access BDF with F=0 and adjust memory address with function number. Taking into account the previous patch, that optimizes ATU reprogramming by skipping call to __dw_pcie_prog_outbound_atu() if we already configured pci_address, we can be sure that accesses to all functions of one device will not trigger ATU reprogramming at all. Signed-off-by: Volodymyr Babchuk <volodymyr_babc...@epam.com> Signed-off-by: Mykyta Poturai <mykyta_potu...@epam.com> --- xen/arch/arm/pci/pci-host-rcar4.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xen/arch/arm/pci/pci-host-rcar4.c b/xen/arch/arm/pci/pci-host-rcar4.c index 3e3e073b09..5d006e4897 100644 --- a/xen/arch/arm/pci/pci-host-rcar4.c +++ b/xen/arch/arm/pci/pci-host-rcar4.c @@ -385,7 +385,7 @@ static void __iomem *rcar4_child_map_bus(struct pci_host_bridge *bridge, uint32_t busdev; busdev = PCIE_ATU_BUS(sbdf.bus) | PCIE_ATU_DEV(PCI_SLOT(sbdf.devfn)) | - PCIE_ATU_FUNC(PCI_FUNC(sbdf.devfn)); + PCIE_ATU_FUNC(0); /* FIXME: Parent is the root bus, so use PCIE_ATU_TYPE_CFG0. */ dw_pcie_prog_outbound_atu(bridge, PCIE_ATU_REGION_INDEX1, @@ -393,7 +393,7 @@ static void __iomem *rcar4_child_map_bus(struct pci_host_bridge *bridge, bridge->child_cfg->phys_addr, busdev, bridge->child_cfg->size); - return bridge->child_cfg->win + where; + return bridge->child_cfg->win + ((uint32_t)sbdf.fn << 16) + where; } static int rcar4_child_config_read(struct pci_host_bridge *bridge, -- 2.34.1