mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
In preparation for converting the hotpath APIC callbacks to static keys, provide common initialization infrastructure. Lift apic_install_drivers() from probe_64.c and convert all places which switch the apic instance by storing the pointer to use apic_install_driver() as a first step. 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)
48 lines
1.1 KiB
C
48 lines
1.1 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
#define pr_fmt(fmt) "APIC: " fmt
|
|
|
|
#include <asm/apic.h>
|
|
|
|
#include "local.h"
|
|
|
|
void __init apic_install_driver(struct apic *driver)
|
|
{
|
|
if (apic == driver)
|
|
return;
|
|
|
|
apic = driver;
|
|
|
|
if (IS_ENABLED(CONFIG_X86_X2APIC) && apic->x2apic_set_max_apicid)
|
|
apic->max_apic_id = x2apic_max_apicid;
|
|
|
|
pr_info("Switched APIC routing to: %s\n", driver->name);
|
|
}
|
|
|
|
#ifdef CONFIG_X86_64
|
|
void __init acpi_wake_cpu_handler_update(wakeup_cpu_handler handler)
|
|
{
|
|
struct apic **drv;
|
|
|
|
for (drv = __apicdrivers; drv < __apicdrivers_end; drv++)
|
|
(*drv)->wakeup_secondary_cpu_64 = handler;
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
* Override the generic EOI implementation with an optimized version.
|
|
* Only called during early boot when only one CPU is active and with
|
|
* interrupts disabled, so we know this does not race with actual APIC driver
|
|
* use.
|
|
*/
|
|
void __init apic_set_eoi_cb(void (*eoi)(void))
|
|
{
|
|
struct apic **drv;
|
|
|
|
for (drv = __apicdrivers; drv < __apicdrivers_end; drv++) {
|
|
/* Should happen once for each apic */
|
|
WARN_ON((*drv)->eoi == eoi);
|
|
(*drv)->native_eoi = (*drv)->eoi;
|
|
(*drv)->eoi = eoi;
|
|
}
|
|
}
|