|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] x86/iommu: setup MMCFG ahead of IOMMU
commit c292772b4945d3a264a61c3c1920f1aebd17998b
Author: Roger Pau Monne <roger.pau@xxxxxxxxxx>
AuthorDate: Mon Aug 18 10:16:36 2025 +0200
Commit: Roger Pau Monne <roger.pau@xxxxxxxxxx>
CommitDate: Thu Aug 21 11:57:25 2025 +0200
x86/iommu: setup MMCFG ahead of IOMMU
Otherwise the PCI accesses to segments different than the first one done by
the IOMMU initialization code would silently fail by returning all ones.
Introduce a new helper, called pci_setup(), and move both the creation of
PCI segment 0 internal data structures, plus the parsing of ACPI MMCFG
table to it. This moves acpi_mmcfg_init() slightly earlier from
acpi_boot_init() into pci_setup().
Note that further work will be needed to support systems where access
methods to segments different than 0 is not discoverable by Xen.
Fixes: 3950f2485bbc ('x86/x2APIC: defer probe until after IOMMU ACPI table
parsing')
Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
xen/arch/x86/acpi/boot.c | 2 --
xen/arch/x86/include/asm/pci.h | 2 ++
xen/arch/x86/pci.c | 16 ++++++++++++++++
xen/arch/x86/setup.c | 7 +++----
xen/arch/x86/x86_64/mmconfig-shared.c | 3 +++
5 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/xen/arch/x86/acpi/boot.c b/xen/arch/x86/acpi/boot.c
index 3901f9d982..1ca2360e00 100644
--- a/xen/arch/x86/acpi/boot.c
+++ b/xen/arch/x86/acpi/boot.c
@@ -748,8 +748,6 @@ int __init acpi_boot_init(void)
acpi_table_parse(ACPI_SIG_HPET, acpi_parse_hpet);
- acpi_mmcfg_init();
-
erst_init();
acpi_hest_init();
diff --git a/xen/arch/x86/include/asm/pci.h b/xen/arch/x86/include/asm/pci.h
index 665b321165..0b98081aea 100644
--- a/xen/arch/x86/include/asm/pci.h
+++ b/xen/arch/x86/include/asm/pci.h
@@ -74,4 +74,6 @@ bool pci_check_bar(const struct pci_dev *pdev, mfn_t start,
mfn_t end);
struct rangeset;
int pci_sanitize_bar_memory(struct rangeset *r);
+void pci_setup(void);
+
#endif /* __X86_PCI_H__ */
diff --git a/xen/arch/x86/pci.c b/xen/arch/x86/pci.c
index 26bb7f6a3c..fd0715fb6a 100644
--- a/xen/arch/x86/pci.c
+++ b/xen/arch/x86/pci.c
@@ -6,7 +6,10 @@
#include <xen/spinlock.h>
#include <xen/pci.h>
+
+#include <asm/acpi.h>
#include <asm/io.h>
+
#include <xsm/xsm.h>
static DEFINE_SPINLOCK(pci_config_lock);
@@ -139,6 +142,19 @@ int pci_sanitize_bar_memory(struct rangeset *r)
return 0;
}
+void __init pci_setup(void)
+{
+ /*
+ * Ahead of any ACPI table parsing make sure we have control structures
+ * for PCI segment 0.
+ */
+ if ( pci_add_segment(0) )
+ panic("Could not initialize PCI segment 0\n");
+
+ /* Parse ACPI MMCFG to see if other segments are available. */
+ acpi_mmcfg_init();
+}
+
/*
* Local variables:
* mode: C
diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
index 6fb42c5a5f..52c8a7adab 100644
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -1938,11 +1938,10 @@ void asmlinkage __init noreturn __start_xen(void)
setup_system_domains();
/*
- * Ahead of any ACPI table parsing make sure we have control structures
- * for PCI segment 0.
+ * Initialize PCI (create segment 0, setup MMCFG access) ahead of IOMMU
+ * setup, as devices in segment > 0 must also be discoverable.
*/
- if ( pci_add_segment(0) )
- panic("Could not initialize PCI segment 0\n");
+ pci_setup();
/*
* IOMMU-related ACPI table parsing has to happen before APIC probing, for
diff --git a/xen/arch/x86/x86_64/mmconfig-shared.c
b/xen/arch/x86/x86_64/mmconfig-shared.c
index f1a3d42c5b..fbe2676f86 100644
--- a/xen/arch/x86/x86_64/mmconfig-shared.c
+++ b/xen/arch/x86/x86_64/mmconfig-shared.c
@@ -402,6 +402,9 @@ void __init acpi_mmcfg_init(void)
{
bool valid = true;
+ if ( acpi_disabled )
+ return;
+
/* MMCONFIG disabled */
if ((pci_probe & PCI_PROBE_MMCONF) == 0)
return;
--
generated by git-patchbot for /home/xen/git/xen.git#staging
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |