<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">From 5cf9c658751ba398b4345618bc1aa90cf293a8b4 Mon Sep 17 00:00:00 2001
From: David Gibson &lt;dgibson@redhat.com&gt;
Date: Mon, 11 Jul 2016 01:38:15 +0200
Subject: [PATCH 08/27] spapr_pci: Reset DMA config on PHB reset

RH-Author: David Gibson &lt;dgibson@redhat.com&gt;
Message-id: &lt;1468201103-4990-9-git-send-email-dgibson@redhat.com&gt;
Patchwork-id: 71095
O-Subject: [RHEL7.3 qemu-kvm-rhev PATCHv2 08/16] spapr_pci: Reset DMA config on PHB reset
Bugzilla: 1213667
RH-Acked-by: Miroslav Rezanina &lt;mrezanin@redhat.com&gt;
RH-Acked-by: Laurent Vivier &lt;lvivier@redhat.com&gt;
RH-Acked-by: Thomas Huth &lt;thuth@redhat.com&gt;

From: Alexey Kardashevskiy &lt;aik@ozlabs.ru&gt;

LoPAPR dictates that during system reset all DMA windows must be removed
and the default DMA32 window must be created so does the patch.

At the moment there is just one window supported so no change in
behaviour is expected.

Signed-off-by: Alexey Kardashevskiy &lt;aik@ozlabs.ru&gt;
Reviewed-by: David Gibson &lt;david@gibson.dropbear.id.au&gt;
Signed-off-by: David Gibson &lt;david@gibson.dropbear.id.au&gt;
(cherry picked from commit acf1b6dd22ef8ccd5431e933706f12ce643f6cf0)

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1213667
Signed-off-by: David Gibson &lt;dgibson@redhat.com&gt;
Signed-off-by: Miroslav Rezanina &lt;mrezanin@redhat.com&gt;
---
 hw/ppc/spapr_pci.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
index e1b196d..af2705a 100644
--- a/hw/ppc/spapr_pci.c
+++ b/hw/ppc/spapr_pci.c
@@ -1311,7 +1311,6 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp)
     PCIBus *bus;
     uint64_t msi_window_size = 4096;
     sPAPRTCETable *tcet;
-    uint32_t nb_table;
 
     if (sphb-&gt;index != (uint32_t)-1) {
         hwaddr windows_base;
@@ -1463,7 +1462,6 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp)
         }
     }
 
-    nb_table = sphb-&gt;dma_win_size &gt;&gt; SPAPR_TCE_PAGE_SHIFT;
     tcet = spapr_tce_new_table(DEVICE(sphb), sphb-&gt;dma_liobn);
     if (!tcet) {
         error_setg(errp, "Unable to create TCE table for %s",
@@ -1474,10 +1472,6 @@ static void spapr_phb_realize(DeviceState *dev, Error **errp)
     memory_region_add_subregion_overlap(&amp;sphb-&gt;iommu_root, 0,
                                         spapr_tce_get_iommu(tcet), 0);
 
-    /* Register default 32bit DMA window */
-    spapr_tce_table_enable(tcet, SPAPR_TCE_PAGE_SHIFT, sphb-&gt;dma_win_addr,
-                           nb_table);
-
     sphb-&gt;msi = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, g_free);
 }
 
@@ -1494,6 +1488,17 @@ static int spapr_phb_children_reset(Object *child, void *opaque)
 
 static void spapr_phb_reset(DeviceState *qdev)
 {
+    sPAPRPHBState *sphb = SPAPR_PCI_HOST_BRIDGE(qdev);
+    sPAPRTCETable *tcet = spapr_tce_find_by_liobn(sphb-&gt;dma_liobn);
+
+    if (tcet &amp;&amp; tcet-&gt;nb_table) {
+        spapr_tce_table_disable(tcet);
+    }
+
+    /* Register default 32bit DMA window */
+    spapr_tce_table_enable(tcet, SPAPR_TCE_PAGE_SHIFT, sphb-&gt;dma_win_addr,
+                           sphb-&gt;dma_win_size &gt;&gt; SPAPR_TCE_PAGE_SHIFT);
+
     /* Reset the IOMMU state */
     object_child_foreach(OBJECT(qdev), spapr_phb_children_reset, NULL);
 
-- 
1.8.3.1

</pre></body></html>