blob: b75483cb63c614bb8a6b2f4a54d15db4bff1d348 [file] [log] [blame]
Zelalem Awekec8bc23e2021-07-09 15:32:21 -05001/*
Chris Kay99b5b2e2024-03-08 16:08:31 +00002 * Copyright (c) 2021-2024, Arm Limited and Contributors. All rights reserved.
Zelalem Awekec8bc23e2021-07-09 15:32:21 -05003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Chris Kay99b5b2e2024-03-08 16:08:31 +00007#include <common/build_message.h>
Zelalem Awekec8bc23e2021-07-09 15:32:21 -05008#include <common/debug.h>
9#include <plat/common/platform.h>
Javier Almansa Sobrino4165e842022-04-25 17:18:15 +010010#include <services/rmm_core_manifest.h>
Soby Mathew68ea9542022-03-22 13:58:52 +000011#include <services/rmmd_svc.h>
Zelalem Awekec8bc23e2021-07-09 15:32:21 -050012#include <services/trp/platform_trp.h>
Javier Almansa Sobrino4165e842022-04-25 17:18:15 +010013#include <trp_helpers.h>
14#include "trp_private.h"
Zelalem Awekec8bc23e2021-07-09 15:32:21 -050015
16#include <platform_def.h>
Zelalem Awekec8bc23e2021-07-09 15:32:21 -050017
Javier Almansa Sobrino7176a772021-11-24 18:37:37 +000018/* Parameters received from the previous image */
19static unsigned int trp_boot_abi_version;
20static uintptr_t trp_shared_region_start;
21
Javier Almansa Sobrino4165e842022-04-25 17:18:15 +010022/* Parameters received from boot manifest */
23uint32_t trp_boot_manifest_version;
Javier Almansa Sobrino7176a772021-11-24 18:37:37 +000024
Zelalem Awekec8bc23e2021-07-09 15:32:21 -050025/*******************************************************************************
26 * Setup function for TRP.
27 ******************************************************************************/
Javier Almansa Sobrino7176a772021-11-24 18:37:37 +000028void trp_setup(uint64_t x0,
29 uint64_t x1,
30 uint64_t x2,
31 uint64_t x3)
Zelalem Awekec8bc23e2021-07-09 15:32:21 -050032{
Javier Almansa Sobrino7176a772021-11-24 18:37:37 +000033 /*
AlexeiFedorovf9044ab2022-11-24 13:42:44 +000034 * Validate boot parameters
Javier Almansa Sobrino7176a772021-11-24 18:37:37 +000035 *
AlexeiFedorovf9044ab2022-11-24 13:42:44 +000036 * According to the Boot Interface ABI v.0.1,
37 * the parameters received from EL3 are:
38 * x0: CPUID (verified earlier, so not used)
Javier Almansa Sobrino7176a772021-11-24 18:37:37 +000039 * x1: Boot Interface version
40 * x2: PLATFORM_CORE_COUNT
41 * x3: Pointer to the shared memory area.
42 */
43
44 (void)x0;
45
46 if (TRP_RMM_EL3_VERSION_GET_MAJOR(x1) != TRP_RMM_EL3_ABI_VERS_MAJOR) {
47 trp_boot_abort(E_RMM_BOOT_VERSION_MISMATCH);
48 }
49
50 if ((void *)x3 == NULL) {
51 trp_boot_abort(E_RMM_BOOT_INVALID_SHARED_BUFFER);
52 }
53
54 if (x2 > TRP_PLATFORM_CORE_COUNT) {
55 trp_boot_abort(E_RMM_BOOT_CPUS_OUT_OF_RANGE);
56 }
57
58 trp_boot_abi_version = x1;
59 trp_shared_region_start = x3;
60 flush_dcache_range((uintptr_t)&trp_boot_abi_version,
61 sizeof(trp_boot_abi_version));
62 flush_dcache_range((uintptr_t)&trp_shared_region_start,
63 sizeof(trp_shared_region_start));
64
Zelalem Awekec8bc23e2021-07-09 15:32:21 -050065 /* Perform early platform-specific setup */
AlexeiFedorov8e754f92022-12-14 17:28:11 +000066 trp_early_platform_setup((struct rmm_manifest *)trp_shared_region_start);
Zelalem Awekec8bc23e2021-07-09 15:32:21 -050067}
68
Javier Almansa Sobrino04a6f2f2022-12-01 17:20:45 +000069int trp_validate_warmboot_args(uint64_t x0, uint64_t x1,
70 uint64_t x2, uint64_t x3)
71{
72 /*
73 * Validate boot parameters for warm boot
74 *
75 * According to the Boot Interface ABI v.0.1, the parameters
76 * received from EL3 during warm boot are:
77 *
78 * x0: CPUID (verified earlier so not used here)
79 * [x1:x3]: RES0
80 */
81
82 (void)x0;
83
84 return ((x1 | x2 | x3) == 0UL) ? 0 : E_RMM_BOOT_UNKNOWN;
85}
86
Zelalem Awekec8bc23e2021-07-09 15:32:21 -050087/* Main function for TRP */
88void trp_main(void)
89{
Chris Kay99b5b2e2024-03-08 16:08:31 +000090 NOTICE("TRP: %s\n", build_version_string);
Zelalem Awekec8bc23e2021-07-09 15:32:21 -050091 NOTICE("TRP: %s\n", build_message);
Javier Almansa Sobrino7176a772021-11-24 18:37:37 +000092 NOTICE("TRP: Supported RMM-EL3 Interface ABI: v.%u.%u\n",
93 TRP_RMM_EL3_ABI_VERS_MAJOR, TRP_RMM_EL3_ABI_VERS_MINOR);
AlexeiFedorovf9044ab2022-11-24 13:42:44 +000094 NOTICE("TRP: Boot Manifest Version: v.%u.%u\n",
Javier Almansa Sobrino4165e842022-04-25 17:18:15 +010095 RMMD_GET_MANIFEST_VERSION_MAJOR(trp_boot_manifest_version),
96 RMMD_GET_MANIFEST_VERSION_MINOR(trp_boot_manifest_version));
AlexeiFedorovf9044ab2022-11-24 13:42:44 +000097 INFO("TRP: Memory base: 0x%lx\n", (unsigned long)RMM_BASE);
98 INFO("TRP: Shared region base address: 0x%lx\n",
Javier Almansa Sobrino7176a772021-11-24 18:37:37 +000099 (unsigned long)trp_shared_region_start);
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000100 INFO("TRP: Total size: 0x%lx bytes\n",
101 (unsigned long)(RMM_END - RMM_BASE));
Javier Almansa Sobrino7176a772021-11-24 18:37:37 +0000102 INFO("TRP: RMM-EL3 Interface ABI reported by EL3: v.%u.%u\n",
103 TRP_RMM_EL3_VERSION_GET_MAJOR(trp_boot_abi_version),
104 TRP_RMM_EL3_VERSION_GET_MINOR(trp_boot_abi_version));
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500105}
106
107/*******************************************************************************
108 * Returning RMI version back to Normal World
109 ******************************************************************************/
Shruti Gupta23c87332023-10-26 12:01:28 +0100110static void trp_ret_rmi_version(unsigned long long rmi_version,
111 struct trp_smc_result *smc_ret)
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500112{
Shruti Gupta23c87332023-10-26 12:01:28 +0100113 if (rmi_version != RMI_ABI_VERSION) {
114 smc_ret->x[0] = RMI_ERROR_INPUT;
115 } else {
116 smc_ret->x[0] = RMI_SUCCESS;
117 }
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500118 VERBOSE("RMM version is %u.%u\n", RMI_ABI_VERSION_MAJOR,
119 RMI_ABI_VERSION_MINOR);
Shruti Gupta23c87332023-10-26 12:01:28 +0100120 smc_ret->x[1] = RMI_ABI_VERSION;
121 smc_ret->x[2] = RMI_ABI_VERSION;
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500122}
123
124/*******************************************************************************
125 * Transitioning granule of NON-SECURE type to REALM type
126 ******************************************************************************/
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000127static void trp_asc_mark_realm(unsigned long long x1,
128 struct trp_smc_result *smc_ret)
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500129{
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500130 VERBOSE("Delegating granule 0x%llx\n", x1);
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000131 smc_ret->x[0] = trp_smc(set_smc_args(RMM_GTSI_DELEGATE, x1,
132 0UL, 0UL, 0UL, 0UL, 0UL, 0UL));
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500133
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000134 if (smc_ret->x[0] != 0ULL) {
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500135 ERROR("Granule transition from NON-SECURE type to REALM type "
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000136 "failed 0x%llx\n", smc_ret->x[0]);
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500137 }
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500138}
139
140/*******************************************************************************
141 * Transitioning granule of REALM type to NON-SECURE type
142 ******************************************************************************/
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000143static void trp_asc_mark_nonsecure(unsigned long long x1,
144 struct trp_smc_result *smc_ret)
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500145{
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500146 VERBOSE("Undelegating granule 0x%llx\n", x1);
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000147 smc_ret->x[0] = trp_smc(set_smc_args(RMM_GTSI_UNDELEGATE, x1,
148 0UL, 0UL, 0UL, 0UL, 0UL, 0UL));
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500149
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000150 if (smc_ret->x[0] != 0ULL) {
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500151 ERROR("Granule transition from REALM type to NON-SECURE type "
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000152 "failed 0x%llx\n", smc_ret->x[0]);
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500153 }
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500154}
155
156/*******************************************************************************
157 * Main RMI SMC handler function
158 ******************************************************************************/
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000159void trp_rmi_handler(unsigned long fid,
160 unsigned long long x1, unsigned long long x2,
161 unsigned long long x3, unsigned long long x4,
162 unsigned long long x5, unsigned long long x6,
163 struct trp_smc_result *smc_ret)
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500164{
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000165 /* Not used in the current implementation */
166 (void)x2;
167 (void)x3;
168 (void)x4;
169 (void)x5;
170 (void)x6;
171
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500172 switch (fid) {
173 case RMI_RMM_REQ_VERSION:
Shruti Gupta23c87332023-10-26 12:01:28 +0100174 trp_ret_rmi_version(x1, smc_ret);
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000175 break;
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500176 case RMI_RMM_GRANULE_DELEGATE:
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000177 trp_asc_mark_realm(x1, smc_ret);
178 break;
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500179 case RMI_RMM_GRANULE_UNDELEGATE:
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000180 trp_asc_mark_nonsecure(x1, smc_ret);
181 break;
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500182 default:
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000183 ERROR("Invalid SMC code to %s, FID %lx\n", __func__, fid);
184 smc_ret->x[0] = SMC_UNK;
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500185 }
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500186}