]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
PCI: rcar: Use inbound resources for setup
authorRob Herring <robh@kernel.org>
Mon, 28 Oct 2019 16:32:55 +0000 (11:32 -0500)
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Wed, 20 Nov 2019 17:00:14 +0000 (17:00 +0000)
Now that the helpers provide the inbound resources in the host bridge
'dma_ranges' resource list, convert Renesas R-Car PCIe host bridge to
use the resource list to setup the inbound addresses.

Signed-off-by: Rob Herring <robh@kernel.org>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Simon Horman <horms@verge.net.au>
Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/controller/pcie-rcar.c

index b8d6e86a55399cf14322cbd3760f15280182d1ed..453c931aaf77d2d5ac85a2b3c7dc04b175394167 100644 (file)
@@ -1014,16 +1014,16 @@ static int rcar_pcie_get_resources(struct rcar_pcie *pcie)
 }
 
 static int rcar_pcie_inbound_ranges(struct rcar_pcie *pcie,
-                                   struct of_pci_range *range,
+                                   struct resource_entry *entry,
                                    int *index)
 {
-       u64 restype = range->flags;
-       u64 cpu_addr = range->cpu_addr;
-       u64 cpu_end = range->cpu_addr + range->size;
-       u64 pci_addr = range->pci_addr;
+       u64 restype = entry->res->flags;
+       u64 cpu_addr = entry->res->start;
+       u64 cpu_end = entry->res->end;
+       u64 pci_addr = entry->res->start - entry->offset;
        u32 flags = LAM_64BIT | LAR_ENABLE;
        u64 mask;
-       u64 size;
+       u64 size = resource_size(entry->res);
        int idx = *index;
 
        if (restype & IORESOURCE_PREFETCH)
@@ -1037,9 +1037,7 @@ static int rcar_pcie_inbound_ranges(struct rcar_pcie *pcie,
                unsigned long nr_zeros = __ffs64(cpu_addr);
                u64 alignment = 1ULL << nr_zeros;
 
-               size = min(range->size, alignment);
-       } else {
-               size = range->size;
+               size = min(size, alignment);
        }
        /* Hardware supports max 4GiB inbound region */
        size = min(size, 1ULL << 32);
@@ -1078,30 +1076,19 @@ static int rcar_pcie_inbound_ranges(struct rcar_pcie *pcie,
        return 0;
 }
 
-static int rcar_pcie_parse_map_dma_ranges(struct rcar_pcie *pcie,
-                                         struct device_node *np)
+static int rcar_pcie_parse_map_dma_ranges(struct rcar_pcie *pcie)
 {
-       struct of_pci_range range;
-       struct of_pci_range_parser parser;
-       int index = 0;
-       int err;
-
-       if (of_pci_dma_range_parser_init(&parser, np))
-               return -EINVAL;
-
-       /* Get the dma-ranges from DT */
-       for_each_of_pci_range(&parser, &range) {
-               u64 end = range.cpu_addr + range.size - 1;
-
-               dev_dbg(pcie->dev, "0x%08x 0x%016llx..0x%016llx -> 0x%016llx\n",
-                       range.flags, range.cpu_addr, end, range.pci_addr);
+       struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
+       struct resource_entry *entry;
+       int index = 0, err = 0;
 
-               err = rcar_pcie_inbound_ranges(pcie, &range, &index);
+       resource_list_for_each_entry(entry, &bridge->dma_ranges) {
+               err = rcar_pcie_inbound_ranges(pcie, entry, &index);
                if (err)
-                       return err;
+                       break;
        }
 
-       return 0;
+       return err;
 }
 
 static const struct of_device_id rcar_pcie_of_match[] = {
@@ -1162,7 +1149,7 @@ static int rcar_pcie_probe(struct platform_device *pdev)
                goto err_unmap_msi_irqs;
        }
 
-       err = rcar_pcie_parse_map_dma_ranges(pcie, dev->of_node);
+       err = rcar_pcie_parse_map_dma_ranges(pcie);
        if (err)
                goto err_clk_disable;