x86/apic: Split register_apic_address()
authorThomas Gleixner <tglx@linutronix.de>
Tue, 8 Aug 2023 22:03:48 +0000 (15:03 -0700)
committerDave Hansen <dave.hansen@linux.intel.com>
Wed, 9 Aug 2023 18:58:20 +0000 (11:58 -0700)
Split the fixmap setup out of register_lapic_address() and reuse it when
the X2APIC is disabled during setup.

This avoids registering the APIC ID (setting 'mp_lapic_addr') twice.

[ dhansen: changelog wording tweak ]

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Tested-by: Michael Kelley <mikelley@microsoft.com>
Tested-by: Sohil Mehta <sohil.mehta@intel.com>
Tested-by: Juergen Gross <jgross@suse.com> # Xen PV (dom0 and unpriv. guest)
arch/x86/kernel/apic/apic.c

index d0f4cca303788c95724999393847d7bf16fa7bd4..45ae178b9e50ea65f58c92d8e512119afed4ad80 100644 (file)
@@ -1852,6 +1852,8 @@ void x2apic_setup(void)
        __x2apic_enable();
 }
 
+static __init void apic_set_fixmap(void);
+
 static __init void x2apic_disable(void)
 {
        u32 x2apic_id, state = x2apic_state;
@@ -1872,7 +1874,7 @@ static __init void x2apic_disable(void)
        }
 
        __x2apic_disable();
-       register_lapic_address(mp_lapic_addr);
+       apic_set_fixmap();
 }
 
 static __init void x2apic_enable(void)
@@ -2145,17 +2147,21 @@ void __init init_apic_mappings(void)
        }
 }
 
+static __init void apic_set_fixmap(void)
+{
+       set_fixmap_nocache(FIX_APIC_BASE, mp_lapic_addr);
+       apic_mmio_base = APIC_BASE;
+       apic_printk(APIC_VERBOSE, "mapped APIC to %16lx (%16lx)\n",
+                   apic_mmio_base, mp_lapic_addr);
+       apic_read_boot_cpu_id(false);
+}
+
 void __init register_lapic_address(unsigned long address)
 {
        mp_lapic_addr = address;
 
-       if (x2apic_mode)
-               return;
-
-       set_fixmap_nocache(FIX_APIC_BASE, address);
-       apic_mmio_base = APIC_BASE;
-       apic_printk(APIC_VERBOSE, "mapped APIC to %16lx (%16lx)\n", APIC_BASE, address);
-       apic_read_boot_cpu_id(false);
+       if (!x2apic_mode)
+               apic_set_fixmap();
 }
 
 /*