iommu/arm-smmu: Fix io-coherency enablement for clients using S1 bypass

When a context bank's SCTLR is programmed for an SMMU client
that wishes to bypass S1 translations and enable io-coherency, the
SHCFG bitfield of the SCTLR is set to 0. This means that a
client's transaction's shareability memory attribute will not be
modified as it goes through the SMMU.

This is problematic if the SMMU client's transaction is marked as
non-shareable, as the attribute will not be modified to be classified
as io-coherent, since io-coherent transactions should be cacheable
and shareable. Instead, the transaction will not snoop the CPU
caches, and will go to DDR, and may read incorrect data.

Thus, program the SHCFG bitfield in the context bank's SCTLR to
override the shareability attribute to outer shareable when
enabling io-coherency for clients using S1 bypass.

Change-Id: Ia4c1bbe7812ce7c2062c636e2b1bb39fa1ac516c
Signed-off-by: Isaac J. Manjarres <isaacm@codeaurora.org>
This commit is contained in:
Isaac J. Manjarres 2020-12-09 10:19:49 -08:00
commit 76296974fd
2 changed files with 2 additions and 0 deletions

View file

@ -1715,6 +1715,7 @@ static void arm_smmu_write_context_bank(struct arm_smmu_device *smmu, int idx,
reg |= FIELD_PREP(SCTLR_WACFG, SCTLR_WACFG_WA) |
FIELD_PREP(SCTLR_RACFG, SCTLR_RACFG_RA) |
FIELD_PREP(SCTLR_SHCFG, SCTLR_SHCFG_OSH) |
SCTLR_MTCFG |
FIELD_PREP(SCTLR_MEM_ATTR, SCTLR_MEM_ATTR_OISH_WB_CACHE);
} else {

View file

@ -153,6 +153,7 @@ enum arm_smmu_cbar_type {
#define SCTLR_RACFG GENMASK(25, 24)
#define SCTLR_RACFG_RA 0x2
#define SCTLR_SHCFG GENMASK(23, 22)
#define SCTLR_SHCFG_OSH 0x1
#define SCTLR_SHCFG_NSH 0x3
#define SCTLR_MTCFG BIT(20)
#define SCTLR_MEM_ATTR GENMASK(19, 16)