[PATCH] ARM: mvebu: fix cpuidle implementation to work on big-endian systems

Jason Cooper jason at lakedaemon.net
Fri Jun 20 13:28:17 PDT 2014


On Mon, May 26, 2014 at 06:14:09PM +0200, Thomas Petazzoni wrote:
> On Marvell Armada XP, when a CPU comes back from deep idle state of
> cpuidle, it restarts its execution at armada_370_xp_cpu_resume(),
> which puts back the CPU into the coherency, and then calls the generic
> cpu_resume() function.
> 
> While this works on little-endian configurations, it doesn't work on
> big-endian configurations because the CPU restarts in little-endian,
> and therefore must be switched back to big-endian to operate
> properly. To achieve this, a 'setend be' instruction must be executed
> in big-endian configurations. However, the ARM_BE8() macro that is
> used to implement nice compile-time conditional for ARM LE vs. ARM BE8
> is not easily usable in inline assembly.
> 
> Therefore, this patch moves the armada_370_xp_cpu_resume() C function,
> which was anyway just a block of inline assembly, into a proper
> pmsu_ll.S file, and adds the appropriate ARM_BE8(setend be)
> instruction.
> 
> Without this patch, an Armada XP big endian configuration with cpuidle
> enabled fails to boot, as it hangs as soon as one of the CPU hits the
> deep idle state.
> 
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
> ---
>  arch/arm/mach-mvebu/Makefile  |  2 +-
>  arch/arm/mach-mvebu/pmsu.c    |  9 ++-------
>  arch/arm/mach-mvebu/pmsu_ll.S | 25 +++++++++++++++++++++++++
>  3 files changed, 28 insertions(+), 8 deletions(-)
>  create mode 100644 arch/arm/mach-mvebu/pmsu_ll.S

This fails to apply to v3.16-rc1.  Please rebase and re-submit.

thx,

Jason.



More information about the linux-arm-kernel mailing list