blob: 4eb3e126697bec32b6018182e2a1b7d0a147a193 [file] [log] [blame]
Zelalem Awekec8bc23e2021-07-09 15:32:21 -05001/*
Soby Mathew68ea9542022-03-22 13:58:52 +00002 * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
Zelalem Awekec8bc23e2021-07-09 15:32:21 -05003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Zelalem Awekec8bc23e2021-07-09 15:32:21 -05007#include <common/debug.h>
8#include <plat/common/platform.h>
Javier Almansa Sobrino4165e842022-04-25 17:18:15 +01009#include <services/rmm_core_manifest.h>
Soby Mathew68ea9542022-03-22 13:58:52 +000010#include <services/rmmd_svc.h>
Zelalem Awekec8bc23e2021-07-09 15:32:21 -050011#include <services/trp/platform_trp.h>
Javier Almansa Sobrino4165e842022-04-25 17:18:15 +010012#include <trp_helpers.h>
13#include "trp_private.h"
Zelalem Awekec8bc23e2021-07-09 15:32:21 -050014
15#include <platform_def.h>
Zelalem Awekec8bc23e2021-07-09 15:32:21 -050016
Javier Almansa Sobrino7176a772021-11-24 18:37:37 +000017/* Parameters received from the previous image */
18static unsigned int trp_boot_abi_version;
19static uintptr_t trp_shared_region_start;
20
Javier Almansa Sobrino4165e842022-04-25 17:18:15 +010021/* Parameters received from boot manifest */
22uint32_t trp_boot_manifest_version;
Javier Almansa Sobrino7176a772021-11-24 18:37:37 +000023
Zelalem Awekec8bc23e2021-07-09 15:32:21 -050024/*******************************************************************************
25 * Setup function for TRP.
26 ******************************************************************************/
Javier Almansa Sobrino7176a772021-11-24 18:37:37 +000027void trp_setup(uint64_t x0,
28 uint64_t x1,
29 uint64_t x2,
30 uint64_t x3)
Zelalem Awekec8bc23e2021-07-09 15:32:21 -050031{
Javier Almansa Sobrino7176a772021-11-24 18:37:37 +000032 /*
AlexeiFedorovf9044ab2022-11-24 13:42:44 +000033 * Validate boot parameters
Javier Almansa Sobrino7176a772021-11-24 18:37:37 +000034 *
AlexeiFedorovf9044ab2022-11-24 13:42:44 +000035 * According to the Boot Interface ABI v.0.1,
36 * the parameters received from EL3 are:
37 * x0: CPUID (verified earlier, so not used)
Javier Almansa Sobrino7176a772021-11-24 18:37:37 +000038 * x1: Boot Interface version
39 * x2: PLATFORM_CORE_COUNT
40 * x3: Pointer to the shared memory area.
41 */
42
43 (void)x0;
44
45 if (TRP_RMM_EL3_VERSION_GET_MAJOR(x1) != TRP_RMM_EL3_ABI_VERS_MAJOR) {
46 trp_boot_abort(E_RMM_BOOT_VERSION_MISMATCH);
47 }
48
49 if ((void *)x3 == NULL) {
50 trp_boot_abort(E_RMM_BOOT_INVALID_SHARED_BUFFER);
51 }
52
53 if (x2 > TRP_PLATFORM_CORE_COUNT) {
54 trp_boot_abort(E_RMM_BOOT_CPUS_OUT_OF_RANGE);
55 }
56
57 trp_boot_abi_version = x1;
58 trp_shared_region_start = x3;
59 flush_dcache_range((uintptr_t)&trp_boot_abi_version,
60 sizeof(trp_boot_abi_version));
61 flush_dcache_range((uintptr_t)&trp_shared_region_start,
62 sizeof(trp_shared_region_start));
63
Zelalem Awekec8bc23e2021-07-09 15:32:21 -050064 /* Perform early platform-specific setup */
AlexeiFedorov8e754f92022-12-14 17:28:11 +000065 trp_early_platform_setup((struct rmm_manifest *)trp_shared_region_start);
Zelalem Awekec8bc23e2021-07-09 15:32:21 -050066}
67
Javier Almansa Sobrino04a6f2f2022-12-01 17:20:45 +000068int trp_validate_warmboot_args(uint64_t x0, uint64_t x1,
69 uint64_t x2, uint64_t x3)
70{
71 /*
72 * Validate boot parameters for warm boot
73 *
74 * According to the Boot Interface ABI v.0.1, the parameters
75 * received from EL3 during warm boot are:
76 *
77 * x0: CPUID (verified earlier so not used here)
78 * [x1:x3]: RES0
79 */
80
81 (void)x0;
82
83 return ((x1 | x2 | x3) == 0UL) ? 0 : E_RMM_BOOT_UNKNOWN;
84}
85
Zelalem Awekec8bc23e2021-07-09 15:32:21 -050086/* Main function for TRP */
87void trp_main(void)
88{
89 NOTICE("TRP: %s\n", version_string);
90 NOTICE("TRP: %s\n", build_message);
Javier Almansa Sobrino7176a772021-11-24 18:37:37 +000091 NOTICE("TRP: Supported RMM-EL3 Interface ABI: v.%u.%u\n",
92 TRP_RMM_EL3_ABI_VERS_MAJOR, TRP_RMM_EL3_ABI_VERS_MINOR);
AlexeiFedorovf9044ab2022-11-24 13:42:44 +000093 NOTICE("TRP: Boot Manifest Version: v.%u.%u\n",
Javier Almansa Sobrino4165e842022-04-25 17:18:15 +010094 RMMD_GET_MANIFEST_VERSION_MAJOR(trp_boot_manifest_version),
95 RMMD_GET_MANIFEST_VERSION_MINOR(trp_boot_manifest_version));
AlexeiFedorovf9044ab2022-11-24 13:42:44 +000096 INFO("TRP: Memory base: 0x%lx\n", (unsigned long)RMM_BASE);
97 INFO("TRP: Shared region base address: 0x%lx\n",
Javier Almansa Sobrino7176a772021-11-24 18:37:37 +000098 (unsigned long)trp_shared_region_start);
AlexeiFedorovf9044ab2022-11-24 13:42:44 +000099 INFO("TRP: Total size: 0x%lx bytes\n",
100 (unsigned long)(RMM_END - RMM_BASE));
Javier Almansa Sobrino7176a772021-11-24 18:37:37 +0000101 INFO("TRP: RMM-EL3 Interface ABI reported by EL3: v.%u.%u\n",
102 TRP_RMM_EL3_VERSION_GET_MAJOR(trp_boot_abi_version),
103 TRP_RMM_EL3_VERSION_GET_MINOR(trp_boot_abi_version));
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500104}
105
106/*******************************************************************************
107 * Returning RMI version back to Normal World
108 ******************************************************************************/
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000109static void trp_ret_rmi_version(struct trp_smc_result *smc_ret)
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500110{
111 VERBOSE("RMM version is %u.%u\n", RMI_ABI_VERSION_MAJOR,
112 RMI_ABI_VERSION_MINOR);
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000113 smc_ret->x[0] = RMI_ABI_VERSION;
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500114}
115
116/*******************************************************************************
117 * Transitioning granule of NON-SECURE type to REALM type
118 ******************************************************************************/
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000119static void trp_asc_mark_realm(unsigned long long x1,
120 struct trp_smc_result *smc_ret)
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500121{
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500122 VERBOSE("Delegating granule 0x%llx\n", x1);
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000123 smc_ret->x[0] = trp_smc(set_smc_args(RMM_GTSI_DELEGATE, x1,
124 0UL, 0UL, 0UL, 0UL, 0UL, 0UL));
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500125
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000126 if (smc_ret->x[0] != 0ULL) {
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500127 ERROR("Granule transition from NON-SECURE type to REALM type "
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000128 "failed 0x%llx\n", smc_ret->x[0]);
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500129 }
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500130}
131
132/*******************************************************************************
133 * Transitioning granule of REALM type to NON-SECURE type
134 ******************************************************************************/
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000135static void trp_asc_mark_nonsecure(unsigned long long x1,
136 struct trp_smc_result *smc_ret)
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500137{
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500138 VERBOSE("Undelegating granule 0x%llx\n", x1);
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000139 smc_ret->x[0] = trp_smc(set_smc_args(RMM_GTSI_UNDELEGATE, x1,
140 0UL, 0UL, 0UL, 0UL, 0UL, 0UL));
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500141
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000142 if (smc_ret->x[0] != 0ULL) {
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500143 ERROR("Granule transition from REALM type to NON-SECURE type "
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000144 "failed 0x%llx\n", smc_ret->x[0]);
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500145 }
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500146}
147
148/*******************************************************************************
149 * Main RMI SMC handler function
150 ******************************************************************************/
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000151void trp_rmi_handler(unsigned long fid,
152 unsigned long long x1, unsigned long long x2,
153 unsigned long long x3, unsigned long long x4,
154 unsigned long long x5, unsigned long long x6,
155 struct trp_smc_result *smc_ret)
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500156{
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000157 /* Not used in the current implementation */
158 (void)x2;
159 (void)x3;
160 (void)x4;
161 (void)x5;
162 (void)x6;
163
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500164 switch (fid) {
165 case RMI_RMM_REQ_VERSION:
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000166 trp_ret_rmi_version(smc_ret);
167 break;
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500168 case RMI_RMM_GRANULE_DELEGATE:
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000169 trp_asc_mark_realm(x1, smc_ret);
170 break;
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500171 case RMI_RMM_GRANULE_UNDELEGATE:
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000172 trp_asc_mark_nonsecure(x1, smc_ret);
173 break;
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500174 default:
AlexeiFedorovf9044ab2022-11-24 13:42:44 +0000175 ERROR("Invalid SMC code to %s, FID %lx\n", __func__, fid);
176 smc_ret->x[0] = SMC_UNK;
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500177 }
Zelalem Awekec8bc23e2021-07-09 15:32:21 -0500178}