[PATCH 15/19] firmware/psci: Extend ->cpu_on() callback to take an additional argument
Jinjie Ruan
ruanjinjie at huawei.com
Tue Sep 8 05:05:23 PDT 2026
Reviewed-by: Jinjie Ruan <ruanjinjie at huawei.com>
在 2026/9/8 0:40, Will Deacon 写道:
> In preparation for hooking up the 'context ID' parameter introduced by
> PSCI v0.2 to the CPU_ON call, extend the ->cpu_on() callback to take
> an additional argument and modify all callers to pass 0 for now.
>
> Signed-off-by: Will Deacon <will at kernel.org>
> ---
> arch/arm/kernel/psci_smp.c | 4 ++--
> arch/arm64/kernel/psci.c | 2 +-
> drivers/firmware/psci/psci.c | 20 ++++++++++++++------
> include/linux/psci.h | 3 ++-
> 4 files changed, 19 insertions(+), 10 deletions(-)
>
> diff --git a/arch/arm/kernel/psci_smp.c b/arch/arm/kernel/psci_smp.c
> index 3bb0c4dcfc5c..bf05dbf433b1 100644
> --- a/arch/arm/kernel/psci_smp.c
> +++ b/arch/arm/kernel/psci_smp.c
> @@ -49,10 +49,10 @@ static int psci_boot_secondary(unsigned int cpu, struct task_struct *idle)
> return psci_ops.cpu_on(cpu_logical_map(cpu),
> ((phys_addr_t)(&secondary_startup)
> - XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR)
> - + CONFIG_XIP_PHYS_ADDR));
> + + CONFIG_XIP_PHYS_ADDR), 0);
> #else
> return psci_ops.cpu_on(cpu_logical_map(cpu),
> - virt_to_idmap(&secondary_startup));
> + virt_to_idmap(&secondary_startup), 0);
> #endif
> return -ENODEV;
> }
> diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
> index fabd732d0a2d..6b25a12ed143 100644
> --- a/arch/arm64/kernel/psci.c
> +++ b/arch/arm64/kernel/psci.c
> @@ -39,7 +39,7 @@ static int __init cpu_psci_cpu_prepare(unsigned int cpu)
> static int cpu_psci_cpu_boot(unsigned int cpu)
> {
> phys_addr_t pa_secondary_entry = __pa_symbol(secondary_entry);
> - int err = psci_ops.cpu_on(cpu_logical_map(cpu), pa_secondary_entry);
> + int err = psci_ops.cpu_on(cpu_logical_map(cpu), pa_secondary_entry, 0);
> if (err && err != -EPERM)
> pr_err("failed to boot CPU%d (%d)\n", cpu, err);
>
> diff --git a/drivers/firmware/psci/psci.c b/drivers/firmware/psci/psci.c
> index 8bb3f7c37678..95034485cb4d 100644
> --- a/drivers/firmware/psci/psci.c
> +++ b/drivers/firmware/psci/psci.c
> @@ -219,22 +219,30 @@ static int psci_0_2_cpu_off(u32 state)
> return __psci_cpu_off(PSCI_0_2_FN_CPU_OFF, state);
> }
>
> -static int __psci_cpu_on(u32 fn, unsigned long cpuid, unsigned long entry_point)
> +static int __psci_cpu_on(u32 fn, unsigned long cpuid, unsigned long entry_point,
> + unsigned long context)
> {
> int err;
>
> - err = invoke_psci_fn(fn, cpuid, entry_point, 0);
> + err = invoke_psci_fn(fn, cpuid, entry_point, context);
> return psci_to_linux_errno(err);
> }
>
> -static int psci_0_1_cpu_on(unsigned long cpuid, unsigned long entry_point)
> +static int psci_0_1_cpu_on(unsigned long cpuid, unsigned long entry_point,
> + unsigned long mbz)
> {
> - return __psci_cpu_on(psci_0_1_function_ids.cpu_on, cpuid, entry_point);
> + if (mbz)
> + return -EINVAL;
> +
> + return __psci_cpu_on(psci_0_1_function_ids.cpu_on, cpuid, entry_point,
> + 0);
> }
>
> -static int psci_0_2_cpu_on(unsigned long cpuid, unsigned long entry_point)
> +static int psci_0_2_cpu_on(unsigned long cpuid, unsigned long entry_point,
> + unsigned long context)
> {
> - return __psci_cpu_on(PSCI_FN_NATIVE(0_2, CPU_ON), cpuid, entry_point);
> + return __psci_cpu_on(PSCI_FN_NATIVE(0_2, CPU_ON), cpuid, entry_point,
> + context);
> }
>
> static int __psci_migrate(u32 fn, unsigned long cpuid)
> diff --git a/include/linux/psci.h b/include/linux/psci.h
> index 4ca0060a3fc4..0f43868a0bee 100644
> --- a/include/linux/psci.h
> +++ b/include/linux/psci.h
> @@ -25,7 +25,8 @@ struct psci_operations {
> u32 (*get_version)(void);
> int (*cpu_suspend)(u32 state, unsigned long entry_point);
> int (*cpu_off)(u32 state);
> - int (*cpu_on)(unsigned long cpuid, unsigned long entry_point);
> + int (*cpu_on)(unsigned long cpuid, unsigned long entry_point,
> + unsigned long context);
> int (*migrate)(unsigned long cpuid);
> int (*affinity_info)(unsigned long target_affinity,
> unsigned long lowest_affinity_level);
More information about the linux-arm-kernel
mailing list