Platforms supporting the DDW option starting with LoPAR level 2.7 implement
ibm,ddw-extensions. The first extension available (index 2) carries the
token for ibm,reset-pe-dma-windows rtas call, which is used to restore
the default DMA window for a device, if it has been deleted.

It does so by resetting the TCE table allocation for the PE to it's
boot time value, available in "ibm,dma-window" device tree node.

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

diff --git a/arch/powerpc/platforms/pseries/iommu.c 
b/arch/powerpc/platforms/pseries/iommu.c
index e5a617738c8b..5e1fbc176a37 100644
--- a/arch/powerpc/platforms/pseries/iommu.c
+++ b/arch/powerpc/platforms/pseries/iommu.c
@@ -1012,6 +1012,39 @@ static phys_addr_t ddw_memory_hotplug_max(void)
        return max_addr;
 }
 
+/*
+ * Platforms supporting the DDW option starting with LoPAR level 2.7 implement
+ * ibm,ddw-extensions, which carries the rtas token for
+ * ibm,reset-pe-dma-windows.
+ * That rtas-call can be used to restore the default DMA window for the device.
+ */
+static void reset_dma_window(struct pci_dev *dev, struct device_node *par_dn)
+{
+       int ret;
+       u32 cfg_addr, ddw_ext[3];
+       u64 buid;
+       struct device_node *dn;
+       struct pci_dn *pdn;
+
+       ret = of_property_read_u32_array(par_dn, "ibm,ddw-extensions",
+                                        &ddw_ext[0], 3);
+       if (ret)
+               return;
+
+       dn = pci_device_to_OF_node(dev);
+       pdn = PCI_DN(dn);
+       buid = pdn->phb->buid;
+       cfg_addr = ((pdn->busno << 16) | (pdn->devfn << 8));
+
+       ret = rtas_call(ddw_ext[1], 3, 1, NULL, cfg_addr,
+                       BUID_HI(buid), BUID_LO(buid));
+       if (ret)
+               dev_info(&dev->dev,
+                        "ibm,reset-pe-dma-windows(%x) %x %x %x returned %d ",
+                        ddw_ext[1], cfg_addr, BUID_HI(buid), BUID_LO(buid),
+                        ret);
+}
+
 /*
  * If the PE supports dynamic dma windows, and there is space for a table
  * that can map all pages in a linear offset, then setup such a table,
-- 
2.25.4

Reply via email to