On 30/10/2020 10:25, Jan Kiszka wrote: > 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.
Thanks! Tested on the ZCU 102, the DMA errors I had are gone. Andrea > > 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; > -- Thanks, Andrea Bastoni -- 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/6b1bad95-118c-4041-2044-0e8c4c44b905%40tum.de.
