[PATCHv2 05/12] arm64: psci: support unsigned return values
Hanjun Guo
hanjun.guo at linaro.org
Tue May 19 01:25:31 PDT 2015
On 2015年05月18日 18:38, Mark Rutland wrote:
> PSCI_VERSION and MIGRATE_INFO_TYPE_UP_CPU return unsigned values, with
> the latter returning a 64-bit value. However, the PSCI invocation
> functions have prototypes returning int.
>
> This patch upgrades the invocation functions to return unsigned long,
> with a new typedef to keep things legible. As PSCI_VERSION cannot return
> a negative value, the erroneous check against PSCI_RET_NOT_SUPPORTED is
> also removed. The unrelated psci_initcall_t typedef is moved closer to
> its first user, to avoid confusion with the invocation functions.
>
> In preparation for sharing the code with ARM, unsigned long is used in
> preference of u64. In the SMC32 calling convention, the relevant fields
> will be 32 bits wide.
>
> Signed-off-by: Mark Rutland <mark.rutland at arm.com>
> Cc: Catalin Marinas <catalin.marinas at arm.com>
> Cc: Lorenzo Pieralisi <lorenzo.pieralisi at arm.com>
> Cc: Will Deacon <will.deacon at arm.com>
> ---
> arch/arm64/kernel/psci.c | 47 ++++++++++++++++++-----------------------------
> 1 file changed, 18 insertions(+), 29 deletions(-)
>
> diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
> index 66b5b75..9c4de4b 100644
> --- a/arch/arm64/kernel/psci.c
> +++ b/arch/arm64/kernel/psci.c
> @@ -56,11 +56,11 @@ struct psci_operations {
>
> static struct psci_operations psci_ops;
>
> -static int (*invoke_psci_fn)(u64, u64, u64, u64);
> -typedef int (*psci_initcall_t)(const struct device_node *);
> -
> -asmlinkage int __invoke_psci_fn_hvc(u64, u64, u64, u64);
> -asmlinkage int __invoke_psci_fn_smc(u64, u64, u64, u64);
> +typedef unsigned long (psci_fn)(unsigned long, unsigned long,
> + unsigned long, unsigned long);
> +asmlinkage psci_fn __invoke_psci_fn_hvc;
> +asmlinkage psci_fn __invoke_psci_fn_smc;
> +static psci_fn *invoke_psci_fn;
>
> enum psci_function {
> PSCI_FN_CPU_SUSPEND,
> @@ -112,12 +112,9 @@ static void psci_power_state_unpack(u32 power_state,
> PSCI_0_2_POWER_STATE_AFFL_SHIFT;
> }
>
> -static int psci_get_version(void)
> +static u32 psci_get_version(void)
> {
> - int err;
> -
> - err = invoke_psci_fn(PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0);
> - return err;
> + return invoke_psci_fn(PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0);
> }
>
> static int psci_cpu_suspend(struct psci_power_state state,
> @@ -293,25 +290,15 @@ static void __init psci_0_2_set_functions(void)
> */
> static int __init psci_probe(void)
> {
> - int ver = psci_get_version();
> -
> - if (ver == PSCI_RET_NOT_SUPPORTED) {
> - /*
> - * PSCI versions >=0.2 mandates implementation of
> - * PSCI_VERSION.
> - */
> - pr_err("PSCI firmware does not comply with the v0.2 spec.\n");
> - return -EOPNOTSUPP;
> - } else {
> - pr_info("PSCIv%d.%d detected in firmware.\n",
> - PSCI_VERSION_MAJOR(ver),
> - PSCI_VERSION_MINOR(ver));
> -
> - if (PSCI_VERSION_MAJOR(ver) == 0 &&
> - PSCI_VERSION_MINOR(ver) < 2) {
> - pr_err("Conflicting PSCI version detected.\n");
> - return -EINVAL;
> - }
> + u32 ver = psci_get_version();
> +
> + pr_info("PSCIv%d.%d detected in firmware.\n",
> + PSCI_VERSION_MAJOR(ver),
> + PSCI_VERSION_MINOR(ver));
> +
> + if (PSCI_VERSION_MAJOR(ver) == 0 && PSCI_VERSION_MINOR(ver) < 2) {
> + pr_err("Conflicting PSCI version detected.\n");
> + return -EINVAL;
simplified the code both for DT and ACPI,
Reviewed-by: Hanjun Guo <hanjun.guo at linaro.org>
Thanks
Hanjun
More information about the linux-arm-kernel
mailing list