All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/1] iommu/arm-smmu: Fix for ThunderX erratum #27704
@ 2017-01-16  7:16 ` Tomasz Nowicki
  0 siblings, 0 replies; 23+ messages in thread
From: Tomasz Nowicki @ 2017-01-16  7:16 UTC (permalink / raw)
  To: will.deacon-5wv7dgnIgG8, robin.murphy-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8, joro-zLv9SwRftAIdnm+yROfE0A,
	Linu.Cherian-YGCgFSpz5w/QT0dZR+AlfA
  Cc: Prasun.Kapoor-YGCgFSpz5w/QT0dZR+AlfA,
	Sunil.Goutham-YGCgFSpz5w/QT0dZR+AlfA, Tomasz Nowicki,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	Tirumalesh.Chalamarla-YGCgFSpz5w/QT0dZR+AlfA,
	Geethasowjanya.Akula-YGCgFSpz5w/QT0dZR+AlfA,
	iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r

The goal of erratum #27704 workaround was to make sure that ASIDs and VMIDs
are unique across all SMMU instances on affected Cavium systems.

Currently, the workaround code partitions ASIDs and VMIDs by increasing
global cavium_smmu_context_count which in turn becomes the base ASID and VMID
value for the given SMMU instance upon the context bank initialization.

For systems with multiple SMMU instances this approach implies the risk
of crossing 8-bit ASID, like for 1-socket CN88xx capable of 4 SMMUv2,
128 context banks each:
SMMU_0 (0-127 ASID RANGE)
SMMU_1 (127-255 ASID RANGE)
SMMU_2 (256-383 ASID RANGE) <--- crossing 8-bit ASID
SMMU_3 (384-511 ASID RANGE) <--- crossing 8-bit ASID

Since now we use 8-bit ASID (SMMU_CBn_TCR2.AS = 0) we effectively misconfigure
ASID[15:8] bits of SMMU_CBn_TTBRm register for SMMU_2/3. Moreover, we still
assume non-zero ASID[15:8] bits upon context invalidation. In the end,
except SMMU_0/1 devices all other devices under other SMMUs will fail on guest
power off/on. Since we try to invalidate TLB with 16-bit ASID but we actually
have 8-bit zero padded 16-bit entry.

This patch adds 16-bit ASID support for stage-1 AArch64 contexts so that
we use ASIDs consistently for all SMMU instances.

Signed-off-by: Tomasz Nowicki <tn-nYOzD4b6Jr9Wk0Htik3J/w@public.gmane.org>
Reviewed-by: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org>
Reviewed-by: Tirumalesh Chalamarla  <Tirumalesh.Chalamarla-YGCgFSpz5w/QT0dZR+AlfA@public.gmane.org>
---
 drivers/iommu/arm-smmu.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index a60cded..476fab9 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -260,6 +260,7 @@ enum arm_smmu_s2cr_privcfg {
 
 #define TTBCR2_SEP_SHIFT		15
 #define TTBCR2_SEP_UPSTREAM		(0x7 << TTBCR2_SEP_SHIFT)
+#define TTBCR2_AS			(1 << 4)
 
 #define TTBRn_ASID_SHIFT		48
 
@@ -778,6 +779,8 @@ static void arm_smmu_init_context_bank(struct arm_smmu_domain *smmu_domain,
 			reg = pgtbl_cfg->arm_lpae_s1_cfg.tcr;
 			reg2 = pgtbl_cfg->arm_lpae_s1_cfg.tcr >> 32;
 			reg2 |= TTBCR2_SEP_UPSTREAM;
+			if (cfg->fmt == ARM_SMMU_CTX_FMT_AARCH64)
+				reg2 |= TTBCR2_AS;
 		}
 		if (smmu->version > ARM_SMMU_V1)
 			writel_relaxed(reg2, cb_base + ARM_SMMU_CB_TTBCR2);
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 23+ messages in thread
* [PATCH 1/1] iommu/arm-smmu: Fix for ThunderX erratum #27704
@ 2017-01-11 11:51 ` Tomasz Nowicki
  0 siblings, 0 replies; 23+ messages in thread
From: Tomasz Nowicki @ 2017-01-11 11:51 UTC (permalink / raw)
  To: will.deacon, robin.murphy, mark.rutland, joro
  Cc: linux-arm-kernel, iommu, linux-kernel, Sunil.Goutham,
	Geethasowjanya.Akula, Tirumalesh.Chalamarla, Prasun.Kapoor,
	Tomasz Nowicki

