* [PATCH] powerpc: cell: Use for_each_of_range() iterator
@ 2024-11-06 21:26 Rob Herring (Arm)
2024-11-17 12:09 ` Michael Ellerman
0 siblings, 1 reply; 2+ messages in thread
From: Rob Herring (Arm) @ 2024-11-06 21:26 UTC (permalink / raw)
To: Michael Ellerman, Nicholas Piggin, Christophe Leroy, Naveen N Rao,
Madhavan Srinivasan
Cc: linuxppc-dev, linux-kernel
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@kernel.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
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] powerpc: cell: Use for_each_of_range() iterator
2024-11-06 21:26 [PATCH] powerpc: cell: Use for_each_of_range() iterator Rob Herring (Arm)
@ 2024-11-17 12:09 ` Michael Ellerman
0 siblings, 0 replies; 2+ messages in thread
From: Michael Ellerman @ 2024-11-17 12:09 UTC (permalink / raw)
To: Michael Ellerman, Nicholas Piggin, Christophe Leroy, Naveen N Rao,
Madhavan Srinivasan, Rob Herring (Arm)
Cc: linuxppc-dev, linux-kernel
On Wed, 06 Nov 2024 15:26:46 -0600, Rob Herring (Arm) wrote:
> Simplify the cell_iommu_get_fixed_address() dma-ranges parsing to use the
> for_each_of_range() iterator.
>
>
Applied to powerpc/next.
[1/1] powerpc: cell: Use for_each_of_range() iterator
https://git.kernel.org/powerpc/c/f3ef7dbda9b589cdad833001e4366eb80977b7f1
cheers
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2024-11-17 12:27 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-06 21:26 [PATCH] powerpc: cell: Use for_each_of_range() iterator Rob Herring (Arm)
2024-11-17 12:09 ` Michael Ellerman
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).