116 lines
4.5 KiB
Diff
116 lines
4.5 KiB
Diff
|
From c4ae2dbb8ee406f0a015b35fb76b3d6d131900d6 Mon Sep 17 00:00:00 2001
|
||
|
From: eperezma <eperezma@redhat.com>
|
||
|
Date: Tue, 12 Jan 2021 14:36:31 -0500
|
||
|
Subject: [PATCH 07/17] hw/arm/smmuv3: Introduce smmuv3_s1_range_inval() helper
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
RH-Author: eperezma <eperezma@redhat.com>
|
||
|
Message-id: <20210112143638.374060-7-eperezma@redhat.com>
|
||
|
Patchwork-id: 100599
|
||
|
O-Subject: [RHEL-8.4.0 qemu-kvm PATCH v2 06/13] hw/arm/smmuv3: Introduce smmuv3_s1_range_inval() helper
|
||
|
Bugzilla: 1843852
|
||
|
RH-Acked-by: Xiao Wang <jasowang@redhat.com>
|
||
|
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
||
|
RH-Acked-by: Auger Eric <eric.auger@redhat.com>
|
||
|
|
||
|
From: Eric Auger <eric.auger@redhat.com>
|
||
|
|
||
|
Let's introduce an helper for S1 IOVA range invalidation.
|
||
|
This will be used for NH_VA and NH_VAA commands. It decodes
|
||
|
the same fields, trace, calls the UNMAP notifiers and
|
||
|
invalidate the corresponding IOTLB entries.
|
||
|
|
||
|
At the moment, we do not support 3.2 range invalidation yet.
|
||
|
So it reduces to a single IOVA invalidation.
|
||
|
|
||
|
Note the leaf bit now is also decoded for the CMD_TLBI_NH_VAA
|
||
|
command. At the moment it is only used for tracing.
|
||
|
|
||
|
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
||
|
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
|
||
|
Message-id: 20200728150815.11446-7-eric.auger@redhat.com
|
||
|
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
|
||
|
(cherry picked from commit c0f9ef70377cfcbd0fa6559d5dc729a930d71b7c)
|
||
|
Signed-off-by: Eugenio Pérez <eperezma@redhat.com>
|
||
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
||
|
---
|
||
|
hw/arm/smmuv3.c | 36 +++++++++++++++++-------------------
|
||
|
hw/arm/trace-events | 3 +--
|
||
|
2 files changed, 18 insertions(+), 21 deletions(-)
|
||
|
|
||
|
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
|
||
|
index 067c9480a03..ae2b769f891 100644
|
||
|
--- a/hw/arm/smmuv3.c
|
||
|
+++ b/hw/arm/smmuv3.c
|
||
|
@@ -824,6 +824,22 @@ static void smmuv3_inv_notifiers_iova(SMMUState *s, int asid, dma_addr_t iova)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+static void smmuv3_s1_range_inval(SMMUState *s, Cmd *cmd)
|
||
|
+{
|
||
|
+ dma_addr_t addr = CMD_ADDR(cmd);
|
||
|
+ uint8_t type = CMD_TYPE(cmd);
|
||
|
+ uint16_t vmid = CMD_VMID(cmd);
|
||
|
+ bool leaf = CMD_LEAF(cmd);
|
||
|
+ int asid = -1;
|
||
|
+
|
||
|
+ if (type == SMMU_CMD_TLBI_NH_VA) {
|
||
|
+ asid = CMD_ASID(cmd);
|
||
|
+ }
|
||
|
+ trace_smmuv3_s1_range_inval(vmid, asid, addr, leaf);
|
||
|
+ smmuv3_inv_notifiers_iova(s, asid, addr);
|
||
|
+ smmu_iotlb_inv_iova(s, asid, addr);
|
||
|
+}
|
||
|
+
|
||
|
static int smmuv3_cmdq_consume(SMMUv3State *s)
|
||
|
{
|
||
|
SMMUState *bs = ARM_SMMU(s);
|
||
|
@@ -954,27 +970,9 @@ static int smmuv3_cmdq_consume(SMMUv3State *s)
|
||
|
smmu_iotlb_inv_all(bs);
|
||
|
break;
|
||
|
case SMMU_CMD_TLBI_NH_VAA:
|
||
|
- {
|
||
|
- dma_addr_t addr = CMD_ADDR(&cmd);
|
||
|
- uint16_t vmid = CMD_VMID(&cmd);
|
||
|
-
|
||
|
- trace_smmuv3_cmdq_tlbi_nh_vaa(vmid, addr);
|
||
|
- smmuv3_inv_notifiers_iova(bs, -1, addr);
|
||
|
- smmu_iotlb_inv_iova(bs, -1, addr);
|
||
|
- break;
|
||
|
- }
|
||
|
case SMMU_CMD_TLBI_NH_VA:
|
||
|
- {
|
||
|
- uint16_t asid = CMD_ASID(&cmd);
|
||
|
- uint16_t vmid = CMD_VMID(&cmd);
|
||
|
- dma_addr_t addr = CMD_ADDR(&cmd);
|
||
|
- bool leaf = CMD_LEAF(&cmd);
|
||
|
-
|
||
|
- trace_smmuv3_cmdq_tlbi_nh_va(vmid, asid, addr, leaf);
|
||
|
- smmuv3_inv_notifiers_iova(bs, asid, addr);
|
||
|
- smmu_iotlb_inv_iova(bs, asid, addr);
|
||
|
+ smmuv3_s1_range_inval(bs, &cmd);
|
||
|
break;
|
||
|
- }
|
||
|
case SMMU_CMD_TLBI_EL3_ALL:
|
||
|
case SMMU_CMD_TLBI_EL3_VA:
|
||
|
case SMMU_CMD_TLBI_EL2_ALL:
|
||
|
diff --git a/hw/arm/trace-events b/hw/arm/trace-events
|
||
|
index f74d3e920f1..c219fe9e828 100644
|
||
|
--- a/hw/arm/trace-events
|
||
|
+++ b/hw/arm/trace-events
|
||
|
@@ -45,8 +45,7 @@ smmuv3_cmdq_cfgi_ste_range(int start, int end) "start=0x%d - end=0x%d"
|
||
|
smmuv3_cmdq_cfgi_cd(uint32_t sid) "streamid = %d"
|
||
|
smmuv3_config_cache_hit(uint32_t sid, uint32_t hits, uint32_t misses, uint32_t perc) "Config cache HIT for sid %d (hits=%d, misses=%d, hit rate=%d)"
|
||
|
smmuv3_config_cache_miss(uint32_t sid, uint32_t hits, uint32_t misses, uint32_t perc) "Config cache MISS for sid %d (hits=%d, misses=%d, hit rate=%d)"
|
||
|
-smmuv3_cmdq_tlbi_nh_va(int vmid, int asid, uint64_t addr, bool leaf) "vmid =%d asid =%d addr=0x%"PRIx64" leaf=%d"
|
||
|
-smmuv3_cmdq_tlbi_nh_vaa(int vmid, uint64_t addr) "vmid =%d addr=0x%"PRIx64
|
||
|
+smmuv3_s1_range_inval(int vmid, int asid, uint64_t addr, bool leaf) "vmid =%d asid =%d addr=0x%"PRIx64" leaf=%d"
|
||
|
smmuv3_cmdq_tlbi_nh(void) ""
|
||
|
smmuv3_cmdq_tlbi_nh_asid(uint16_t asid) "asid=%d"
|
||
|
smmuv3_config_cache_inv(uint32_t sid) "Config cache INV for sid %d"
|
||
|
--
|
||
|
2.27.0
|
||
|
|