Update remove_dma_window() so it can be used to remove DDW with a given
property name.

This enables the creation of new property names for DDW, so we can
have different usage for it, like indirect mapping.

Signed-off-by: Leonardo Bras <leobra...@gmail.com>
---
 arch/powerpc/platforms/pseries/iommu.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/arch/powerpc/platforms/pseries/iommu.c 
b/arch/powerpc/platforms/pseries/iommu.c
index 0147ccaf0be4..075c6e08f012 100644
--- a/arch/powerpc/platforms/pseries/iommu.c
+++ b/arch/powerpc/platforms/pseries/iommu.c
@@ -823,31 +823,32 @@ static void remove_dma_window(struct device_node *np, u32 
*ddw_avail,
                        np, ret, ddw_avail[DDW_REMOVE_PE_DMA_WIN], liobn);
 }
 
-static void remove_ddw(struct device_node *np, bool remove_prop)
+static int remove_ddw(struct device_node *np, bool remove_prop, const char 
*win_name)
 {
        struct property *win;
        u32 ddw_avail[DDW_APPLICABLE_SIZE];
        int ret = 0;
 
+       win = of_find_property(np, win_name, NULL);
+       if (!win)
+               return -EINVAL;
+
        ret = of_property_read_u32_array(np, "ibm,ddw-applicable",
                                         &ddw_avail[0], DDW_APPLICABLE_SIZE);
        if (ret)
-               return;
-
-       win = of_find_property(np, DIRECT64_PROPNAME, NULL);
-       if (!win)
-               return;
+               return 0;
 
        if (win->length >= sizeof(struct dynamic_dma_window_prop))
                remove_dma_window(np, ddw_avail, win);
 
        if (!remove_prop)
-               return;
+               return 0;
 
        ret = of_remove_property(np, win);
        if (ret)
                pr_warn("%pOF: failed to remove direct window property: %d\n",
                        np, ret);
+       return 0;
 }
 
 static bool find_existing_ddw(struct device_node *pdn, u64 *dma_addr, int 
*window_shift)
@@ -900,7 +901,7 @@ static int find_existing_ddw_windows(void)
        for_each_node_with_property(pdn, DIRECT64_PROPNAME) {
                direct64 = of_get_property(pdn, DIRECT64_PROPNAME, &len);
                if (!direct64 || len < sizeof(*direct64)) {
-                       remove_ddw(pdn, true);
+                       remove_ddw(pdn, true, DIRECT64_PROPNAME);
                        continue;
                }
 
@@ -1372,7 +1373,7 @@ static bool enable_ddw(struct pci_dev *dev, struct 
device_node *pdn)
        win64 = NULL;
 
 out_del_win:
-       remove_ddw(pdn, true);
+       remove_ddw(pdn, true, DIRECT64_PROPNAME);
 
 out_failed:
        if (default_win_removed)
@@ -1536,7 +1537,7 @@ static int iommu_reconfig_notifier(struct notifier_block 
*nb, unsigned long acti
                 * we have to remove the property when releasing
                 * the device node.
                 */
-               remove_ddw(np, false);
+               remove_ddw(np, false, DIRECT64_PROPNAME);
                if (pci && pci->table_group)
                        iommu_pseries_free_group(pci->table_group,
                                        np->full_name);
-- 
2.30.2

Reply via email to