From: Jan Kiszka <[email protected]>

There are no tables ready during arm_smmu_init(). Therefore, we need to
hold back writing sCR0 until config commit.

This fixes DMA errors during startup.

Signed-off-by: Jan Kiszka <[email protected]>
---

Replaces "arm64: smmu: Do not enable SMMU if TLB flush fails".

 hypervisor/arch/arm64/include/asm/smmu.h | 12 ++++++++
 hypervisor/arch/arm64/iommu.c            |  2 ++
 hypervisor/arch/arm64/smmu.c             | 35 +++++++++++++++---------
 3 files changed, 36 insertions(+), 13 deletions(-)
 create mode 100644 hypervisor/arch/arm64/include/asm/smmu.h

diff --git a/hypervisor/arch/arm64/include/asm/smmu.h 
b/hypervisor/arch/arm64/include/asm/smmu.h
new file mode 100644
index 00000000..def7cbde
--- /dev/null
+++ b/hypervisor/arch/arm64/include/asm/smmu.h
@@ -0,0 +1,12 @@
+/*
+ * Jailhouse, a Linux-based partitioning hypervisor
+ *
+ * Copyright Siemens AG, 2020
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ */
+
+#include <jailhouse/cell.h>
+
+void arm_smmu_config_commit(struct cell *cell);
diff --git a/hypervisor/arch/arm64/iommu.c b/hypervisor/arch/arm64/iommu.c
index 805589b3..ca998789 100644
--- a/hypervisor/arch/arm64/iommu.c
+++ b/hypervisor/arch/arm64/iommu.c
@@ -12,6 +12,7 @@
 
 #include <jailhouse/control.h>
 #include <asm/iommu.h>
+#include <asm/smmu.h>
 #include <asm/ti-pvu.h>
 
 unsigned int iommu_count_units(void)
@@ -38,5 +39,6 @@ int iommu_unmap_memory_region(struct cell *cell,
 
 void iommu_config_commit(struct cell *cell)
 {
+       arm_smmu_config_commit(cell);
        pvu_iommu_config_commit(cell);
 }
diff --git a/hypervisor/arch/arm64/smmu.c b/hypervisor/arch/arm64/smmu.c
index 89631d16..911f50d1 100644
--- a/hypervisor/arch/arm64/smmu.c
+++ b/hypervisor/arch/arm64/smmu.c
@@ -14,6 +14,7 @@
 #include <jailhouse/printk.h>
 #include <jailhouse/unit.h>
 #include <asm/iommu.h>
+#include <asm/smmu.h>
 
 #include <jailhouse/cell-config.h>
 
@@ -238,7 +239,6 @@ static int arm_smmu_device_reset(struct arm_smmu_device 
*smmu)
        void *gr0_base = ARM_SMMU_GR0(smmu);
        unsigned int idx;
        u32 reg;
-       int ret;
 
        /* Clear global FSR */
        reg = mmio_read32(ARM_SMMU_GR0(smmu) + ARM_SMMU_GR0_sGFSR);
@@ -287,18 +287,7 @@ static int arm_smmu_device_reset(struct arm_smmu_device 
*smmu)
        /* Invalidate the TLB, just in case */
        mmio_write32(gr0_base + ARM_SMMU_GR0_TLBIALLH, 0);
        mmio_write32(gr0_base + ARM_SMMU_GR0_TLBIALLNSNH, 0);
-
-       /* Enable fault reporting */
-       reg = sCR0_GFRE | sCR0_GFIE | sCR0_GCFGFRE | sCR0_GCFGFIE;
-
-       /* Private VMIDS, disable TLB broadcasting, fault unmatched streams */
-       reg |= sCR0_VMIDPNE | sCR0_PTM | sCR0_USFCFG;
-
-       /* Push the button */
-       ret = arm_smmu_tlb_sync_global(smmu);
-       mmio_write32(ARM_SMMU_GR0(smmu) + ARM_SMMU_GR0_sCR0, reg);
-
-       return ret;
+       return arm_smmu_tlb_sync_global(smmu);
 }
 
 static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)
@@ -512,6 +501,26 @@ static void arm_smmu_cell_exit(struct cell *cell)
        }
 }
 
+void arm_smmu_config_commit(struct cell *cell)
+{
+       struct arm_smmu_device *smmu;
+       unsigned int dev;
+
+       if (cell != &root_cell)
+               return;
+
+       for_each_smmu(smmu, dev) {
+               /*
+                * Enable fault reporting,
+                * private VMIDS, disable TLB broadcasting,
+                * fault unmatched streams
+                */
+               mmio_write32(ARM_SMMU_GR0(smmu) + ARM_SMMU_GR0_sCR0,
+                       sCR0_GFRE | sCR0_GFIE | sCR0_GCFGFRE | sCR0_GCFGFIE |
+                       sCR0_VMIDPNE | sCR0_PTM | sCR0_USFCFG);
+       }
+}
+
 static void arm_smmu_shutdown(void)
 {
        struct arm_smmu_device *smmu;
-- 
2.26.2

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jailhouse-dev/ac6d8f7d-371d-88ed-bcbc-509926fc5770%40siemens.com.

Reply via email to