On Sat, May 3, 2025 at 9:10 PM Ricardo Neri <ricardo.neri-calde...@linux.intel.com> wrote: > > In preparation to move the functionality to wake secondary CPUs up out of > the ACPI code, add a helper function that stores the physical address of > the mailbox and updates the wakeup_secondary_cpu_64() APIC callback. > > There is a slight change in behavior: now the APIC callback is updated > before configuring CPU hotplug offline behavior. This is fine as the APIC > callback continues to be updated unconditionally, regardless of the > restriction on CPU offlining. > > The wakeup mailbox is only supported for CONFIG_X86_64 and needed only with > CONFIG_SMP=y. > > Signed-off-by: Ricardo Neri <ricardo.neri-calde...@linux.intel.com> > --- > Changes since v2: > - Introduced this patch. > > Changes since v1: > - N/A > --- > arch/x86/include/asm/smp.h | 4 ++++ > arch/x86/kernel/acpi/madt_wakeup.c | 10 +++++++--- > 2 files changed, 11 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h > index 0c1c68039d6f..3622951d2ee0 100644 > --- a/arch/x86/include/asm/smp.h > +++ b/arch/x86/include/asm/smp.h > @@ -146,6 +146,10 @@ static inline struct cpumask *cpu_l2c_shared_mask(int > cpu) > return per_cpu(cpu_l2c_shared_map, cpu); > } > > +#ifdef CONFIG_X86_64 > +void setup_mp_wakeup_mailbox(u64 addr); > +#endif
The #ifdef is only necessary if you are going to provide an alternative for builds in which the symbol is unset. > + > #else /* !CONFIG_SMP */ > #define wbinvd_on_cpu(cpu) wbinvd() > static inline int wbinvd_on_all_cpus(void) > diff --git a/arch/x86/kernel/acpi/madt_wakeup.c > b/arch/x86/kernel/acpi/madt_wakeup.c > index f36f28405dcc..04de3db307de 100644 > --- a/arch/x86/kernel/acpi/madt_wakeup.c > +++ b/arch/x86/kernel/acpi/madt_wakeup.c > @@ -227,7 +227,7 @@ int __init acpi_parse_mp_wake(union acpi_subtable_headers > *header, > > acpi_table_print_madt_entry(&header->common); > > - acpi_mp_wake_mailbox_paddr = mp_wake->mailbox_address; > + setup_mp_wakeup_mailbox(mp_wake->mailbox_address); I'd prefer acpi_setup_mp_wakeup_mailbox(). > > if (mp_wake->version >= ACPI_MADT_MP_WAKEUP_VERSION_V1 && > mp_wake->header.length >= ACPI_MADT_MP_WAKEUP_SIZE_V1) { > @@ -243,7 +243,11 @@ int __init acpi_parse_mp_wake(union > acpi_subtable_headers *header, > acpi_mp_disable_offlining(mp_wake); > } > > - apic_update_callback(wakeup_secondary_cpu_64, acpi_wakeup_cpu); > - > return 0; > } > + > +void __init setup_mp_wakeup_mailbox(u64 mailbox_paddr) > +{ > + acpi_mp_wake_mailbox_paddr = mailbox_paddr; > + apic_update_callback(wakeup_secondary_cpu_64, acpi_wakeup_cpu); > +} > -- > 2.43.0 > >