Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/arm/mach-exynos/sleep.S
26292 views
1
/* SPDX-License-Identifier: GPL-2.0+ */
2
/*
3
* Copyright (c) 2013 Samsung Electronics Co., Ltd.
4
* http://www.samsung.com
5
*
6
* Exynos low-level resume code
7
*/
8
9
#include <linux/linkage.h>
10
#include <asm/asm-offsets.h>
11
#include <asm/hardware/cache-l2x0.h>
12
#include "smc.h"
13
14
#define CPU_MASK 0xff0ffff0
15
#define CPU_CORTEX_A9 0x410fc090
16
17
.text
18
.align
19
20
/*
21
* sleep magic, to allow the bootloader to check for an valid
22
* image to resume to. Must be the first word before the
23
* exynos_cpu_resume entry.
24
*/
25
26
.word 0x2bedf00d
27
28
/*
29
* exynos_cpu_resume
30
*
31
* resume code entry for bootloader to call
32
*/
33
34
ENTRY(exynos_cpu_resume)
35
#ifdef CONFIG_CACHE_L2X0
36
mrc p15, 0, r0, c0, c0, 0
37
ldr r1, =CPU_MASK
38
and r0, r0, r1
39
ldr r1, =CPU_CORTEX_A9
40
cmp r0, r1
41
bleq l2c310_early_resume
42
#endif
43
b cpu_resume
44
ENDPROC(exynos_cpu_resume)
45
46
.align
47
.arch armv7-a
48
.arch_extension sec
49
ENTRY(exynos_cpu_resume_ns)
50
mrc p15, 0, r0, c0, c0, 0
51
ldr r1, =CPU_MASK
52
and r0, r0, r1
53
ldr r1, =CPU_CORTEX_A9
54
cmp r0, r1
55
bne skip_cp15
56
57
adr r0, _cp15_save_power
58
ldr r1, [r0]
59
ldr r1, [r0, r1]
60
adr r0, _cp15_save_diag
61
ldr r2, [r0]
62
ldr r2, [r0, r2]
63
mov r0, #SMC_CMD_C15RESUME
64
dsb
65
smc #0
66
#ifdef CONFIG_CACHE_L2X0
67
adr r0, 1f
68
ldr r2, [r0]
69
add r0, r2, r0
70
71
/* Check that the address has been initialised. */
72
ldr r1, [r0, #L2X0_R_PHY_BASE]
73
teq r1, #0
74
beq skip_l2x0
75
76
/* Check if controller has been enabled. */
77
ldr r2, [r1, #L2X0_CTRL]
78
tst r2, #0x1
79
bne skip_l2x0
80
81
ldr r1, [r0, #L2X0_R_TAG_LATENCY]
82
ldr r2, [r0, #L2X0_R_DATA_LATENCY]
83
ldr r3, [r0, #L2X0_R_PREFETCH_CTRL]
84
mov r0, #SMC_CMD_L2X0SETUP1
85
smc #0
86
87
/* Reload saved regs pointer because smc corrupts registers. */
88
adr r0, 1f
89
ldr r2, [r0]
90
add r0, r2, r0
91
92
ldr r1, [r0, #L2X0_R_PWR_CTRL]
93
ldr r2, [r0, #L2X0_R_AUX_CTRL]
94
mov r0, #SMC_CMD_L2X0SETUP2
95
smc #0
96
97
mov r0, #SMC_CMD_L2X0INVALL
98
smc #0
99
100
mov r1, #1
101
mov r0, #SMC_CMD_L2X0CTRL
102
smc #0
103
skip_l2x0:
104
#endif /* CONFIG_CACHE_L2X0 */
105
skip_cp15:
106
b cpu_resume
107
ENDPROC(exynos_cpu_resume_ns)
108
109
.align
110
_cp15_save_power:
111
.long cp15_save_power - .
112
_cp15_save_diag:
113
.long cp15_save_diag - .
114
#ifdef CONFIG_CACHE_L2X0
115
1: .long l2x0_saved_regs - .
116
#endif /* CONFIG_CACHE_L2X0 */
117
118
.data
119
.align 2
120
.globl cp15_save_diag
121
cp15_save_diag:
122
.long 0 @ cp15 diagnostic
123
.globl cp15_save_power
124
cp15_save_power:
125
.long 0 @ cp15 power control
126
127