From 3c9cc492f258ec2a5893d148e256c23e09b61579 Mon Sep 17 00:00:00 2001 From: Chen Qun Date: Wed, 31 Mar 2021 14:47:13 +0800 Subject: [PATCH] hw/arm/smmuv3: Support 16K translation granule The driver can query some bits in SMMUv3 IDR5 to learn which translation granules are supported. Arm recommends that SMMUv3 implementations support at least 4K and 64K granules. But in the vSMMUv3, there seems to be no reason not to support 16K translation granule. In addition, if 16K is not supported, vSVA will failed to be enabled in the future for 16K guest kernel. So it'd better to support it. Signed-off-by: Kunkun Jiang Reviewed-by: Eric Auger Tested-by: Eric Auger Signed-off-by: Peter Maydell --- ...muv3-Support-16K-translation-granule.patch | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 hw-arm-smmuv3-Support-16K-translation-granule.patch diff --git a/hw-arm-smmuv3-Support-16K-translation-granule.patch b/hw-arm-smmuv3-Support-16K-translation-granule.patch new file mode 100644 index 0000000..08c4bc5 --- /dev/null +++ b/hw-arm-smmuv3-Support-16K-translation-granule.patch @@ -0,0 +1,49 @@ +From 008dec30dea19950ff48a34c54441d065c1f228b Mon Sep 17 00:00:00 2001 +From: Kunkun Jiang +Date: Wed, 31 Mar 2021 14:47:13 +0800 +Subject: [PATCH] hw/arm/smmuv3: Support 16K translation granule + +The driver can query some bits in SMMUv3 IDR5 to learn which +translation granules are supported. Arm recommends that SMMUv3 +implementations support at least 4K and 64K granules. But in +the vSMMUv3, there seems to be no reason not to support 16K +translation granule. In addition, if 16K is not supported, +vSVA will failed to be enabled in the future for 16K guest +kernel. So it'd better to support it. + +Signed-off-by: Kunkun Jiang +Reviewed-by: Eric Auger +Tested-by: Eric Auger +Signed-off-by: Peter Maydell +--- + hw/arm/smmuv3.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c +index e96d5beb9a..7911944c59 100644 +--- a/hw/arm/smmuv3.c ++++ b/hw/arm/smmuv3.c +@@ -254,8 +254,9 @@ static void smmuv3_init_regs(SMMUv3State *s) + s->idr[1] = FIELD_DP32(s->idr[1], IDR1, EVENTQS, SMMU_EVENTQS); + s->idr[1] = FIELD_DP32(s->idr[1], IDR1, CMDQS, SMMU_CMDQS); + +- /* 4K and 64K granule support */ ++ /* 4K, 16K and 64K granule support */ + s->idr[5] = FIELD_DP32(s->idr[5], IDR5, GRAN4K, 1); ++ s->idr[5] = FIELD_DP32(s->idr[5], IDR5, GRAN16K, 1); + s->idr[5] = FIELD_DP32(s->idr[5], IDR5, GRAN64K, 1); + s->idr[5] = FIELD_DP32(s->idr[5], IDR5, OAS, SMMU_IDR5_OAS); /* 44 bits */ + +@@ -480,7 +481,8 @@ static int decode_cd(SMMUTransCfg *cfg, CD *cd, SMMUEventInfo *event) + + tg = CD_TG(cd, i); + tt->granule_sz = tg2granule(tg, i); +- if ((tt->granule_sz != 12 && tt->granule_sz != 16) || CD_ENDI(cd)) { ++ if ((tt->granule_sz != 12 && tt->granule_sz != 14 && ++ tt->granule_sz != 16) || CD_ENDI(cd)) { + goto bad_cd; + } + +-- +2.27.0 +