blob: e393262b628215ff932932ac27b78db18f8692f7 [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
16#ifdef NDEBUG
17#define RMM_BUILD_TYPE "release"
18#else
19#define RMM_BUILD_TYPE "debug"
20#endif
21
22#define VER_STRING(toolchain, major, minor, patch) \
23 toolchain __STRING(major) "." \
24 __STRING(minor) "." __STRING(patch)
25
26static void rmm_arch_init(void)
27{
Javier Almansa Sobrinocfd32542024-10-09 19:38:56 +010028 unsigned long hcrx_el2_init = HCRX_INIT;
29
Soby Mathewb4c6df42022-11-09 11:13:29 +000030 MPAM(write_mpam2_el2(MPAM2_EL2_INIT));
31 MPAM(write_mpamhcr_el2(MPAMHCR_EL2_INIT));
32 SPE(write_pmscr_el2(PMSCR_EL2_INIT));
33
34 write_cnthctl_el2(CNTHCTL_EL2_INIT);
AlexeiFedoroveaec0c42023-02-01 18:13:32 +000035 write_vpidr_el2(read_midr_el1());
36 write_mdcr_el2(MDCR_EL2_INIT |
37 INPLACE(MDCR_EL2_HPMN,
38 EXTRACT(PMCR_EL0_N, read_pmcr_el0())));
Javier Almansa Sobrinocfd32542024-10-09 19:38:56 +010039
40 /* Enable EL1 access to sctlr2_el1 if the register is present */
41 if (is_feat_sctlr2x_present()) {
42 hcrx_el2_init |= HCRX_SCTLR2EN;
43 }
44
45 write_hcrx_el2(hcrx_el2_init);
Soby Mathewb4c6df42022-11-09 11:13:29 +000046}
47
AlexeiFedorovee2fc822023-10-31 14:54:39 +000048/* coverity[misra_c_2012_rule_8_4_violation:SUPPRESS] */
AlexeiFedorovb0de4d52023-10-10 11:46:16 +010049/* coverity[misra_c_2012_rule_8_7_violation:SUPPRESS] */
Soby Mathewb4c6df42022-11-09 11:13:29 +000050void rmm_warmboot_main(void)
51{
52 /*
53 * Do the rest of RMM architecture init
54 */
55 rmm_arch_init();
56
57 /*
58 * Finish initializing the slot buffer mechanism
59 */
Javier Almansa Sobrinoed932592023-01-24 12:50:41 +000060 slot_buf_finish_warmboot_init();
Soby Mathewb4c6df42022-11-09 11:13:29 +000061}
62
AlexeiFedorovee2fc822023-10-31 14:54:39 +000063/*
64 * This function is called from rmm_entry() in head.S
65 * and should be defined with external linkage, no
66 * compatible declaration is required.
67 */
68/* coverity[misra_c_2012_rule_8_4_violation:SUPPRESS] */
AlexeiFedorovb0de4d52023-10-10 11:46:16 +010069/* coverity[misra_c_2012_rule_8_7_violation:SUPPRESS] */
Soby Mathewb4c6df42022-11-09 11:13:29 +000070void rmm_main(void)
71{
72 unsigned int rmm_el3_ifc_version = rmm_el3_ifc_get_version();
73 unsigned int manifest_version = rmm_el3_ifc_get_manifest_version();
Arunachalam Ganapathy4003b3c2024-11-05 18:02:10 +000074 unsigned long rmi_revision = rmi_get_highest_supported_version();
75 unsigned long rsi_revision = rsi_get_highest_supported_version();
Soby Mathewb4c6df42022-11-09 11:13:29 +000076
77 /*
78 * Report project name, version, build type and
79 * commit information if it is present
80 */
Arunachalam Ganapathy4003b3c2024-11-05 18:02:10 +000081 NOTICE("Booting %s v.%s(%s) %s Built: %s %s with %s\n",
82 NAME, VERSION, RMM_BUILD_TYPE, COMMIT_INFO, __DATE__, __TIME__,
Soby Mathewb4c6df42022-11-09 11:13:29 +000083#ifdef __clang__
84 VER_STRING("Clang ", __clang_major__, __clang_minor__,
85 __clang_patchlevel__)
86#else
87 VER_STRING("GCC ", __GNUC__, __GNUC_MINOR__,
88 __GNUC_PATCHLEVEL__)
89#endif
90 );
91
92 /* Report Boot Interface version */
93 NOTICE("RMM-EL3 Interface v.%u.%u\n",
94 RMM_EL3_IFC_GET_VERS_MAJOR(rmm_el3_ifc_version),
95 RMM_EL3_IFC_GET_VERS_MINOR(rmm_el3_ifc_version));
96
97 /* Report Boot Manifest version */
98 NOTICE("Boot Manifest Interface v.%u.%u\n",
99 RMM_EL3_MANIFEST_GET_VERS_MAJOR(manifest_version),
100 RMM_EL3_MANIFEST_GET_VERS_MINOR(manifest_version));
101
Arunachalam Ganapathy4003b3c2024-11-05 18:02:10 +0000102 /* Report higher supported RMI revision */
103 NOTICE("RMI ABI revision v%lu.%lu\n",
104 RMI_ABI_VERSION_GET_MAJOR(rmi_revision),
105 RMI_ABI_VERSION_GET_MINOR(rmi_revision));
106
107 /* Report higher supported RSI revision */
108 NOTICE("RSI ABI revision v%lu.%lu\n",
109 RSI_ABI_VERSION_GET_MAJOR(rsi_revision),
110 RSI_ABI_VERSION_GET_MINOR(rsi_revision));
Soby Mathewb4c6df42022-11-09 11:13:29 +0000111
112 rmm_warmboot_main();
113
Arunachalam Ganapathy4f601e72023-05-22 11:49:29 +0100114 simd_init();
115
116 /* Initialize the NS SIMD context for all CPUs */
117 init_all_cpus_ns_simd_context();
118
Arunachalam Ganapathy51119932023-03-23 12:32:49 +0000119#ifdef RMM_FPU_USE_AT_REL2
Arunachalam Ganapathy4f601e72023-05-22 11:49:29 +0100120 simd_context_save(get_cpu_ns_simd_context());
Arunachalam Ganapathy51119932023-03-23 12:32:49 +0000121#endif
Soby Mathewb4c6df42022-11-09 11:13:29 +0000122 if (attestation_init() != 0) {
123 WARN("Attestation init failed.\n");
124 }
Arunachalam Ganapathy51119932023-03-23 12:32:49 +0000125#ifdef RMM_FPU_USE_AT_REL2
126 /*
127 * TODO: Do not save and restore NS state. Instead after
128 * attestation_init clear FPU state.
129 */
Arunachalam Ganapathy4f601e72023-05-22 11:49:29 +0100130 simd_context_restore(get_cpu_ns_simd_context());
Arunachalam Ganapathy51119932023-03-23 12:32:49 +0000131#endif
Soby Mathewb4c6df42022-11-09 11:13:29 +0000132}