69 lines
1.5 KiB
ArmAsm
69 lines
1.5 KiB
ArmAsm
/*
|
|
* 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 <linux/linkage.h>
|
|
#include <asm/mcpm.h>
|
|
|
|
|
|
#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)
|