77 lines
3.0 KiB
Diff
77 lines
3.0 KiB
Diff
|
|
From c8267f88b2af37779a597aac00aeaf06adc80ccc Mon Sep 17 00:00:00 2001
|
||
|
|
From: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
|
||
|
|
Date: Mon, 11 Dec 2023 14:42:01 +0000
|
||
|
|
Subject: [PATCH] hw/arm/smmuv3: Enable sva/stall IDR features
|
||
|
|
|
||
|
|
Emulate features that will enable the stall and sva feature in Guest.
|
||
|
|
|
||
|
|
Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
|
||
|
|
---
|
||
|
|
hw/arm/smmuv3-internal.h | 3 ++-
|
||
|
|
hw/arm/smmuv3.c | 8 +++-----
|
||
|
|
2 files changed, 5 insertions(+), 6 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/hw/arm/smmuv3-internal.h b/hw/arm/smmuv3-internal.h
|
||
|
|
index a411fd4048..cfc04c563e 100644
|
||
|
|
--- a/hw/arm/smmuv3-internal.h
|
||
|
|
+++ b/hw/arm/smmuv3-internal.h
|
||
|
|
@@ -74,6 +74,7 @@ REG32(IDR1, 0x4)
|
||
|
|
FIELD(IDR1, ECMDQ, 31, 1)
|
||
|
|
|
||
|
|
#define SMMU_IDR1_SIDSIZE 16
|
||
|
|
+#define SMMU_IDR1_SSIDSIZE 16
|
||
|
|
#define SMMU_CMDQS 19
|
||
|
|
#define SMMU_EVENTQS 19
|
||
|
|
|
||
|
|
@@ -104,7 +105,7 @@ REG32(IDR5, 0x14)
|
||
|
|
FIELD(IDR5, VAX, 10, 2);
|
||
|
|
FIELD(IDR5, STALL_MAX, 16, 16);
|
||
|
|
|
||
|
|
-#define SMMU_IDR5_OAS 4
|
||
|
|
+#define SMMU_IDR5_OAS 5
|
||
|
|
|
||
|
|
REG32(IIDR, 0x18)
|
||
|
|
REG32(AIDR, 0x1c)
|
||
|
|
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
|
||
|
|
index 66e4e1b57d..8d8dcccd48 100644
|
||
|
|
--- a/hw/arm/smmuv3.c
|
||
|
|
+++ b/hw/arm/smmuv3.c
|
||
|
|
@@ -343,13 +343,14 @@ static void smmuv3_init_regs(SMMUv3State *s)
|
||
|
|
s->idr[0] = FIELD_DP32(s->idr[0], IDR0, ASID16, 1); /* 16-bit ASID */
|
||
|
|
s->idr[0] = FIELD_DP32(s->idr[0], IDR0, VMID16, 1); /* 16-bit VMID */
|
||
|
|
s->idr[0] = FIELD_DP32(s->idr[0], IDR0, TTENDIAN, 2); /* little endian */
|
||
|
|
- s->idr[0] = FIELD_DP32(s->idr[0], IDR0, STALL_MODEL, 1); /* No stall */
|
||
|
|
+ s->idr[0] = FIELD_DP32(s->idr[0], IDR0, STALL_MODEL, 0); /* stall */
|
||
|
|
/* terminated transaction will always be aborted/error returned */
|
||
|
|
s->idr[0] = FIELD_DP32(s->idr[0], IDR0, TERM_MODEL, 1);
|
||
|
|
/* 2-level stream table supported */
|
||
|
|
s->idr[0] = FIELD_DP32(s->idr[0], IDR0, STLEVEL, 1);
|
||
|
|
|
||
|
|
s->idr[1] = FIELD_DP32(s->idr[1], IDR1, SIDSIZE, SMMU_IDR1_SIDSIZE);
|
||
|
|
+ s->idr[1] = FIELD_DP32(s->idr[1], IDR1, SSIDSIZE, SMMU_IDR1_SSIDSIZE);
|
||
|
|
s->idr[1] = FIELD_DP32(s->idr[1], IDR1, EVENTQS, SMMU_EVENTQS);
|
||
|
|
s->idr[1] = FIELD_DP32(s->idr[1], IDR1, CMDQS, SMMU_CMDQS);
|
||
|
|
|
||
|
|
@@ -361,7 +362,7 @@ static void smmuv3_init_regs(SMMUv3State *s)
|
||
|
|
s->idr[3] = FIELD_DP32(s->idr[3], IDR3, RIL, 1);
|
||
|
|
s->idr[3] = FIELD_DP32(s->idr[3], IDR3, BBML, 2);
|
||
|
|
|
||
|
|
- s->idr[5] = FIELD_DP32(s->idr[5], IDR5, OAS, SMMU_IDR5_OAS); /* 44 bits */
|
||
|
|
+ s->idr[5] = FIELD_DP32(s->idr[5], IDR5, OAS, SMMU_IDR5_OAS); /* 48 bits */
|
||
|
|
/* 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);
|
||
|
|
@@ -776,9 +777,6 @@ static int decode_cd(SMMUTransCfg *cfg, CD *cd, SMMUEventInfo *event)
|
||
|
|
if (!CD_A(cd)) {
|
||
|
|
goto bad_cd; /* SMMU_IDR0.TERM_MODEL == 1 */
|
||
|
|
}
|
||
|
|
- if (CD_S(cd)) {
|
||
|
|
- goto bad_cd; /* !STE_SECURE && SMMU_IDR0.STALL_MODEL == 1 */
|
||
|
|
- }
|
||
|
|
if (CD_HA(cd) || CD_HD(cd)) {
|
||
|
|
goto bad_cd; /* HTTU = 0 */
|
||
|
|
}
|
||
|
|
--
|
||
|
|
2.41.0.windows.1
|
||
|
|
|