blob: ce3260f84db11b245fee11463bc323f5344bfcb8 [file] [log] [blame]
Zelalem Aweke50a30562021-07-09 15:32:21 -05001/*
Soby Mathew319fb082022-03-22 13:58:52 +00002 * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
Zelalem Aweke50a30562021-07-09 15:32:21 -05003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Zelalem Aweke50a30562021-07-09 15:32:21 -05007#include <common/debug.h>
8#include <plat/common/platform.h>
Javier Almansa Sobrino1d0ca402022-04-25 17:18:15 +01009#include <services/rmm_core_manifest.h>
Soby Mathew319fb082022-03-22 13:58:52 +000010#include <services/rmmd_svc.h>
Zelalem Aweke50a30562021-07-09 15:32:21 -050011#include <services/trp/platform_trp.h>
Javier Almansa Sobrino1d0ca402022-04-25 17:18:15 +010012#include <trp_helpers.h>
13#include "trp_private.h"
Zelalem Aweke50a30562021-07-09 15:32:21 -050014
15#include <platform_def.h>
Zelalem Aweke50a30562021-07-09 15:32:21 -050016
Javier Almansa Sobrino8c980a42021-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 Sobrino1d0ca402022-04-25 17:18:15 +010021/* Parameters received from boot manifest */
22uint32_t trp_boot_manifest_version;
Javier Almansa Sobrino8c980a42021-11-24 18:37:37 +000023
Zelalem Aweke50a30562021-07-09 15:32:21 -050024/*******************************************************************************
25 * Setup function for TRP.
26 ******************************************************************************/
Javier Almansa Sobrino8c980a42021-11-24 18:37:37 +000027void trp_setup(uint64_t x0,
28 uint64_t x1,
29 uint64_t x2,
30 uint64_t x3)
Zelalem Aweke50a30562021-07-09 15:32:21 -050031{
Javier Almansa Sobrino8c980a42021-11-24 18:37:37 +000032 /*
AlexeiFedorovb96253d2022-11-24 13:42:44 +000033 * Validate boot parameters
Javier Almansa Sobrino8c980a42021-11-24 18:37:37 +000034 *
AlexeiFedorovb96253d2022-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 Sobrino8c980a42021-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 Aweke50a30562021-07-09 15:32:21 -050064 /* Perform early platform-specific setup */
Javier Almansa Sobrino1d0ca402022-04-25 17:18:15 +010065 trp_early_platform_setup((rmm_manifest_t *)trp_shared_region_start);
Zelalem Aweke50a30562021-07-09 15:32:21 -050066}
67
68/* Main function for TRP */
69void trp_main(void)
70{
71 NOTICE("TRP: %s\n", version_string);
72 NOTICE("TRP: %s\n", build_message);
Javier Almansa Sobrino8c980a42021-11-24 18:37:37 +000073 NOTICE("TRP: Supported RMM-EL3 Interface ABI: v.%u.%u\n",
74 TRP_RMM_EL3_ABI_VERS_MAJOR, TRP_RMM_EL3_ABI_VERS_MINOR);
AlexeiFedorovb96253d2022-11-24 13:42:44 +000075 NOTICE("TRP: Boot Manifest Version: v.%u.%u\n",
Javier Almansa Sobrino1d0ca402022-04-25 17:18:15 +010076 RMMD_GET_MANIFEST_VERSION_MAJOR(trp_boot_manifest_version),
77 RMMD_GET_MANIFEST_VERSION_MINOR(trp_boot_manifest_version));
AlexeiFedorovb96253d2022-11-24 13:42:44 +000078 INFO("TRP: Memory base: 0x%lx\n", (unsigned long)RMM_BASE);
79 INFO("TRP: Shared region base address: 0x%lx\n",
Javier Almansa Sobrino8c980a42021-11-24 18:37:37 +000080 (unsigned long)trp_shared_region_start);
AlexeiFedorovb96253d2022-11-24 13:42:44 +000081 INFO("TRP: Total size: 0x%lx bytes\n",
82 (unsigned long)(RMM_END - RMM_BASE));
Javier Almansa Sobrino8c980a42021-11-24 18:37:37 +000083 INFO("TRP: RMM-EL3 Interface ABI reported by EL3: v.%u.%u\n",
84 TRP_RMM_EL3_VERSION_GET_MAJOR(trp_boot_abi_version),
85 TRP_RMM_EL3_VERSION_GET_MINOR(trp_boot_abi_version));
Zelalem Aweke50a30562021-07-09 15:32:21 -050086}
87
88/*******************************************************************************
89 * Returning RMI version back to Normal World
90 ******************************************************************************/
AlexeiFedorovb96253d2022-11-24 13:42:44 +000091static void trp_ret_rmi_version(struct trp_smc_result *smc_ret)
Zelalem Aweke50a30562021-07-09 15:32:21 -050092{
93 VERBOSE("RMM version is %u.%u\n", RMI_ABI_VERSION_MAJOR,
94 RMI_ABI_VERSION_MINOR);
AlexeiFedorovb96253d2022-11-24 13:42:44 +000095 smc_ret->x[0] = RMI_ABI_VERSION;
Zelalem Aweke50a30562021-07-09 15:32:21 -050096}
97
98/*******************************************************************************
99 * Transitioning granule of NON-SECURE type to REALM type
100 ******************************************************************************/
AlexeiFedorovb96253d2022-11-24 13:42:44 +0000101static void trp_asc_mark_realm(unsigned long long x1,
102 struct trp_smc_result *smc_ret)
Zelalem Aweke50a30562021-07-09 15:32:21 -0500103{
Zelalem Aweke50a30562021-07-09 15:32:21 -0500104 VERBOSE("Delegating granule 0x%llx\n", x1);
AlexeiFedorovb96253d2022-11-24 13:42:44 +0000105 smc_ret->x[0] = trp_smc(set_smc_args(RMM_GTSI_DELEGATE, x1,
106 0UL, 0UL, 0UL, 0UL, 0UL, 0UL));
Zelalem Aweke50a30562021-07-09 15:32:21 -0500107
AlexeiFedorovb96253d2022-11-24 13:42:44 +0000108 if (smc_ret->x[0] != 0ULL) {
Zelalem Aweke50a30562021-07-09 15:32:21 -0500109 ERROR("Granule transition from NON-SECURE type to REALM type "
AlexeiFedorovb96253d2022-11-24 13:42:44 +0000110 "failed 0x%llx\n", smc_ret->x[0]);
Zelalem Aweke50a30562021-07-09 15:32:21 -0500111 }
Zelalem Aweke50a30562021-07-09 15:32:21 -0500112}
113
114/*******************************************************************************
115 * Transitioning granule of REALM type to NON-SECURE type
116 ******************************************************************************/
AlexeiFedorovb96253d2022-11-24 13:42:44 +0000117static void trp_asc_mark_nonsecure(unsigned long long x1,
118 struct trp_smc_result *smc_ret)
Zelalem Aweke50a30562021-07-09 15:32:21 -0500119{
Zelalem Aweke50a30562021-07-09 15:32:21 -0500120 VERBOSE("Undelegating granule 0x%llx\n", x1);
AlexeiFedorovb96253d2022-11-24 13:42:44 +0000121 smc_ret->x[0] = trp_smc(set_smc_args(RMM_GTSI_UNDELEGATE, x1,
122 0UL, 0UL, 0UL, 0UL, 0UL, 0UL));
Zelalem Aweke50a30562021-07-09 15:32:21 -0500123
AlexeiFedorovb96253d2022-11-24 13:42:44 +0000124 if (smc_ret->x[0] != 0ULL) {
Zelalem Aweke50a30562021-07-09 15:32:21 -0500125 ERROR("Granule transition from REALM type to NON-SECURE type "
AlexeiFedorovb96253d2022-11-24 13:42:44 +0000126 "failed 0x%llx\n", smc_ret->x[0]);
Zelalem Aweke50a30562021-07-09 15:32:21 -0500127 }
Zelalem Aweke50a30562021-07-09 15:32:21 -0500128}
129
130/*******************************************************************************
131 * Main RMI SMC handler function
132 ******************************************************************************/
AlexeiFedorovb96253d2022-11-24 13:42:44 +0000133void trp_rmi_handler(unsigned long fid,
134 unsigned long long x1, unsigned long long x2,
135 unsigned long long x3, unsigned long long x4,
136 unsigned long long x5, unsigned long long x6,
137 struct trp_smc_result *smc_ret)
Zelalem Aweke50a30562021-07-09 15:32:21 -0500138{
AlexeiFedorovb96253d2022-11-24 13:42:44 +0000139 /* Not used in the current implementation */
140 (void)x2;
141 (void)x3;
142 (void)x4;
143 (void)x5;
144 (void)x6;
145
Zelalem Aweke50a30562021-07-09 15:32:21 -0500146 switch (fid) {
147 case RMI_RMM_REQ_VERSION:
AlexeiFedorovb96253d2022-11-24 13:42:44 +0000148 trp_ret_rmi_version(smc_ret);
149 break;
Zelalem Aweke50a30562021-07-09 15:32:21 -0500150 case RMI_RMM_GRANULE_DELEGATE:
AlexeiFedorovb96253d2022-11-24 13:42:44 +0000151 trp_asc_mark_realm(x1, smc_ret);
152 break;
Zelalem Aweke50a30562021-07-09 15:32:21 -0500153 case RMI_RMM_GRANULE_UNDELEGATE:
AlexeiFedorovb96253d2022-11-24 13:42:44 +0000154 trp_asc_mark_nonsecure(x1, smc_ret);
155 break;
Zelalem Aweke50a30562021-07-09 15:32:21 -0500156 default:
AlexeiFedorovb96253d2022-11-24 13:42:44 +0000157 ERROR("Invalid SMC code to %s, FID %lx\n", __func__, fid);
158 smc_ret->x[0] = SMC_UNK;
Zelalem Aweke50a30562021-07-09 15:32:21 -0500159 }
Zelalem Aweke50a30562021-07-09 15:32:21 -0500160}