Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

authored by

Rob Herring (Arm) and committed by
Michael Ellerman
f3ef7dbd 817a763a

+16 -33
+16 -33
arch/powerpc/platforms/cell/iommu.c
··· 779 779 780 780 static u64 cell_iommu_get_fixed_address(struct device *dev) 781 781 { 782 - u64 cpu_addr, size, best_size, dev_addr = OF_BAD_ADDR; 782 + u64 best_size, dev_addr = OF_BAD_ADDR; 783 783 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; 786 786 787 787 /* We can be called for platform devices that have no of_node */ 788 788 np = of_node_get(dev->of_node); 789 789 if (!np) 790 790 goto out; 791 791 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; 792 + while ((np = of_get_next_parent(np))) { 793 + if (of_pci_dma_range_parser_init(&parser, np)) 794 + continue; 798 795 799 - ranges = of_get_property(np, "dma-ranges", &len); 800 - 801 - /* Ignore empty ranges, they imply no translation required */ 802 - if (ranges && len > 0) 796 + if (of_range_count(&parser)) 803 797 break; 804 798 } 805 799 806 - if (!ranges) { 800 + if (!np) { 807 801 dev_dbg(dev, "iommu: no dma-ranges found\n"); 808 802 goto out; 809 803 } 810 804 811 - len /= sizeof(u32); 805 + best_size = 0; 806 + for_each_of_range(&parser, &range) { 807 + if (!range.cpu_addr) 808 + continue; 812 809 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); 824 - 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; 828 813 } 829 814 } 830 815 831 - if (best >= 0) { 832 - dev_addr = of_read_number(ranges + best, naddr); 833 - } else 816 + if (!best_size) 834 817 dev_dbg(dev, "iommu: no suitable range found!\n"); 835 818 836 819 out: