s/a helper/helper/ in the subject. On Sat, Jun 28, 2025 at 5:35 AM Ricardo Neri <ricardo.neri-calderon@xxxxxxxxxxxxxxx> wrote: > > In preparation to move the functionality to wake secondary CPUs up out of > the ACPI code, add two helper functions. > > The function acpi_setup_mp_wakeup_mailbox() 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 function acpi_madt_multiproc_wakeup_mailbox() returns a pointer to the > mailbox. Use this helper function only in the portions of the code for > which the variable acpi_mp_wake_mailbox will be out of scope once it is > relocated out of the ACPI directory. > > The wakeup mailbox is only supported for CONFIG_X86_64 and needed only with > CONFIG_SMP=y. > > Signed-off-by: Ricardo Neri <ricardo.neri-calderon@xxxxxxxxxxxxxxx> With the above nit addressed Acked-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx> > --- > Changes since v4: > - None > > Changes since v3: > - Squashed the two first patches of the series into one, both introduce > helper functions. (Rafael) > - Renamed setup_mp_wakeup_mailbox() as acpi_setup_mp_wakeup_mailbox(). > (Rafael) > - Dropped the function prototype for !CONFIG_X86_64. (Rafael) > > Changes since v2: > - Introduced this patch. > > Changes since v1: > - N/A > --- > arch/x86/include/asm/smp.h | 3 +++ > arch/x86/kernel/acpi/madt_wakeup.c | 20 +++++++++++++++----- > 2 files changed, 18 insertions(+), 5 deletions(-) > > diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h > index 0c1c68039d6f..77dce560a70a 100644 > --- a/arch/x86/include/asm/smp.h > +++ b/arch/x86/include/asm/smp.h > @@ -146,6 +146,9 @@ static inline struct cpumask *cpu_l2c_shared_mask(int cpu) > return per_cpu(cpu_l2c_shared_map, cpu); > } > > +void acpi_setup_mp_wakeup_mailbox(u64 addr); > +struct acpi_madt_multiproc_wakeup_mailbox *acpi_get_mp_wakeup_mailbox(void); > + > #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 6d7603511f52..c3ac5ecf3e7d 100644 > --- a/arch/x86/kernel/acpi/madt_wakeup.c > +++ b/arch/x86/kernel/acpi/madt_wakeup.c > @@ -37,6 +37,7 @@ static void acpi_mp_play_dead(void) > > static void acpi_mp_cpu_die(unsigned int cpu) > { > + struct acpi_madt_multiproc_wakeup_mailbox *mailbox = acpi_get_mp_wakeup_mailbox(); > u32 apicid = per_cpu(x86_cpu_to_apicid, cpu); > unsigned long timeout; > > @@ -46,13 +47,13 @@ static void acpi_mp_cpu_die(unsigned int cpu) > * > * BIOS has to clear 'command' field of the mailbox. > */ > - acpi_mp_wake_mailbox->apic_id = apicid; > - smp_store_release(&acpi_mp_wake_mailbox->command, > + mailbox->apic_id = apicid; > + smp_store_release(&mailbox->command, > ACPI_MP_WAKE_COMMAND_TEST); > > /* Don't wait longer than a second. */ > timeout = USEC_PER_SEC; > - while (READ_ONCE(acpi_mp_wake_mailbox->command) && --timeout) > + while (READ_ONCE(mailbox->command) && --timeout) > udelay(1); > > if (!timeout) > @@ -227,7 +228,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; > + acpi_setup_mp_wakeup_mailbox(mp_wake->mailbox_address); > > if (mp_wake->version >= ACPI_MADT_MP_WAKEUP_VERSION_V1 && > mp_wake->header.length >= ACPI_MADT_MP_WAKEUP_SIZE_V1) { > @@ -243,7 +244,16 @@ int __init acpi_parse_mp_wake(union acpi_subtable_headers *header, > acpi_mp_disable_offlining(mp_wake); > } > > + return 0; > +} > + > +void __init acpi_setup_mp_wakeup_mailbox(u64 mailbox_paddr) > +{ > + acpi_mp_wake_mailbox_paddr = mailbox_paddr; > apic_update_callback(wakeup_secondary_cpu_64, acpi_wakeup_cpu); > +} > > - return 0; > +struct acpi_madt_multiproc_wakeup_mailbox *acpi_get_mp_wakeup_mailbox(void) > +{ > + return acpi_mp_wake_mailbox; > } > > -- > 2.43.0 >