Skip to content

Commit f3ef7db

Browse files
robherringmpe
authored andcommitted
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@kernel.org> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://patch.msgid.link/20241106212647.341857-1-robh@kernel.org
1 parent 817a763 commit f3ef7db

File tree

1 file changed

+16
-33
lines changed

1 file changed

+16
-33
lines changed

arch/powerpc/platforms/cell/iommu.c

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -779,58 +779,41 @@ static int __init cell_iommu_init_disabled(void)
779779

780780
static u64 cell_iommu_get_fixed_address(struct device *dev)
781781
{
782-
u64 cpu_addr, size, best_size, dev_addr = OF_BAD_ADDR;
782+
u64 best_size, dev_addr = OF_BAD_ADDR;
783783
struct device_node *np;
784-
const u32 *ranges = NULL;
785-
int i, len, best, naddr, nsize, pna, range_size;
784+
struct of_range_parser parser;
785+
struct of_range range;
786786

787787
/* We can be called for platform devices that have no of_node */
788788
np = of_node_get(dev->of_node);
789789
if (!np)
790790
goto out;
791791

792-
while (1) {
793-
naddr = of_n_addr_cells(np);
794-
nsize = of_n_size_cells(np);
795-
np = of_get_next_parent(np);
796-
if (!np)
797-
break;
798-
799-
ranges = of_get_property(np, "dma-ranges", &len);
792+
while ((np = of_get_next_parent(np))) {
793+
if (of_pci_dma_range_parser_init(&parser, np))
794+
continue;
800795

801-
/* Ignore empty ranges, they imply no translation required */
802-
if (ranges && len > 0)
796+
if (of_range_count(&parser))
803797
break;
804798
}
805799

806-
if (!ranges) {
800+
if (!np) {
807801
dev_dbg(dev, "iommu: no dma-ranges found\n");
808802
goto out;
809803
}
810804

811-
len /= sizeof(u32);
812-
813-
pna = of_n_addr_cells(np);
814-
range_size = naddr + nsize + pna;
815-
816-
/* dma-ranges format:
817-
* child addr : naddr cells
818-
* parent addr : pna cells
819-
* size : nsize cells
820-
*/
821-
for (i = 0, best = -1, best_size = 0; i < len; i += range_size) {
822-
cpu_addr = of_translate_dma_address(np, ranges + i + naddr);
823-
size = of_read_number(ranges + i + naddr + pna, nsize);
805+
best_size = 0;
806+
for_each_of_range(&parser, &range) {
807+
if (!range.cpu_addr)
808+
continue;
824809

825-
if (cpu_addr == 0 && size > best_size) {
826-
best = i;
827-
best_size = size;
810+
if (range.size > best_size) {
811+
best_size = range.size;
812+
dev_addr = range.bus_addr;
828813
}
829814
}
830815

831-
if (best >= 0) {
832-
dev_addr = of_read_number(ranges + best, naddr);
833-
} else
816+
if (!best_size)
834817
dev_dbg(dev, "iommu: no suitable range found!\n");
835818

836819
out:

0 commit comments

Comments
 (0)