提交 085f7939 编写于 作者: R Rob Herring 提交者: Lorenzo Pieralisi

PCI: rcar: Use inbound resources for setup

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: NRob Herring <robh@kernel.org>
Signed-off-by: NLorenzo 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>
上级 b9ae59b3
...@@ -1014,16 +1014,16 @@ static int rcar_pcie_get_resources(struct rcar_pcie *pcie) ...@@ -1014,16 +1014,16 @@ static int rcar_pcie_get_resources(struct rcar_pcie *pcie)
} }
static int rcar_pcie_inbound_ranges(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) int *index)
{ {
u64 restype = range->flags; u64 restype = entry->res->flags;
u64 cpu_addr = range->cpu_addr; u64 cpu_addr = entry->res->start;
u64 cpu_end = range->cpu_addr + range->size; u64 cpu_end = entry->res->end;
u64 pci_addr = range->pci_addr; u64 pci_addr = entry->res->start - entry->offset;
u32 flags = LAM_64BIT | LAR_ENABLE; u32 flags = LAM_64BIT | LAR_ENABLE;
u64 mask; u64 mask;
u64 size; u64 size = resource_size(entry->res);
int idx = *index; int idx = *index;
if (restype & IORESOURCE_PREFETCH) if (restype & IORESOURCE_PREFETCH)
...@@ -1037,9 +1037,7 @@ static int rcar_pcie_inbound_ranges(struct rcar_pcie *pcie, ...@@ -1037,9 +1037,7 @@ static int rcar_pcie_inbound_ranges(struct rcar_pcie *pcie,
unsigned long nr_zeros = __ffs64(cpu_addr); unsigned long nr_zeros = __ffs64(cpu_addr);
u64 alignment = 1ULL << nr_zeros; u64 alignment = 1ULL << nr_zeros;
size = min(range->size, alignment); size = min(size, alignment);
} else {
size = range->size;
} }
/* Hardware supports max 4GiB inbound region */ /* Hardware supports max 4GiB inbound region */
size = min(size, 1ULL << 32); size = min(size, 1ULL << 32);
...@@ -1078,30 +1076,19 @@ static int rcar_pcie_inbound_ranges(struct rcar_pcie *pcie, ...@@ -1078,30 +1076,19 @@ static int rcar_pcie_inbound_ranges(struct rcar_pcie *pcie,
return 0; return 0;
} }
static int rcar_pcie_parse_map_dma_ranges(struct rcar_pcie *pcie, static int rcar_pcie_parse_map_dma_ranges(struct rcar_pcie *pcie)
struct device_node *np)
{ {
struct of_pci_range range; struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
struct of_pci_range_parser parser; struct resource_entry *entry;
int index = 0; int index = 0, err = 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);
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) if (err)
return err; break;
} }
return 0; return err;
} }
static const struct of_device_id rcar_pcie_of_match[] = { static const struct of_device_id rcar_pcie_of_match[] = {
...@@ -1162,7 +1149,7 @@ static int rcar_pcie_probe(struct platform_device *pdev) ...@@ -1162,7 +1149,7 @@ static int rcar_pcie_probe(struct platform_device *pdev)
goto err_unmap_msi_irqs; 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) if (err)
goto err_clk_disable; goto err_clk_disable;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册