[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