Nathan Lynch <nath...@linux.ibm.com> writes: > sys_rtas() cannot call ibm,suspend-me directly in the same way it > handles other inputs. Instead it must dispatch the request to code > that can first perform the H_JOIN sequence before any call to > ibm,suspend-me can succeed. Over time kernel/rtas.c has accreted a fair > amount of platform-specific code to implement this. > > Since a different, more robust implementation of the suspend sequence > is now in the pseries platform code, we want to dispatch the request > there while minimizing additional dependence on pseries. > > Use a weak function that only pseries overrides.
Over the years weak functions have caused their fair share of problems. There are cases where they are the cleanest option, but for intra-arch code like this I think and ifdef is much simpler. > diff --git a/arch/powerpc/include/asm/rtas.h b/arch/powerpc/include/asm/rtas.h > index fdefe6a974eb..be0fc2536673 100644 > --- a/arch/powerpc/include/asm/rtas.h > +++ b/arch/powerpc/include/asm/rtas.h > @@ -260,6 +260,7 @@ extern int rtas_suspend_cpu(struct rtas_suspend_me_data > *data); > extern int rtas_suspend_last_cpu(struct rtas_suspend_me_data *data); > int rtas_ibm_suspend_me_unsafe(u64 handle); > int rtas_ibm_suspend_me(int *fw_status); > +int rtas_syscall_dispatch_ibm_suspend_me(u64 handle); ie. we'd just do: #ifdef CONFIG_PPC_PSERIES int rtas_syscall_dispatch_ibm_suspend_me(u64 handle); #else int rtas_syscall_dispatch_ibm_suspend_me(u64 handle) { return -EINVAL; } #endif cheers