diff options
-rw-r--r-- | arch/powerpc/platforms/pseries/iommu.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c index 05c101e7dcd7..a0421ac46d4e 100644 --- a/arch/powerpc/platforms/pseries/iommu.c +++ b/arch/powerpc/platforms/pseries/iommu.c | |||
@@ -665,9 +665,12 @@ static void remove_ddw(struct device_node *np) | |||
665 | 665 | ||
666 | ddr_avail = of_get_property(np, "ibm,ddw-applicable", &len); | 666 | ddr_avail = of_get_property(np, "ibm,ddw-applicable", &len); |
667 | win64 = of_find_property(np, DIRECT64_PROPNAME, NULL); | 667 | win64 = of_find_property(np, DIRECT64_PROPNAME, NULL); |
668 | if (!win64 || !ddr_avail || len < 3 * sizeof(u32)) | 668 | if (!win64) |
669 | return; | 669 | return; |
670 | 670 | ||
671 | if (!ddr_avail || len < 3 * sizeof(u32) || win64->length < sizeof(*dwp)) | ||
672 | goto delprop; | ||
673 | |||
671 | dwp = win64->value; | 674 | dwp = win64->value; |
672 | liobn = (u64)be32_to_cpu(dwp->liobn); | 675 | liobn = (u64)be32_to_cpu(dwp->liobn); |
673 | 676 | ||
@@ -690,8 +693,13 @@ static void remove_ddw(struct device_node *np) | |||
690 | pr_debug("%s: successfully removed direct window: rtas returned " | 693 | pr_debug("%s: successfully removed direct window: rtas returned " |
691 | "%d to ibm,remove-pe-dma-window(%x) %llx\n", | 694 | "%d to ibm,remove-pe-dma-window(%x) %llx\n", |
692 | np->full_name, ret, ddr_avail[2], liobn); | 695 | np->full_name, ret, ddr_avail[2], liobn); |
693 | } | ||
694 | 696 | ||
697 | delprop: | ||
698 | ret = of_remove_property(np, win64); | ||
699 | if (ret) | ||
700 | pr_warning("%s: failed to remove direct window property: %d\n" | ||
701 | np->full_name, ret); | ||
702 | } | ||
695 | 703 | ||
696 | static u64 dupe_ddw_if_already_created(struct pci_dev *dev, struct device_node *pdn) | 704 | static u64 dupe_ddw_if_already_created(struct pci_dev *dev, struct device_node *pdn) |
697 | { | 705 | { |