82 lines
2.8 KiB
Diff
82 lines
2.8 KiB
Diff
From 17ce6ac0d8edb04ba79bb39d3f695cd0506a9dc2 Mon Sep 17 00:00:00 2001
|
|
From: John Allen <john.allen@amd.com>
|
|
Date: Wed, 11 Dec 2024 15:06:59 -0600
|
|
Subject: [PATCH 06/57] amd_iommu: Send notification when invalidate interrupt
|
|
entry cache
|
|
|
|
RH-Author: John Allen <None>
|
|
RH-MergeRequest: 303: Interrupt Remap support for emulated amd viommu
|
|
RH-Jira: RHEL-66202
|
|
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
RH-Commit: [4/5] d57e8fb4e69f3c01d32673bf658aae5067d6b969 (johnalle/qemu-kvm-fork)
|
|
|
|
JIRA: https://issues.redhat.com/browse/RHEL-66202
|
|
|
|
commit f84aad4d718b83d2a4d90485992e5421430032e1
|
|
Author: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
|
Date: Fri Sep 27 12:29:12 2024 -0500
|
|
|
|
amd_iommu: Send notification when invalidate interrupt entry cache
|
|
|
|
In order to support AMD IOMMU interrupt remapping emulation with PCI
|
|
pass-through devices, QEMU needs to notify VFIO when guest IOMMU driver
|
|
updates and invalidate the guest interrupt remapping table (IRT), and
|
|
communicate information so that the host IOMMU driver can update
|
|
the shadowed interrupt remapping table in the host IOMMU.
|
|
|
|
Therefore, send notification when guest IOMMU emulates the IRT
|
|
invalidation commands.
|
|
|
|
Reviewed-by: Alejandro Jimenez <alejandro.j.jimenez@oracle.com>
|
|
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
|
Signed-off-by: Santosh Shukla <santosh.shukla@amd.com>
|
|
Message-Id: <20240927172913.121477-5-santosh.shukla@amd.com>
|
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
|
|
|
Signed-off-by: John Allen <john.allen@amd.com>
|
|
---
|
|
hw/i386/amd_iommu.c | 12 ++++++++++++
|
|
1 file changed, 12 insertions(+)
|
|
|
|
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
|
|
index 8fcf5eacb4..82d76dfca9 100644
|
|
--- a/hw/i386/amd_iommu.c
|
|
+++ b/hw/i386/amd_iommu.c
|
|
@@ -431,6 +431,12 @@ static void amdvi_complete_ppr(AMDVIState *s, uint64_t *cmd)
|
|
trace_amdvi_ppr_exec();
|
|
}
|
|
|
|
+static void amdvi_intremap_inval_notify_all(AMDVIState *s, bool global,
|
|
+ uint32_t index, uint32_t mask)
|
|
+{
|
|
+ x86_iommu_iec_notify_all(X86_IOMMU_DEVICE(s), global, index, mask);
|
|
+}
|
|
+
|
|
static void amdvi_inval_all(AMDVIState *s, uint64_t *cmd)
|
|
{
|
|
if (extract64(cmd[0], 0, 60) || cmd[1]) {
|
|
@@ -438,6 +444,9 @@ static void amdvi_inval_all(AMDVIState *s, uint64_t *cmd)
|
|
s->cmdbuf + s->cmdbuf_head);
|
|
}
|
|
|
|
+ /* Notify global invalidation */
|
|
+ amdvi_intremap_inval_notify_all(s, true, 0, 0);
|
|
+
|
|
amdvi_iotlb_reset(s);
|
|
trace_amdvi_all_inval();
|
|
}
|
|
@@ -486,6 +495,9 @@ static void amdvi_inval_inttable(AMDVIState *s, uint64_t *cmd)
|
|
return;
|
|
}
|
|
|
|
+ /* Notify global invalidation */
|
|
+ amdvi_intremap_inval_notify_all(s, true, 0, 0);
|
|
+
|
|
trace_amdvi_intr_inval();
|
|
}
|
|
|
|
--
|
|
2.39.3
|
|
|