[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