143 lines
4.7 KiB
Diff
143 lines
4.7 KiB
Diff
|
|
From a051e4349316d7065c9418de691787edae8e7f4e Mon Sep 17 00:00:00 2001
|
||
|
|
From: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||
|
|
Date: Wed, 5 Jun 2024 16:30:41 +0800
|
||
|
|
Subject: [PATCH] intel_iommu: Extract out vtd_cap_init() to initialize
|
||
|
|
cap/ecap
|
||
|
|
|
||
|
|
Extract cap/ecap initialization in vtd_cap_init() to make code
|
||
|
|
cleaner.
|
||
|
|
|
||
|
|
No functional change intended.
|
||
|
|
|
||
|
|
Reviewed-by: Eric Auger <eric.auger@redhat.com>
|
||
|
|
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
|
||
|
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
||
|
|
---
|
||
|
|
hw/i386/intel_iommu.c | 93 ++++++++++++++++++++++++-------------------
|
||
|
|
1 file changed, 51 insertions(+), 42 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
|
||
|
|
index 3da56e439e..6716407b7a 100644
|
||
|
|
--- a/hw/i386/intel_iommu.c
|
||
|
|
+++ b/hw/i386/intel_iommu.c
|
||
|
|
@@ -3935,30 +3935,10 @@ static void vtd_iommu_replay(IOMMUMemoryRegion *iommu_mr, IOMMUNotifier *n)
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
-/* Do the initialization. It will also be called when reset, so pay
|
||
|
|
- * attention when adding new initialization stuff.
|
||
|
|
- */
|
||
|
|
-static void vtd_init(IntelIOMMUState *s)
|
||
|
|
+static void vtd_cap_init(IntelIOMMUState *s)
|
||
|
|
{
|
||
|
|
X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(s);
|
||
|
|
|
||
|
|
- memset(s->csr, 0, DMAR_REG_SIZE);
|
||
|
|
- memset(s->wmask, 0, DMAR_REG_SIZE);
|
||
|
|
- memset(s->w1cmask, 0, DMAR_REG_SIZE);
|
||
|
|
- memset(s->womask, 0, DMAR_REG_SIZE);
|
||
|
|
-
|
||
|
|
- s->root = 0;
|
||
|
|
- s->root_scalable = false;
|
||
|
|
- s->dmar_enabled = false;
|
||
|
|
- s->intr_enabled = false;
|
||
|
|
- s->iq_head = 0;
|
||
|
|
- s->iq_tail = 0;
|
||
|
|
- s->iq = 0;
|
||
|
|
- s->iq_size = 0;
|
||
|
|
- s->qi_enabled = false;
|
||
|
|
- s->iq_last_desc_type = VTD_INV_DESC_NONE;
|
||
|
|
- s->iq_dw = false;
|
||
|
|
- s->next_frcd_reg = 0;
|
||
|
|
s->cap = VTD_CAP_FRO | VTD_CAP_NFR | VTD_CAP_ND |
|
||
|
|
VTD_CAP_MAMV | VTD_CAP_PSI | VTD_CAP_SLLPS |
|
||
|
|
VTD_CAP_MGAW(s->aw_bits);
|
||
|
|
@@ -3975,27 +3955,6 @@ static void vtd_init(IntelIOMMUState *s)
|
||
|
|
}
|
||
|
|
s->ecap = VTD_ECAP_QI | VTD_ECAP_IRO;
|
||
|
|
|
||
|
|
- /*
|
||
|
|
- * Rsvd field masks for spte
|
||
|
|
- */
|
||
|
|
- vtd_spte_rsvd[0] = ~0ULL;
|
||
|
|
- vtd_spte_rsvd[1] = VTD_SPTE_PAGE_L1_RSVD_MASK(s->aw_bits,
|
||
|
|
- x86_iommu->dt_supported);
|
||
|
|
- vtd_spte_rsvd[2] = VTD_SPTE_PAGE_L2_RSVD_MASK(s->aw_bits);
|
||
|
|
- vtd_spte_rsvd[3] = VTD_SPTE_PAGE_L3_RSVD_MASK(s->aw_bits);
|
||
|
|
- vtd_spte_rsvd[4] = VTD_SPTE_PAGE_L4_RSVD_MASK(s->aw_bits);
|
||
|
|
-
|
||
|
|
- vtd_spte_rsvd_large[2] = VTD_SPTE_LPAGE_L2_RSVD_MASK(s->aw_bits,
|
||
|
|
- x86_iommu->dt_supported);
|
||
|
|
- vtd_spte_rsvd_large[3] = VTD_SPTE_LPAGE_L3_RSVD_MASK(s->aw_bits,
|
||
|
|
- x86_iommu->dt_supported);
|
||
|
|
-
|
||
|
|
- if (s->scalable_mode || s->snoop_control) {
|
||
|
|
- vtd_spte_rsvd[1] &= ~VTD_SPTE_SNP;
|
||
|
|
- vtd_spte_rsvd_large[2] &= ~VTD_SPTE_SNP;
|
||
|
|
- vtd_spte_rsvd_large[3] &= ~VTD_SPTE_SNP;
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
if (x86_iommu_ir_supported(x86_iommu)) {
|
||
|
|
s->ecap |= VTD_ECAP_IR | VTD_ECAP_MHMV;
|
||
|
|
if (s->intr_eim == ON_OFF_AUTO_ON) {
|
||
|
|
@@ -4028,6 +3987,56 @@ static void vtd_init(IntelIOMMUState *s)
|
||
|
|
if (s->pasid) {
|
||
|
|
s->ecap |= VTD_ECAP_PASID;
|
||
|
|
}
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+/*
|
||
|
|
+ * Do the initialization. It will also be called when reset, so pay
|
||
|
|
+ * attention when adding new initialization stuff.
|
||
|
|
+ */
|
||
|
|
+static void vtd_init(IntelIOMMUState *s)
|
||
|
|
+{
|
||
|
|
+ X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(s);
|
||
|
|
+
|
||
|
|
+ memset(s->csr, 0, DMAR_REG_SIZE);
|
||
|
|
+ memset(s->wmask, 0, DMAR_REG_SIZE);
|
||
|
|
+ memset(s->w1cmask, 0, DMAR_REG_SIZE);
|
||
|
|
+ memset(s->womask, 0, DMAR_REG_SIZE);
|
||
|
|
+
|
||
|
|
+ s->root = 0;
|
||
|
|
+ s->root_scalable = false;
|
||
|
|
+ s->dmar_enabled = false;
|
||
|
|
+ s->intr_enabled = false;
|
||
|
|
+ s->iq_head = 0;
|
||
|
|
+ s->iq_tail = 0;
|
||
|
|
+ s->iq = 0;
|
||
|
|
+ s->iq_size = 0;
|
||
|
|
+ s->qi_enabled = false;
|
||
|
|
+ s->iq_last_desc_type = VTD_INV_DESC_NONE;
|
||
|
|
+ s->iq_dw = false;
|
||
|
|
+ s->next_frcd_reg = 0;
|
||
|
|
+
|
||
|
|
+ vtd_cap_init(s);
|
||
|
|
+
|
||
|
|
+ /*
|
||
|
|
+ * Rsvd field masks for spte
|
||
|
|
+ */
|
||
|
|
+ vtd_spte_rsvd[0] = ~0ULL;
|
||
|
|
+ vtd_spte_rsvd[1] = VTD_SPTE_PAGE_L1_RSVD_MASK(s->aw_bits,
|
||
|
|
+ x86_iommu->dt_supported);
|
||
|
|
+ vtd_spte_rsvd[2] = VTD_SPTE_PAGE_L2_RSVD_MASK(s->aw_bits);
|
||
|
|
+ vtd_spte_rsvd[3] = VTD_SPTE_PAGE_L3_RSVD_MASK(s->aw_bits);
|
||
|
|
+ vtd_spte_rsvd[4] = VTD_SPTE_PAGE_L4_RSVD_MASK(s->aw_bits);
|
||
|
|
+
|
||
|
|
+ vtd_spte_rsvd_large[2] = VTD_SPTE_LPAGE_L2_RSVD_MASK(s->aw_bits,
|
||
|
|
+ x86_iommu->dt_supported);
|
||
|
|
+ vtd_spte_rsvd_large[3] = VTD_SPTE_LPAGE_L3_RSVD_MASK(s->aw_bits,
|
||
|
|
+ x86_iommu->dt_supported);
|
||
|
|
+
|
||
|
|
+ if (s->scalable_mode || s->snoop_control) {
|
||
|
|
+ vtd_spte_rsvd[1] &= ~VTD_SPTE_SNP;
|
||
|
|
+ vtd_spte_rsvd_large[2] &= ~VTD_SPTE_SNP;
|
||
|
|
+ vtd_spte_rsvd_large[3] &= ~VTD_SPTE_SNP;
|
||
|
|
+ }
|
||
|
|
|
||
|
|
vtd_reset_caches(s);
|
||
|
|
|
||
|
|
--
|
||
|
|
2.41.0.windows.1
|
||
|
|
|