blob: 9b8c9711ff4fb78730fc3887161a7c7ad0ec8fe6 [file] [log] [blame]
Tony Xief6118cc2016-01-15 17:17:32 +08001/*
XiaoDong Huang974e3a12024-06-17 10:55:27 +08002 * Copyright (c) 2013-2024, ARM Limited and Contributors. All rights reserved.
Tony Xief6118cc2016-01-15 17:17:32 +08003 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Tony Xief6118cc2016-01-15 17:17:32 +08005 */
6
Antonio Nino Diaze0f90632018-12-14 00:18:21 +00007#include <platform_def.h>
8
Tony Xief6118cc2016-01-15 17:17:32 +08009#include <arch.h>
10#include <asm_macros.S>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000011#include <common/bl_common.h>
Tony Xief6118cc2016-01-15 17:17:32 +080012#include <cortex_a53.h>
13#include <cortex_a72.h>
14#include <plat_private.h>
Tony Xie42e113e2016-07-16 11:16:51 +080015#include <plat_pmu_macros.S>
Tony Xief6118cc2016-01-15 17:17:32 +080016
17 .globl cpuson_entry_point
18 .globl cpuson_flags
19 .globl platform_cpu_warmboot
20 .globl plat_secondary_cold_boot_setup
21 .globl plat_report_exception
Daniel Boulbyee3e4b02018-08-14 17:10:06 +010022 .globl plat_is_my_cpu_primary
Tony Xief6118cc2016-01-15 17:17:32 +080023 .globl plat_my_core_pos
24 .globl plat_reset_handler
Julius Werner624b5572017-06-19 17:05:30 -070025 .globl plat_panic_handler
Tony Xief6118cc2016-01-15 17:17:32 +080026
Tony Xief6118cc2016-01-15 17:17:32 +080027 /*
28 * void plat_reset_handler(void);
29 *
30 * Determine the SOC type and call the appropriate reset
31 * handler.
32 *
33 */
34func plat_reset_handler
XiaoDong Huang974e3a12024-06-17 10:55:27 +080035#ifdef PLAT_RK_CPU_RESET_EARLY
36 mov x18, x30
37 msr spsel, #0
38 bl plat_set_my_stack
39 mov x0, x20
40 mov x1, x21
41 mov x2, x22
42 mov x3, x23
43 bl rockchip_cpu_reset_early
44 mov x30, x18
45#endif
Tony Xie42e113e2016-07-16 11:16:51 +080046 mrs x0, midr_el1
47 ubfx x0, x0, MIDR_PN_SHIFT, #12
48 cmp w0, #((CORTEX_A72_MIDR >> MIDR_PN_SHIFT) & MIDR_PN_MASK)
49 b.eq handler_a72
50 b handler_end
51handler_a72:
52 /*
53 * This handler does the following:
54 * Set the L2 Data RAM latency for Cortex-A72.
55 * Set the L2 Tag RAM latency to for Cortex-A72.
56 */
Varun Wadekar1384a162017-06-05 14:54:46 -070057 mov x0, #((5 << CORTEX_A72_L2CTLR_DATA_RAM_LATENCY_SHIFT) | \
Tony Xie42e113e2016-07-16 11:16:51 +080058 (0x1 << 5))
Varun Wadekar1384a162017-06-05 14:54:46 -070059 msr CORTEX_A72_L2CTLR_EL1, x0
Tony Xie42e113e2016-07-16 11:16:51 +080060 isb
61handler_end:
62 ret
Tony Xief6118cc2016-01-15 17:17:32 +080063endfunc plat_reset_handler
64
65func plat_my_core_pos
66 mrs x0, mpidr_el1
67 and x1, x0, #MPIDR_CPU_MASK
68 and x0, x0, #MPIDR_CLUSTER_MASK
Tony Xie42e113e2016-07-16 11:16:51 +080069 add x0, x1, x0, LSR #PLAT_RK_CLST_TO_CPUID_SHIFT
Tony Xief6118cc2016-01-15 17:17:32 +080070 ret
71endfunc plat_my_core_pos
72
73 /* --------------------------------------------------------------------
74 * void plat_secondary_cold_boot_setup (void);
75 *
76 * This function performs any platform specific actions
77 * needed for a secondary cpu after a cold reset e.g
78 * mark the cpu's presence, mechanism to place it in a
79 * holding pen etc.
80 * --------------------------------------------------------------------
81 */
82func plat_secondary_cold_boot_setup
83 /* rk3368 does not do cold boot for secondary CPU */
84cb_panic:
85 b cb_panic
86endfunc plat_secondary_cold_boot_setup
87
Daniel Boulbyee3e4b02018-08-14 17:10:06 +010088func plat_is_my_cpu_primary
89 mrs x0, mpidr_el1
Tony Xief6118cc2016-01-15 17:17:32 +080090 and x0, x0, #(MPIDR_CLUSTER_MASK | MPIDR_CPU_MASK)
91 cmp x0, #PLAT_RK_PRIMARY_CPU
92 cset x0, eq
93 ret
Daniel Boulbyee3e4b02018-08-14 17:10:06 +010094endfunc plat_is_my_cpu_primary
Tony Xief6118cc2016-01-15 17:17:32 +080095
96 /* --------------------------------------------------------------------
Julius Werner624b5572017-06-19 17:05:30 -070097 * void plat_panic_handler(void)
98 * Call system reset function on panic. Set up an emergency stack so we
99 * can run C functions (it only needs to last for a few calls until we
100 * reboot anyway).
101 * --------------------------------------------------------------------
102 */
103func plat_panic_handler
104 msr spsel, #0
105 bl plat_set_my_stack
106 b rockchip_soc_soft_reset
107endfunc plat_panic_handler
108
109 /* --------------------------------------------------------------------
Tony Xief6118cc2016-01-15 17:17:32 +0800110 * void platform_cpu_warmboot (void);
111 * cpus online or resume enterpoint
112 * --------------------------------------------------------------------
113 */
Julius Wernerb4c75e92017-08-01 15:16:36 -0700114func platform_cpu_warmboot _align=16
Tony Xief6118cc2016-01-15 17:17:32 +0800115 mrs x0, MPIDR_EL1
Tony Xie42e113e2016-07-16 11:16:51 +0800116 and x19, x0, #MPIDR_CPU_MASK
117 and x20, x0, #MPIDR_CLUSTER_MASK
118 mov x0, x20
119 func_rockchip_clst_warmboot
Tony Xief6118cc2016-01-15 17:17:32 +0800120 /* --------------------------------------------------------------------
121 * big cluster id is 1
122 * big cores id is from 0-3, little cores id 4-7
123 * --------------------------------------------------------------------
124 */
Tony Xie42e113e2016-07-16 11:16:51 +0800125 add x21, x19, x20, lsr #PLAT_RK_CLST_TO_CPUID_SHIFT
Tony Xief6118cc2016-01-15 17:17:32 +0800126 /* --------------------------------------------------------------------
127 * get per cpuup flag
128 * --------------------------------------------------------------------
129 */
130 adr x4, cpuson_flags
Tony Xie42e113e2016-07-16 11:16:51 +0800131 add x4, x4, x21, lsl #2
Tony Xief6118cc2016-01-15 17:17:32 +0800132 ldr w1, [x4]
133 /* --------------------------------------------------------------------
Tony Xief6118cc2016-01-15 17:17:32 +0800134 * check cpuon reason
135 * --------------------------------------------------------------------
136 */
Tony Xie42e113e2016-07-16 11:16:51 +0800137 cmp w1, PMU_CPU_AUTO_PWRDN
Tony Xief6118cc2016-01-15 17:17:32 +0800138 b.eq boot_entry
Tony Xie42e113e2016-07-16 11:16:51 +0800139 cmp w1, PMU_CPU_HOTPLUG
Tony Xief6118cc2016-01-15 17:17:32 +0800140 b.eq boot_entry
141 /* --------------------------------------------------------------------
142 * If the boot core cpuson_flags or cpuson_entry_point is not
143 * expection. force the core into wfe.
144 * --------------------------------------------------------------------
145 */
146wfe_loop:
147 wfe
148 b wfe_loop
149boot_entry:
Tony Xie42e113e2016-07-16 11:16:51 +0800150 str wzr, [x4]
Caesar Wang59e41b52016-04-10 14:11:07 +0800151 /* --------------------------------------------------------------------
152 * get per cpuup boot addr
153 * --------------------------------------------------------------------
154 */
155 adr x5, cpuson_entry_point
Tony Xie42e113e2016-07-16 11:16:51 +0800156 ldr x2, [x5, x21, lsl #3]
Tony Xief6118cc2016-01-15 17:17:32 +0800157 br x2
158endfunc platform_cpu_warmboot
159
160 /* --------------------------------------------------------------------
161 * Per-CPU Secure entry point - resume or power up
162 * --------------------------------------------------------------------
163 */
shengfei Xu9b9e5222022-09-30 08:56:21 +0000164
165#if USE_COHERENT_MEM
Chris Kay33bfc5e2023-02-14 11:30:04 +0000166 .section .tzfw_coherent_mem, "a"
shengfei Xu9b9e5222022-09-30 08:56:21 +0000167#else
168 .data
169#endif
Tony Xief6118cc2016-01-15 17:17:32 +0800170 .align 3
171cpuson_entry_point:
172 .rept PLATFORM_CORE_COUNT
173 .quad 0
174 .endr
175cpuson_flags:
176 .rept PLATFORM_CORE_COUNT
Caesar Wang59e41b52016-04-10 14:11:07 +0800177 .word 0
Tony Xief6118cc2016-01-15 17:17:32 +0800178 .endr
Tony Xie42e113e2016-07-16 11:16:51 +0800179rockchip_clst_warmboot_data