[PATCH 15/19] firmware/psci: Extend ->cpu_on() callback to take an additional argument
Will Deacon
will at kernel.org
Mon Sep 7 09:40:18 PDT 2026
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);
--
2.55.0.979.g7e5102b832-goog
More information about the linux-arm-kernel
mailing list