blob: ed478463721683b928d5e10dfb413ce182c9a124 [file] [log] [blame]
Yatharth Kochara9f776c2016-11-10 16:17:51 +00001/*
2 * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Yatharth Kochara9f776c2016-11-10 16:17:51 +00005 */
6#include <arch.h>
7#include <asm_macros.S>
8#include <assert_macros.S>
9#include <cortex_a57.h>
10#include <cpu_macros.S>
11#include <debug.h>
12
13 /* ---------------------------------------------
14 * Disable intra-cluster coherency
15 * Clobbers: r0-r1
16 * ---------------------------------------------
17 */
18func cortex_a57_disable_smp
Varun Wadekar1384a162017-06-05 14:54:46 -070019 ldcopr16 r0, r1, CORTEX_A57_ECTLR
20 bic64_imm r0, r1, CORTEX_A57_ECTLR_SMP_BIT
21 stcopr16 r0, r1, CORTEX_A57_ECTLR
Yatharth Kochara9f776c2016-11-10 16:17:51 +000022 bx lr
23endfunc cortex_a57_disable_smp
24
25 /* ---------------------------------------------
26 * Disable all types of L2 prefetches.
27 * Clobbers: r0-r2
28 * ---------------------------------------------
29 */
30func cortex_a57_disable_l2_prefetch
Varun Wadekar1384a162017-06-05 14:54:46 -070031 ldcopr16 r0, r1, CORTEX_A57_ECTLR
32 orr64_imm r0, r1, CORTEX_A57_ECTLR_DIS_TWD_ACC_PFTCH_BIT
33 bic64_imm r0, r1, (CORTEX_A57_ECTLR_L2_IPFTCH_DIST_MASK | \
34 CORTEX_A57_ECTLR_L2_DPFTCH_DIST_MASK)
35 stcopr16 r0, r1, CORTEX_A57_ECTLR
Yatharth Kochara9f776c2016-11-10 16:17:51 +000036 isb
37 dsb ish
38 bx lr
39endfunc cortex_a57_disable_l2_prefetch
40
41 /* ---------------------------------------------
42 * Disable debug interfaces
43 * ---------------------------------------------
44 */
45func cortex_a57_disable_ext_debug
46 mov r0, #1
47 stcopr r0, DBGOSDLR
48 isb
49 dsb sy
50 bx lr
51endfunc cortex_a57_disable_ext_debug
52
53 /* -------------------------------------------------
54 * The CPU Ops reset function for Cortex-A57.
55 * -------------------------------------------------
56 */
57func cortex_a57_reset_func
58 /* ---------------------------------------------
59 * Enable the SMP bit.
60 * ---------------------------------------------
61 */
Varun Wadekar1384a162017-06-05 14:54:46 -070062 ldcopr16 r0, r1, CORTEX_A57_ECTLR
63 orr64_imm r0, r1, CORTEX_A57_ECTLR_SMP_BIT
64 stcopr16 r0, r1, CORTEX_A57_ECTLR
Yatharth Kochara9f776c2016-11-10 16:17:51 +000065 isb
66 bx lr
67endfunc cortex_a57_reset_func
68
69 /* ----------------------------------------------------
70 * The CPU Ops core power down function for Cortex-A57.
71 * ----------------------------------------------------
72 */
73func cortex_a57_core_pwr_dwn
74 push {r12, lr}
75
76 /* Assert if cache is enabled */
77#if ASM_ASSERTION
78 ldcopr r0, SCTLR
79 tst r0, #SCTLR_C_BIT
80 ASM_ASSERT(eq)
81#endif
82
83 /* ---------------------------------------------
84 * Disable the L2 prefetches.
85 * ---------------------------------------------
86 */
87 bl cortex_a57_disable_l2_prefetch
88
89 /* ---------------------------------------------
90 * Flush L1 caches.
91 * ---------------------------------------------
92 */
93 mov r0, #DC_OP_CISW
94 bl dcsw_op_level1
95
96 /* ---------------------------------------------
97 * Come out of intra cluster coherency
98 * ---------------------------------------------
99 */
100 bl cortex_a57_disable_smp
101
102 /* ---------------------------------------------
103 * Force the debug interfaces to be quiescent
104 * ---------------------------------------------
105 */
106 pop {r12, lr}
107 b cortex_a57_disable_ext_debug
108endfunc cortex_a57_core_pwr_dwn
109
110 /* -------------------------------------------------------
111 * The CPU Ops cluster power down function for Cortex-A57.
112 * Clobbers: r0-r3
113 * -------------------------------------------------------
114 */
115func cortex_a57_cluster_pwr_dwn
116 push {r12, lr}
117
118 /* Assert if cache is enabled */
119#if ASM_ASSERTION
120 ldcopr r0, SCTLR
121 tst r0, #SCTLR_C_BIT
122 ASM_ASSERT(eq)
123#endif
124
125 /* ---------------------------------------------
126 * Disable the L2 prefetches.
127 * ---------------------------------------------
128 */
129 bl cortex_a57_disable_l2_prefetch
130
131 /* ---------------------------------------------
132 * Flush L1 caches.
133 * ---------------------------------------------
134 */
135 mov r0, #DC_OP_CISW
136 bl dcsw_op_level1
137
138 /* ---------------------------------------------
139 * Disable the optional ACP.
140 * ---------------------------------------------
141 */
142 bl plat_disable_acp
143
144 /* ---------------------------------------------
145 * Flush L2 caches.
146 * ---------------------------------------------
147 */
148 mov r0, #DC_OP_CISW
149 bl dcsw_op_level2
150
151 /* ---------------------------------------------
152 * Come out of intra cluster coherency
153 * ---------------------------------------------
154 */
155 bl cortex_a57_disable_smp
156
157 /* ---------------------------------------------
158 * Force the debug interfaces to be quiescent
159 * ---------------------------------------------
160 */
161 pop {r12, lr}
162 b cortex_a57_disable_ext_debug
163endfunc cortex_a57_cluster_pwr_dwn
164
165declare_cpu_ops cortex_a57, CORTEX_A57_MIDR, \
166 cortex_a57_reset_func, \
167 cortex_a57_core_pwr_dwn, \
168 cortex_a57_cluster_pwr_dwn