Commit f3ef7dbd authored by Rob Herring (Arm)'s avatar Rob Herring (Arm) Committed by Michael Ellerman
Browse files

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: default avatarRob Herring (Arm) <robh@kernel.org>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://patch.msgid.link/20241106212647.341857-1-robh@kernel.org
parent 817a763a
Loading
Loading
Loading
Loading
+16 −33
Original line number Diff line number Diff line
@@ -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: