mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
x86/x2APIC: defer probe until after IOMMU ACPI table parsing
While commit 46c4061cd2 ("x86/IOMMU: mark IOMMU / intremap not in use
when ACPI tables are missing") deals with apic_x2apic_probe() as called
from x2apic_bsp_setup(), the check_x2apic_preenabled() path is similarly
affected: The call needs to occur after acpi_iommu_init(), such that
iommu_intremap getting disabled there can be properly taken into account
by apic_x2apic_probe().
Note that, for the time being (further cleanup patches following),
reversing the order of the calls to generic_apic_probe() and
acpi_boot_init() is not an option:
- acpi_process_madt() calls clustered_apic_check() and hence relies on
genapic to have got filled before,
- generic_bigsmp_probe() (called from acpi_process_madt()) needs to
occur after generic_apic_probe(),
- acpi_parse_madt() (called from acpi_process_madt()) calls
acpi_madt_oem_check(), which wants to be after generic_apic_probe().
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
This commit is contained in:
1 parent
d159edac73
commit
3950f2485b
3 files changed
+24
-8
No files matched your search
@@ -742,8 +742,6 @@ int __init acpi_boot_init(void)
|
||||
|
||||
acpi_mmcfg_init();
|
||||
|
||||
acpi_iommu_init();
|
||||
|
||||
erst_init();
|
||||
|
||||
acpi_hest_init();
|
||||
|
||||
+17
-2
@@ -1664,15 +1664,30 @@ void __init noreturn __start_xen(unsigned long mbi_p)
|
||||
|
||||
dmi_scan_machine();
|
||||
|
||||
generic_apic_probe();
|
||||
|
||||
mmio_ro_ranges = rangeset_new(NULL, "r/o mmio ranges",
|
||||
RANGESETF_prettyprint_hex);
|
||||
|
||||
xsm_multiboot_init(module_map, mbi);
|
||||
|
||||
/*
|
||||
* IOMMU-related ACPI table parsing may require some of the system domains
|
||||
* to be usable, e.g. for pci_hide_device()'s use of dom_xen.
|
||||
*/
|
||||
setup_system_domains();
|
||||
|
||||
/*
|
||||
* IOMMU-related ACPI table parsing has to happen before APIC probing, for
|
||||
* check_x2apic_preenabled() to be able to observe respective findings, in
|
||||
* particular iommu_intremap having got turned off.
|
||||
*/
|
||||
acpi_iommu_init();
|
||||
|
||||
/*
|
||||
* APIC probing needs to happen before general ACPI table parsing, as e.g.
|
||||
* generic_bigsmp_probe() may occur only afterwards.
|
||||
*/
|
||||
generic_apic_probe();
|
||||
|
||||
acpi_boot_init();
|
||||
|
||||
if ( smp_found_config )
|
||||
|
||||
@@ -43,14 +43,17 @@ bool __read_mostly iommu_intpost;
|
||||
|
||||
void __init acpi_iommu_init(void)
|
||||
{
|
||||
int ret;
|
||||
int ret = -ENODEV;
|
||||
|
||||
if ( !iommu_enable && !iommu_intremap )
|
||||
return;
|
||||
|
||||
ret = acpi_dmar_init();
|
||||
if ( ret == -ENODEV )
|
||||
ret = acpi_ivrs_init();
|
||||
if ( !acpi_disabled )
|
||||
{
|
||||
ret = acpi_dmar_init();
|
||||
if ( ret == -ENODEV )
|
||||
ret = acpi_ivrs_init();
|
||||
}
|
||||
|
||||
if ( ret )
|
||||
{
|
||||
|
||||