blob: 69783e9dcd3e854885319d8826de509cc8bb59a2 [file] [log] [blame]
Soby Mathewb4c6df42022-11-09 11:13:29 +00001/*
2 * SPDX-License-Identifier: BSD-3-Clause
3 * SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
4 */
5
AlexeiFedoroveaec0c42023-02-01 18:13:32 +00006#include <arch_features.h>
Soby Mathewb4c6df42022-11-09 11:13:29 +00007#include <attestation.h>
8#include <buffer.h>
9#include <debug.h>
10#include <rmm_el3_ifc.h>
Arunachalam Ganapathy4f601e72023-05-22 11:49:29 +010011#include <run.h>
Arunachalam Ganapathyf6491212023-02-23 16:04:34 +000012#include <simd.h>
Soby Mathewb4c6df42022-11-09 11:13:29 +000013#include <smc-rmi.h>
14#include <smc-rsi.h>
15
Arunachalam Ganapathyf6491212023-02-23 16:04:34 +000016
Soby Mathewb4c6df42022-11-09 11:13:29 +000017#ifdef NDEBUG
18#define RMM_BUILD_TYPE "release"
19#else
20#define RMM_BUILD_TYPE "debug"
21#endif
22
23#define VER_STRING(toolchain, major, minor, patch) \
24 toolchain __STRING(major) "." \
25 __STRING(minor) "." __STRING(patch)
26
27static void rmm_arch_init(void)
28{
29 MPAM(write_mpam2_el2(MPAM2_EL2_INIT));
30 MPAM(write_mpamhcr_el2(MPAMHCR_EL2_INIT));
31 SPE(write_pmscr_el2(PMSCR_EL2_INIT));
32
33 write_cnthctl_el2(CNTHCTL_EL2_INIT);
AlexeiFedoroveaec0c42023-02-01 18:13:32 +000034 write_vpidr_el2(read_midr_el1());
35 write_mdcr_el2(MDCR_EL2_INIT |
36 INPLACE(MDCR_EL2_HPMN,
37 EXTRACT(PMCR_EL0_N, read_pmcr_el0())));
Soby Mathewb4c6df42022-11-09 11:13:29 +000038}
39
AlexeiFedorovee2fc822023-10-31 14:54:39 +000040/* coverity[misra_c_2012_rule_8_4_violation:SUPPRESS] */
AlexeiFedorovb0de4d52023-10-10 11:46:16 +010041/* coverity[misra_c_2012_rule_8_7_violation:SUPPRESS] */
Soby Mathewb4c6df42022-11-09 11:13:29 +000042void rmm_warmboot_main(void)
43{
44 /*
45 * Do the rest of RMM architecture init
46 */
47 rmm_arch_init();
48
49 /*
50 * Finish initializing the slot buffer mechanism
51 */
Javier Almansa Sobrinoed932592023-01-24 12:50:41 +000052 slot_buf_finish_warmboot_init();
Soby Mathewb4c6df42022-11-09 11:13:29 +000053}
54
AlexeiFedorovee2fc822023-10-31 14:54:39 +000055/*
56 * This function is called from rmm_entry() in head.S
57 * and should be defined with external linkage, no
58 * compatible declaration is required.
59 */
60/* coverity[misra_c_2012_rule_8_4_violation:SUPPRESS] */
AlexeiFedorovb0de4d52023-10-10 11:46:16 +010061/* coverity[misra_c_2012_rule_8_7_violation:SUPPRESS] */
Soby Mathewb4c6df42022-11-09 11:13:29 +000062void rmm_main(void)
63{
64 unsigned int rmm_el3_ifc_version = rmm_el3_ifc_get_version();
65 unsigned int manifest_version = rmm_el3_ifc_get_manifest_version();
66
67 /*
68 * Report project name, version, build type and
69 * commit information if it is present
70 */
71 NOTICE("Booting %s v.%s(%s) %s Built with %s\n",
72 NAME, VERSION, RMM_BUILD_TYPE, COMMIT_INFO,
73#ifdef __clang__
74 VER_STRING("Clang ", __clang_major__, __clang_minor__,
75 __clang_patchlevel__)
76#else
77 VER_STRING("GCC ", __GNUC__, __GNUC_MINOR__,
78 __GNUC_PATCHLEVEL__)
79#endif
80 );
81
82 /* Report Boot Interface version */
83 NOTICE("RMM-EL3 Interface v.%u.%u\n",
84 RMM_EL3_IFC_GET_VERS_MAJOR(rmm_el3_ifc_version),
85 RMM_EL3_IFC_GET_VERS_MINOR(rmm_el3_ifc_version));
86
87 /* Report Boot Manifest version */
88 NOTICE("Boot Manifest Interface v.%u.%u\n",
89 RMM_EL3_MANIFEST_GET_VERS_MAJOR(manifest_version),
90 RMM_EL3_MANIFEST_GET_VERS_MINOR(manifest_version));
91
92 /* Report RMI/RSI ABI versions and build timestamp */
AlexeiFedorovddf5daf2023-10-10 14:28:56 +010093 NOTICE("RMI/RSI ABI v.%lu.%lu/%lu.%lu built: %s %s\n",
Soby Mathewb4c6df42022-11-09 11:13:29 +000094 RMI_ABI_VERSION_MAJOR, RMI_ABI_VERSION_MINOR,
95 RSI_ABI_VERSION_MAJOR, RSI_ABI_VERSION_MINOR,
96 __DATE__, __TIME__);
97
98 rmm_warmboot_main();
99
Arunachalam Ganapathy4f601e72023-05-22 11:49:29 +0100100 simd_init();
101
102 /* Initialize the NS SIMD context for all CPUs */
103 init_all_cpus_ns_simd_context();
104
Arunachalam Ganapathy51119932023-03-23 12:32:49 +0000105#ifdef RMM_FPU_USE_AT_REL2
Arunachalam Ganapathy4f601e72023-05-22 11:49:29 +0100106 simd_context_save(get_cpu_ns_simd_context());
Arunachalam Ganapathy51119932023-03-23 12:32:49 +0000107#endif
Soby Mathewb4c6df42022-11-09 11:13:29 +0000108 if (attestation_init() != 0) {
109 WARN("Attestation init failed.\n");
110 }
Arunachalam Ganapathy51119932023-03-23 12:32:49 +0000111#ifdef RMM_FPU_USE_AT_REL2
112 /*
113 * TODO: Do not save and restore NS state. Instead after
114 * attestation_init clear FPU state.
115 */
Arunachalam Ganapathy4f601e72023-05-22 11:49:29 +0100116 simd_context_restore(get_cpu_ns_simd_context());
Arunachalam Ganapathy51119932023-03-23 12:32:49 +0000117#endif
Soby Mathewb4c6df42022-11-09 11:13:29 +0000118}