mirror of
https://github.com/torvalds/linux.git
synced 2024-12-24 11:51:27 +00:00
[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:
parent
85687ff2b4
commit
ccd05d086f
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user