blob: e2d71da7a2c824f861eeec962302048aa0dcff01 [file] [log] [blame]
Andrew Thoelke65668f92014-03-20 10:48:23 +00001/*
Alexei Fedorov490ace72020-05-30 17:33:26 +01002 * Copyright (c) 2014-2020, ARM Limited and Contributors. All rights reserved.
Andrew Thoelke65668f92014-03-20 10:48:23 +00003 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Andrew Thoelke65668f92014-03-20 10:48:23 +00005 */
6
7#include <arch.h>
Andrew Thoelke65668f92014-03-20 10:48:23 +00008#include <asm_macros.S>
Soby Mathew49473e42015-06-10 13:49:59 +01009#include <assert_macros.S>
Dan Handleyed6ff952014-05-14 17:44:19 +010010#include <platform_def.h>
Andrew Thoelke65668f92014-03-20 10:48:23 +000011
Andrew Thoelke65668f92014-03-20 10:48:23 +000012 .local platform_normal_stacks
Soby Mathewb0082d22015-04-09 13:40:55 +010013 .weak plat_get_my_stack
14 .weak plat_set_my_stack
Soby Mathew49473e42015-06-10 13:49:59 +010015
Soby Mathew70716d62015-07-13 16:26:11 +010016 /* ---------------------------------------------------------------------
Antonio Nino Diaz56b68ad2019-02-28 13:35:21 +000017 * When the compatility layer is disabled, the platform APIs
18 * plat_get_my_stack() and plat_set_my_stack() are supported by the
19 * platform and the previous APIs platform_get_stack() and
20 * platform_set_stack() are defined in terms of new APIs making use of
21 * the fact that they are only ever invoked for the current CPU. This
22 * is to enable components of Trusted Firmware like SPDs using the old
23 * platform APIs to continue to work.
Soby Mathew70716d62015-07-13 16:26:11 +010024 * --------------------------------------------------------------------
25 */
26
Andrew Thoelke65668f92014-03-20 10:48:23 +000027 /* -----------------------------------------------------
Soby Mathewa0fedc42016-06-16 14:52:04 +010028 * uintptr_t plat_get_my_stack ()
Soby Mathewb0082d22015-04-09 13:40:55 +010029 *
30 * For the current CPU, this function returns the stack
31 * pointer for a stack allocated in device memory.
32 * -----------------------------------------------------
33 */
34func plat_get_my_stack
Alexei Fedorov490ace72020-05-30 17:33:26 +010035#if (defined(IMAGE_BL31) && RECLAIM_INIT_CODE)
36#if (PLATFORM_CORE_COUNT == 1)
37 /* Single CPU */
38 adrp x0, __PRIMARY_STACK__
39 add x0, x0, :lo12:__PRIMARY_STACK__
40 ret
41#else
42 mov x10, x30
43 bl plat_my_core_pos
44 cbnz x0, 2f
45
46 /* Primary CPU */
47 adrp x0, __PRIMARY_STACK__
48 add x0, x0, :lo12:__PRIMARY_STACK__
49 ret x10
50
51 /* Secondary CPU */
522: sub x0, x0, #(PLATFORM_CORE_COUNT - 1)
53 adrp x1, __STACKS_END__
54 adrp x2, __STACK_SIZE__
55 add x1, x1, :lo12:__STACKS_END__
56 add x2, x2, :lo12:__STACK_SIZE__
57
58 madd x0, x0, x2, x1
59 bic x0, x0, #(CACHE_WRITEBACK_GRANULE - 1)
60 ret x10
61#endif
62 .word platform_normal_stacks
63
64#else /* !(IMAGE_BL31 && RECLAIM_INIT_CODE) */
65 mov x10, x30
Soby Mathewb0082d22015-04-09 13:40:55 +010066 get_my_mp_stack platform_normal_stacks, PLATFORM_STACK_SIZE
67 ret x10
Alexei Fedorov490ace72020-05-30 17:33:26 +010068
69#endif /* IMAGE_BL31 && RECLAIM_INIT_CODE */
Soby Mathewb0082d22015-04-09 13:40:55 +010070endfunc plat_get_my_stack
71
72 /* -----------------------------------------------------
73 * void plat_set_my_stack ()
74 *
75 * For the current CPU, this function sets the stack
76 * pointer to a stack allocated in normal memory.
77 * -----------------------------------------------------
78 */
79func plat_set_my_stack
Alexei Fedorov490ace72020-05-30 17:33:26 +010080 mov x9, x30
Soby Mathewb0082d22015-04-09 13:40:55 +010081 bl plat_get_my_stack
82 mov sp, x0
83 ret x9
84endfunc plat_set_my_stack
85
86 /* -----------------------------------------------------
Alexei Fedorov490ace72020-05-30 17:33:26 +010087 * Per-CPU stacks in normal memory. Each CPU gets a
Achin Gupta9c60d802014-06-26 11:12:37 +010088 * stack of PLATFORM_STACK_SIZE bytes.
Andrew Thoelke65668f92014-03-20 10:48:23 +000089 * -----------------------------------------------------
90 */
91declare_stack platform_normal_stacks, tzfw_normal_stacks, \
Soby Mathewbfdbecf2016-06-09 17:16:35 +010092 PLATFORM_STACK_SIZE, PLATFORM_CORE_COUNT, \
93 CACHE_WRITEBACK_GRANULE