[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH v3 09/18] hw/arm/smmu-common: Rework TLB lookup for nesting
|
From: |
Mostafa Saleh |
|
Subject: |
[RFC PATCH v3 09/18] hw/arm/smmu-common: Rework TLB lookup for nesting |
|
Date: |
Mon, 29 Apr 2024 03:23:53 +0000 |
In the previous patch, comine_tlb() was added which combines 2 TLB
entries into one, which chooses the granule and level from the
smallest entry.
This means that a nested translation, an entry can be cached with the
granule of stage-2 and not stage-1.
However, the lookup for an IOVA in nested configuration is done with
stage-1 granule, this patch reworks lookup in that case, so it falls
back to stage-2 granule if no entry is found using stage-1 granule.
Signed-off-by: Mostafa Saleh <smostafa@google.com>
---
hw/arm/smmu-common.c | 24 ++++++++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
index 0d6945fa54..c67af3bc6d 100644
--- a/hw/arm/smmu-common.c
+++ b/hw/arm/smmu-common.c
@@ -66,8 +66,10 @@ SMMUIOTLBKey smmu_get_iotlb_key(int asid, int vmid, uint64_t
iova,
return key;
}
-SMMUTLBEntry *smmu_iotlb_lookup(SMMUState *bs, SMMUTransCfg *cfg,
- SMMUTransTableInfo *tt, hwaddr iova)
+static SMMUTLBEntry *smmu_iotlb_lookup_all_levels(SMMUState *bs,
+ SMMUTransCfg *cfg,
+ SMMUTransTableInfo *tt,
+ hwaddr iova)
{
uint8_t tg = (tt->granule_sz - 10) / 2;
uint8_t inputsize = 64 - tt->tsz;
@@ -88,6 +90,24 @@ SMMUTLBEntry *smmu_iotlb_lookup(SMMUState *bs, SMMUTransCfg
*cfg,
}
level++;
}
+ return entry;
+}
+
+SMMUTLBEntry *smmu_iotlb_lookup(SMMUState *bs, SMMUTransCfg *cfg,
+ SMMUTransTableInfo *tt, hwaddr iova)
+{
+ SMMUTLBEntry *entry = NULL;
+
+ entry = smmu_iotlb_lookup_all_levels(bs, cfg, tt, iova);
+ /*
+ * For nested translation also try the s2 granule, as the TLB will insert
+ * it if the size of s2 tlb entry was smaller.
+ */
+ if (!entry && (cfg->stage == SMMU_NESTED) &&
+ (cfg->s2cfg.granule_sz != tt->granule_sz)) {
+ tt->granule_sz = cfg->s2cfg.granule_sz;
+ entry = smmu_iotlb_lookup_all_levels(bs, cfg, tt, iova);
+ }
if (entry) {
cfg->iotlb_hits++;
--
2.44.0.769.g3c40516874-goog
- [RFC PATCH v3 00/18] SMMUv3 nested translation support, Mostafa Saleh, 2024/04/28
- [RFC PATCH v3 01/18] hw/arm/smmu-common: Add missing size check for stage-1, Mostafa Saleh, 2024/04/28
- [RFC PATCH v3 02/18] hw/arm/smmu: Fix IPA for stage-2 events, Mostafa Saleh, 2024/04/28
- [RFC PATCH v3 03/18] hw/arm/smmuv3: Fix encoding of CLASS in events, Mostafa Saleh, 2024/04/28
- [RFC PATCH v3 04/18] hw/arm/smmu: Use enum for SMMU stage, Mostafa Saleh, 2024/04/28
- [RFC PATCH v3 05/18] hw/arm/smmu: Split smmuv3_translate(), Mostafa Saleh, 2024/04/28
- [RFC PATCH v3 06/18] hw/arm/smmu: Consolidate ASID and VMID types, Mostafa Saleh, 2024/04/28
- [RFC PATCH v3 07/18] hw/arm/smmuv3: Translate CD and TT using stage-2 table, Mostafa Saleh, 2024/04/28
- [RFC PATCH v3 08/18] hw/arm/smmu-common: Add support for nested TLB, Mostafa Saleh, 2024/04/28
- [RFC PATCH v3 09/18] hw/arm/smmu-common: Rework TLB lookup for nesting,
Mostafa Saleh <=
- [RFC PATCH v3 10/18] hw/arm/smmu-common: Support nested translation, Mostafa Saleh, 2024/04/28
- [RFC PATCH v3 11/18] hw/arm/smmu: Support nesting in smmuv3_range_inval(), Mostafa Saleh, 2024/04/28
- [RFC PATCH v3 12/18] hw/arm/smmu: Support nesting in the rest of commands, Mostafa Saleh, 2024/04/28
- [RFC PATCH v3 13/18] hw/arm/smmuv3: Support nested SMMUs in smmuv3_notify_iova(), Mostafa Saleh, 2024/04/28
- [RFC PATCH v3 14/18] hw/arm/smmuv3: Support and advertise nesting, Mostafa Saleh, 2024/04/28
- [RFC PATCH v3 15/18] hw/arm/smmuv3: Advertise S2FWB, Mostafa Saleh, 2024/04/28
- [RFC PATCH v3 16/18] hw/arm/smmu: Refactor SMMU OAS, Mostafa Saleh, 2024/04/28
- [RFC PATCH v3 18/18] hw/arm/virt: Set SMMU OAS based on CPU PARANGE, Mostafa Saleh, 2024/04/28
- [RFC PATCH v3 17/18] hw/arm/smmuv3: Add property for OAS, Mostafa Saleh, 2024/04/28