Skip to content
  • Thomas Petazzoni's avatar
    ARM: mvebu: fix cpuidle implementation to work on big-endian systems · 6509dc74
    Thomas Petazzoni authored
    
    
    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: default avatarThomas Petazzoni <thomas.petazzoni@free-electrons.com>
    Link: https://lkml.kernel.org/r/1404130165-3593-1-git-send-email-thomas.petazzoni@free-electrons.com
    
    
    Signed-off-by: default avatarJason Cooper <jason@lakedaemon.net>
    6509dc74