]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - arch/powerpc/platforms/powernv/pci-ioda.c
Merge tag 'powerpc-4.17-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
[linux.git] / arch / powerpc / platforms / powernv / pci-ioda.c
index a6c92c78c9b20b9cc2507cfb5c3e749e05a6e19d..3f9c69d7623a9ad34d99d4d889cfcd516b5b35b0 100644 (file)
@@ -2681,14 +2681,23 @@ static struct pnv_ioda_pe *gpe_table_group_to_npe(
 static long pnv_pci_ioda2_npu_set_window(struct iommu_table_group *table_group,
                int num, struct iommu_table *tbl)
 {
+       struct pnv_ioda_pe *npe = gpe_table_group_to_npe(table_group);
+       int num2 = (num == 0) ? 1 : 0;
        long ret = pnv_pci_ioda2_set_window(table_group, num, tbl);
 
        if (ret)
                return ret;
 
-       ret = pnv_npu_set_window(gpe_table_group_to_npe(table_group), num, tbl);
-       if (ret)
+       if (table_group->tables[num2])
+               pnv_npu_unset_window(npe, num2);
+
+       ret = pnv_npu_set_window(npe, num, tbl);
+       if (ret) {
                pnv_pci_ioda2_unset_window(table_group, num);
+               if (table_group->tables[num2])
+                       pnv_npu_set_window(npe, num2,
+                                       table_group->tables[num2]);
+       }
 
        return ret;
 }
@@ -2697,12 +2706,24 @@ static long pnv_pci_ioda2_npu_unset_window(
                struct iommu_table_group *table_group,
                int num)
 {
+       struct pnv_ioda_pe *npe = gpe_table_group_to_npe(table_group);
+       int num2 = (num == 0) ? 1 : 0;
        long ret = pnv_pci_ioda2_unset_window(table_group, num);
 
        if (ret)
                return ret;
 
-       return pnv_npu_unset_window(gpe_table_group_to_npe(table_group), num);
+       if (!npe->table_group.tables[num])
+               return 0;
+
+       ret = pnv_npu_unset_window(npe, num);
+       if (ret)
+               return ret;
+
+       if (table_group->tables[num2])
+               ret = pnv_npu_set_window(npe, num2, table_group->tables[num2]);
+
+       return ret;
 }
 
 static void pnv_ioda2_npu_take_ownership(struct iommu_table_group *table_group)
@@ -3843,7 +3864,7 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
        phb_id = be64_to_cpup(prop64);
        pr_debug("  PHB-ID  : 0x%016llx\n", phb_id);
 
-       phb = memblock_virt_alloc(sizeof(struct pnv_phb), 0);
+       phb = memblock_virt_alloc(sizeof(*phb), 0);
 
        /* Allocate PCI controller */
        phb->hose = hose = pcibios_alloc_controller(np);