[POWERPC] Fix cell IOMMU null pointer explosion on old firmwares

The cell IOMMU fixed mapping support has a null pointer bug if you run
it on older firmwares that don't contain the "dma-ranges" properties.
Fix it and convert to using of_get_next_parent() while we're there.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
Michael Ellerman 2008-02-08 16:37:02 +11:00 committed by Paul Mackerras
parent 85687ff2b4
commit ccd05d086f

View File

@ -26,6 +26,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/notifier.h> #include <linux/notifier.h>
#include <linux/of.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <asm/prom.h> #include <asm/prom.h>
@ -789,18 +790,16 @@ static int __init cell_iommu_init_disabled(void)
static u64 cell_iommu_get_fixed_address(struct device *dev) static u64 cell_iommu_get_fixed_address(struct device *dev)
{ {
u64 cpu_addr, size, best_size, pci_addr = OF_BAD_ADDR; u64 cpu_addr, size, best_size, pci_addr = OF_BAD_ADDR;
struct device_node *tmp, *np; struct device_node *np;
const u32 *ranges = NULL; const u32 *ranges = NULL;
int i, len, best; int i, len, best;
np = dev->archdata.of_node; np = of_node_get(dev->archdata.of_node);
of_node_get(np); while (np) {
ranges = of_get_property(np, "dma-ranges", &len);
while (!ranges && np) {
tmp = of_get_parent(np);
of_node_put(np);
np = tmp;
ranges = of_get_property(np, "dma-ranges", &len); ranges = of_get_property(np, "dma-ranges", &len);
if (ranges)
break;
np = of_get_next_parent(np);
} }
if (!ranges) { if (!ranges) {