blob: c487f033511e421b106840de6599e1fe9824b4ba [file] [log] [blame]
Achin Gupta4f6ad662013-10-25 09:08:21 +01001/*
Dan Handleye83b0ca2014-01-14 18:17:09 +00002 * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved.
Achin Gupta4f6ad662013-10-25 09:08:21 +01003 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * Redistributions of source code must retain the above copyright notice, this
8 * list of conditions and the following disclaimer.
9 *
10 * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 *
14 * Neither the name of ARM nor the names of its contributors may be used
15 * to endorse or promote products derived from this software without specific
16 * prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#include <arch.h>
32#include <platform.h>
33#include <fvp_pwrc.h>
34#include <gic.h>
35
36 .globl platform_get_entrypoint
37 .globl platform_cold_boot_init
38 .globl plat_secondary_cold_boot_setup
39
40
Sandrine Bailleux8d69a032013-11-27 09:38:52 +000041 .section .text, "ax"; .align 3
Achin Gupta4f6ad662013-10-25 09:08:21 +010042
43
44 .macro platform_choose_gicmmap param1, param2, x_tmp, w_tmp, res
45 ldr \x_tmp, =VE_SYSREGS_BASE + V2M_SYS_ID
46 ldr \w_tmp, [\x_tmp]
47 ubfx \w_tmp, \w_tmp, #SYS_ID_BLD_SHIFT, #SYS_ID_BLD_LENGTH
48 cmp \w_tmp, #BLD_GIC_VE_MMAP
49 csel \res, \param1, \param2, eq
50 .endm
51
52 /* -----------------------------------------------------
53 * void plat_secondary_cold_boot_setup (void);
54 *
55 * This function performs any platform specific actions
56 * needed for a secondary cpu after a cold reset e.g
57 * mark the cpu's presence, mechanism to place it in a
58 * holding pen etc.
59 * TODO: Should we read the PSYS register to make sure
60 * that the request has gone through.
61 * -----------------------------------------------------
62 */
Jeenu Viswambharan3a4cae02014-01-16 17:30:39 +000063plat_secondary_cold_boot_setup: ; .type plat_secondary_cold_boot_setup, %function
Achin Gupta4f6ad662013-10-25 09:08:21 +010064 bl read_mpidr
65 mov x19, x0
66 bl platform_get_core_pos
67 mov x20, x0
68
69 /* ---------------------------------------------
Achin Gupta4f6ad662013-10-25 09:08:21 +010070 * Power down this cpu.
71 * TODO: Do we need to worry about powering the
72 * cluster down as well here. That will need
73 * locks which we won't have unless an elf-
74 * loader zeroes out the zi section.
75 * ---------------------------------------------
76 */
77 ldr x1, =PWRC_BASE
78 str w19, [x1, #PPOFFR_OFF]
79
80 /* ---------------------------------------------
81 * Deactivate the gic cpu interface as well
82 * ---------------------------------------------
83 */
84 ldr x0, =VE_GICC_BASE
85 ldr x1, =BASE_GICC_BASE
86 platform_choose_gicmmap x0, x1, x2, w2, x1
87 mov w0, #(IRQ_BYP_DIS_GRP1 | FIQ_BYP_DIS_GRP1)
88 orr w0, w0, #(IRQ_BYP_DIS_GRP0 | FIQ_BYP_DIS_GRP0)
89 str w0, [x1, #GICC_CTLR]
90
91 /* ---------------------------------------------
92 * There is no sane reason to come out of this
93 * wfi so panic if we do. This cpu will be pow-
94 * ered on and reset by the cpu_on pm api
95 * ---------------------------------------------
96 */
97 dsb sy
98 wfi
99cb_panic:
100 b cb_panic
101
102
103 /* -----------------------------------------------------
104 * void platform_get_entrypoint (unsigned int mpid);
105 *
106 * Main job of this routine is to distinguish between
107 * a cold and warm boot.
108 * On a cold boot the secondaries first wait for the
109 * platform to be initialized after which they are
110 * hotplugged in. The primary proceeds to perform the
111 * platform initialization.
112 * On a warm boot, each cpu jumps to the address in its
113 * mailbox.
114 *
115 * TODO: Not a good idea to save lr in a temp reg
116 * TODO: PSYSR is a common register and should be
117 * accessed using locks. Since its not possible
118 * to use locks immediately after a cold reset
119 * we are relying on the fact that after a cold
120 * reset all cpus will read the same WK field
121 * -----------------------------------------------------
122 */
Jeenu Viswambharan3a4cae02014-01-16 17:30:39 +0000123platform_get_entrypoint: ; .type platform_get_entrypoint, %function
Achin Gupta4f6ad662013-10-25 09:08:21 +0100124 mov x9, x30 // lr
125 mov x2, x0
126 ldr x1, =PWRC_BASE
127 str w2, [x1, #PSYSR_OFF]
128 ldr w2, [x1, #PSYSR_OFF]
129 ubfx w2, w2, #PSYSR_WK_SHIFT, #PSYSR_WK_MASK
130 cbnz w2, warm_reset
131 mov x0, x2
132 b exit
133warm_reset:
134 /* ---------------------------------------------
135 * A per-cpu mailbox is maintained in the tru-
136 * sted DRAM. Its flushed out of the caches
137 * after every update using normal memory so
138 * its safe to read it here with SO attributes
139 * ---------------------------------------------
140 */
141 ldr x10, =TZDRAM_BASE + MBOX_OFF
142 bl platform_get_core_pos
143 lsl x0, x0, #CACHE_WRITEBACK_SHIFT
144 ldr x0, [x10, x0]
145 cbz x0, _panic
146exit:
147 ret x9
148_panic: b _panic
149
150
151 /* -----------------------------------------------------
152 * void platform_mem_init (void);
153 *
154 * Zero out the mailbox registers in the TZDRAM. The
155 * mmu is turned off right now and only the primary can
156 * ever execute this code. Secondaries will read the
157 * mailboxes using SO accesses. In short, BL31 will
158 * update the mailboxes after mapping the tzdram as
159 * normal memory. It will flush its copy after update.
160 * BL1 will always read the mailboxes with the MMU off
161 * -----------------------------------------------------
162 */
Jeenu Viswambharan3a4cae02014-01-16 17:30:39 +0000163platform_mem_init: ; .type platform_mem_init, %function
Achin Gupta4f6ad662013-10-25 09:08:21 +0100164 ldr x0, =TZDRAM_BASE + MBOX_OFF
165 stp xzr, xzr, [x0, #0]
166 stp xzr, xzr, [x0, #0x10]
167 stp xzr, xzr, [x0, #0x20]
168 stp xzr, xzr, [x0, #0x30]
169 ret
170
171
172 /* -----------------------------------------------------
173 * void platform_cold_boot_init (bl1_main function);
174 *
175 * Routine called only by the primary cpu after a cold
176 * boot to perform early platform initialization
177 * -----------------------------------------------------
178 */
Jeenu Viswambharan3a4cae02014-01-16 17:30:39 +0000179platform_cold_boot_init: ; .type platform_cold_boot_init, %function
Achin Gupta4f6ad662013-10-25 09:08:21 +0100180 mov x20, x0
181 bl platform_mem_init
182 bl read_mpidr
183 mov x19, x0
184
185 /* ---------------------------------------------
186 * Give ourselves a small coherent stack to
187 * ease the pain of initializing the MMU and
188 * CCI in assembler
189 * ---------------------------------------------
190 */
191 bl platform_set_coherent_stack
192
193 /* ---------------------------------------------
Achin Gupta4f6ad662013-10-25 09:08:21 +0100194 * Architectural init. can be generic e.g.
195 * enabling stack alignment and platform spec-
196 * ific e.g. MMU & page table setup as per the
197 * platform memory map. Perform the latter here
198 * and the former in bl1_main.
199 * ---------------------------------------------
200 */
201 bl bl1_early_platform_setup
202 bl bl1_plat_arch_setup
203
204 /* ---------------------------------------------
205 * Give ourselves a stack allocated in Normal
206 * -IS-WBWA memory
207 * ---------------------------------------------
208 */
209 mov x0, x19
210 bl platform_set_stack
211
212 /* ---------------------------------------------
213 * Jump to the main function. Returning from it
214 * is a terminal error.
215 * ---------------------------------------------
216 */
217 blr x20
218
219cb_init_panic:
220 b cb_init_panic