[<prev] [next>] [day] [month] [year] [list]
Message-ID: <20241106212647.341857-1-robh@kernel.org>
Date: Wed, 6 Nov 2024 15:26:46 -0600
From: "Rob Herring (Arm)" <robh@...nel.org>
To: Michael Ellerman <mpe@...erman.id.au>,
Nicholas Piggin <npiggin@...il.com>,
Christophe Leroy <christophe.leroy@...roup.eu>,
Naveen N Rao <naveen@...nel.org>,
Madhavan Srinivasan <maddy@...ux.ibm.com>
Cc: linuxppc-dev@...ts.ozlabs.org,
linux-kernel@...r.kernel.org
Subject: [PATCH] powerpc: cell: Use for_each_of_range() iterator
Simplify the cell_iommu_get_fixed_address() dma-ranges parsing to use the
for_each_of_range() iterator.
Signed-off-by: Rob Herring (Arm) <robh@...nel.org>
---
arch/powerpc/platforms/cell/iommu.c | 49 ++++++++++-------------------
1 file changed, 16 insertions(+), 33 deletions(-)
diff --git a/arch/powerpc/platforms/cell/iommu.c b/arch/powerpc/platforms/cell/iommu.c
index 4cd9c0de22c2..62c9679b8ca3 100644
--- a/arch/powerpc/platforms/cell/iommu.c
+++ b/arch/powerpc/platforms/cell/iommu.c
@@ -779,58 +779,41 @@ static int __init cell_iommu_init_disabled(void)
static u64 cell_iommu_get_fixed_address(struct device *dev)
{
- u64 cpu_addr, size, best_size, dev_addr = OF_BAD_ADDR;
+ u64 best_size, dev_addr = OF_BAD_ADDR;
struct device_node *np;
- const u32 *ranges = NULL;
- int i, len, best, naddr, nsize, pna, range_size;
+ struct of_range_parser parser;
+ struct of_range range;
/* We can be called for platform devices that have no of_node */
np = of_node_get(dev->of_node);
if (!np)
goto out;
- while (1) {
- naddr = of_n_addr_cells(np);
- nsize = of_n_size_cells(np);
- np = of_get_next_parent(np);
- if (!np)
- break;
-
- ranges = of_get_property(np, "dma-ranges", &len);
+ while ((np = of_get_next_parent(np))) {
+ if (of_pci_dma_range_parser_init(&parser, np))
+ continue;
- /* Ignore empty ranges, they imply no translation required */
- if (ranges && len > 0)
+ if (of_range_count(&parser))
break;
}
- if (!ranges) {
+ if (!np) {
dev_dbg(dev, "iommu: no dma-ranges found\n");
goto out;
}
- len /= sizeof(u32);
-
- pna = of_n_addr_cells(np);
- range_size = naddr + nsize + pna;
-
- /* dma-ranges format:
- * child addr : naddr cells
- * parent addr : pna cells
- * size : nsize cells
- */
- for (i = 0, best = -1, best_size = 0; i < len; i += range_size) {
- cpu_addr = of_translate_dma_address(np, ranges + i + naddr);
- size = of_read_number(ranges + i + naddr + pna, nsize);
+ best_size = 0;
+ for_each_of_range(&parser, &range) {
+ if (!range.cpu_addr)
+ continue;
- if (cpu_addr == 0 && size > best_size) {
- best = i;
- best_size = size;
+ if (range.size > best_size) {
+ best_size = range.size;
+ dev_addr = range.bus_addr;
}
}
- if (best >= 0) {
- dev_addr = of_read_number(ranges + best, naddr);
- } else
+ if (!best_size)
dev_dbg(dev, "iommu: no suitable range found!\n");
out:
--
2.45.2
Powered by blists - more mailing lists