aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/platforms/pseries/iommu.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c
index 6d5412a18b26..019009b10e62 100644
--- a/arch/powerpc/platforms/pseries/iommu.c
+++ b/arch/powerpc/platforms/pseries/iommu.c
@@ -730,16 +730,20 @@ static u64 dupe_ddw_if_kexec(struct pci_dev *dev, struct device_node *pdn)
730 pcidn = PCI_DN(dn); 730 pcidn = PCI_DN(dn);
731 direct64 = of_get_property(pdn, DIRECT64_PROPNAME, &len); 731 direct64 = of_get_property(pdn, DIRECT64_PROPNAME, &len);
732 if (direct64) { 732 if (direct64) {
733 window = kzalloc(sizeof(*window), GFP_KERNEL); 733 if (len < sizeof(struct dynamic_dma_window_prop)) {
734 if (!window) {
735 remove_ddw(pdn); 734 remove_ddw(pdn);
736 } else { 735 } else {
737 window->device = pdn; 736 window = kzalloc(sizeof(*window), GFP_KERNEL);
738 window->prop = direct64; 737 if (!window) {
739 spin_lock(&direct_window_list_lock); 738 remove_ddw(pdn);
740 list_add(&window->list, &direct_window_list); 739 } else {
741 spin_unlock(&direct_window_list_lock); 740 window->device = pdn;
742 dma_addr = direct64->dma_base; 741 window->prop = direct64;
742 spin_lock(&direct_window_list_lock);
743 list_add(&window->list, &direct_window_list);
744 spin_unlock(&direct_window_list_lock);
745 dma_addr = direct64->dma_base;
746 }
743 } 747 }
744 } 748 }
745 749
@@ -833,7 +837,7 @@ static u64 enable_ddw(struct pci_dev *dev, struct device_node *pdn)
833 struct device_node *dn; 837 struct device_node *dn;
834 const u32 *uninitialized_var(ddr_avail); 838 const u32 *uninitialized_var(ddr_avail);
835 struct direct_window *window; 839 struct direct_window *window;
836 struct property *uninitialized_var(win64); 840 struct property *win64;
837 struct dynamic_dma_window_prop *ddwprop; 841 struct dynamic_dma_window_prop *ddwprop;
838 842
839 mutex_lock(&direct_window_init_mutex); 843 mutex_lock(&direct_window_init_mutex);
@@ -907,6 +911,7 @@ static u64 enable_ddw(struct pci_dev *dev, struct device_node *pdn)
907 } 911 }
908 win64->name = kstrdup(DIRECT64_PROPNAME, GFP_KERNEL); 912 win64->name = kstrdup(DIRECT64_PROPNAME, GFP_KERNEL);
909 win64->value = ddwprop = kmalloc(sizeof(*ddwprop), GFP_KERNEL); 913 win64->value = ddwprop = kmalloc(sizeof(*ddwprop), GFP_KERNEL);
914 win64->length = sizeof(*ddwprop);
910 if (!win64->name || !win64->value) { 915 if (!win64->name || !win64->value) {
911 dev_info(&dev->dev, 916 dev_info(&dev->dev,
912 "couldn't allocate property name and value\n"); 917 "couldn't allocate property name and value\n");