/* * arch/arm/include/asm/tc2_pm_setup.S * * Created by: Nicolas Pitre, October 2012 ( (based on dcscb_setup.S by Dave Martin) * Copyright: (C) 2012 Linaro Limited * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include #include #define SPC_PHYS_BASE 0x7FFF0000 #define SPC_WAKE_INT_STAT 0xb2c #define SNOOP_CTL_A15 0x404 #define SNOOP_CTL_A7 0x504 #define A15_SNOOP_MASK (0x3 << 7) #define A7_SNOOP_MASK (0x1 << 13) #define A15_BX_ADDR0 0xB68 ENTRY(tc2_resume) mrc p15, 0, r0, c0, c0, 5 ubfx r1, r0, #0, #4 @ r1 = cpu ubfx r2, r0, #8, #4 @ r2 = cluster add r1, r1, r2, lsl #2 @ r1 = index of CPU in WAKE_INT_STAT ldr r3, =SPC_PHYS_BASE + SPC_WAKE_INT_STAT ldr r3, [r3] lsr r3, r1 tst r3, #1 wfieq @ if no pending IRQ reenters wfi b mcpm_entry_point ENDPROC(tc2_resume) /* * Enable cluster-level coherency, in preparation for turning on the MMU. * The ACTLR SMP bit does not need to be set here, because cpu_resume() * already restores that. */ ENTRY(tc2_pm_power_up_setup) cmp r0, #0 beq 2f b cci_enable_port_for_self 2: @ Clear the BX addr register ldr r3, =SPC_PHYS_BASE + A15_BX_ADDR0 mrc p15, 0, r0, c0, c0, 5 @ MPIDR ubfx r1, r0, #8, #4 @ cluster ubfx r0, r0, #0, #4 @ cpu add r3, r3, r1, lsl #4 mov r1, #0 str r1, [r3, r0, lsl #2] dsb bx lr ENDPROC(tc2_pm_power_up_setup)