From mboxrd@z Thu Jan 1 00:00:00 1970 From: hanjun.guo@linaro.org (Hanjun Guo) Date: Tue, 19 May 2015 16:25:31 +0800 Subject: [PATCHv2 05/12] arm64: psci: support unsigned return values In-Reply-To: <1431945503-6939-6-git-send-email-mark.rutland@arm.com> References: <1431945503-6939-1-git-send-email-mark.rutland@arm.com> <1431945503-6939-6-git-send-email-mark.rutland@arm.com> Message-ID: <555AF37B.9050300@linaro.org> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org 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 > Cc: Catalin Marinas > Cc: Lorenzo Pieralisi > Cc: Will Deacon > --- > 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 Thanks Hanjun