The goal of erratum #27704 workaround was to make sure that ASIDs and VMIDs
are unique across all SMMU instances on affected Cavium systems.

Currently, the workaround code partitions ASIDs and VMIDs by increasing
global cavium_smmu_context_count which in turn becomes the base ASID and VMID
value for the given SMMU instance upon the context bank initialization.

For systems with multiple SMMU instances this approach implies the risk
of crossing 8-bit ASID, like for CN88xx capable of 4 SMMUv2, 128 context bank each:
SMMU_0 (0-127 ASID RANGE)
SMMU_1 (127-255 ASID RANGE)
SMMU_2 (256-383 ASID RANGE) <--- crossing 8-bit ASID
SMMU_3 (384-511 ASID RANGE) <--- crossing 8-bit ASID

Since we use 8-bit ASID now we effectively misconfigure ASID[15:8] bits for
SMMU_CBn_TTBRm register. Also, we still use non-zero ASID[15:8] bits
upon context invalidation. This patch adds 16-bit ASID support for stage-1
AArch64 contexts for Cavium SMMUv2 model so that we use ASIDs consistently.

Signed-off-by: Tomasz Nowicki <tn@semihalf.com>
---
 drivers/iommu/arm-smmu.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index a60cded..ae8f059 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -260,6 +260,7 @@ enum arm_smmu_s2cr_privcfg {
 
 #define TTBCR2_SEP_SHIFT		15
 #define TTBCR2_SEP_UPSTREAM		(0x7 << TTBCR2_SEP_SHIFT)
+#define TTBCR2_AS			(1 << 4)
 
 #define TTBRn_ASID_SHIFT		48
 
@@ -778,6 +779,9 @@ static void arm_smmu_init_context_bank(struct arm_smmu_domain *smmu_domain,
 			reg = pgtbl_cfg->arm_lpae_s1_cfg.tcr;
 			reg2 = pgtbl_cfg->arm_lpae_s1_cfg.tcr >> 32;
 			reg2 |= TTBCR2_SEP_UPSTREAM;
+			if (smmu->model == CAVIUM_SMMUV2 &&
+			    cfg->fmt == ARM_SMMU_CTX_FMT_AARCH64)
+				reg2 |= TTBCR2_AS;
 		}
 		if (smmu->version > ARM_SMMU_V1)
 			writel_relaxed(reg2, cb_base + ARM_SMMU_CB_TTBCR2);
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2017-01-19 16:28 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-01-16  7:16 [PATCH 1/1] iommu/arm-smmu: Fix for ThunderX erratum #27704 Tomasz Nowicki
2017-01-16  7:16 ` Tomasz Nowicki
2017-01-16  7:16 ` Tomasz Nowicki
     [not found] ` <1484550967-6328-1-git-send-email-tn-nYOzD4b6Jr9Wk0Htik3J/w@public.gmane.org>
2017-01-16  7:25   ` Tomasz Nowicki
2017-01-16  7:25     ` Tomasz Nowicki
2017-01-16  7:25     ` Tomasz Nowicki
2017-01-19 16:16   ` Will Deacon
2017-01-19 16:16     ` Will Deacon
2017-01-19 16:16     ` Will Deacon
  -- strict thread matches above, loose matches on Subject: below --
2017-01-11 11:51 Tomasz Nowicki
2017-01-11 11:51 ` Tomasz Nowicki
     [not found] ` <1484135507-24872-1-git-send-email-tn-nYOzD4b6Jr9Wk0Htik3J/w@public.gmane.org>
2017-01-11 12:19   ` Robin Murphy
2017-01-11 12:19     ` Robin Murphy
2017-01-11 12:19     ` Robin Murphy
     [not found]     ` <2c048126-a4d6-16af-987a-3174401a3960-5wv7dgnIgG8@public.gmane.org>
2017-01-12  6:41       ` Tomasz Nowicki
2017-01-12  6:41         ` Tomasz Nowicki
2017-01-12  6:41         ` Tomasz Nowicki
     [not found]         ` <b0eb1127-182e-63e3-6dd4-c3b40228b909-nYOzD4b6Jr9Wk0Htik3J/w@public.gmane.org>
2017-01-13 10:43           ` Tomasz Nowicki
2017-01-13 10:43             ` Tomasz Nowicki
2017-01-13 10:43             ` Tomasz Nowicki
2017-01-13 10:54             ` Robin Murphy
2017-01-13 10:54               ` Robin Murphy
2017-01-11 18:49   ` Chalamarla, Tirumalesh

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.