std_svc_setup.c 4.15 KB
Newer Older
1
/*
2
 * Copyright (c) 2014-2021, ARM Limited and Contributors. All rights reserved.
3
 *
dp-arm's avatar
dp-arm committed
4
 * SPDX-License-Identifier: BSD-3-Clause
5
6
 */

7
#include <assert.h>
8
#include <stdint.h>
9
10
11
12
13
14
15

#include <common/debug.h>
#include <common/runtime_svc.h>
#include <lib/el3_runtime/cpu_data.h>
#include <lib/pmf/pmf.h>
#include <lib/psci/psci.h>
#include <lib/runtime_instr.h>
johpow01's avatar
johpow01 committed
16
17
#include <services/gtsi_svc.h>
#include <services/rmmd_svc.h>
18
#include <services/sdei.h>
19
#include <services/spm_mm_svc.h>
20
#include <services/spmd_svc.h>
21
#include <services/std_svc.h>
22
#include <services/trng_svc.h>
23
24
#include <smccc_helpers.h>
#include <tools_share/uuid.h>
25
26

/* Standard Service UUID */
27
28
29
30
31
32
33
static uuid_t arm_svc_uid = {
	{0x5b, 0x90, 0x8d, 0x10},
	{0x63, 0xf8},
	{0xe8, 0x47},
	0xae, 0x2d,
	{0xc0, 0xfb, 0x56, 0x41, 0xf6, 0xe2}
};
34

35
36
37
38
/* Setup Standard Services */
static int32_t std_svc_setup(void)
{
	uintptr_t svc_arg;
39
	int ret = 0;
40
41
42
43
44

	svc_arg = get_arm_std_svc_args(PSCI_FID_MASK);
	assert(svc_arg);

	/*
45
	 * PSCI is one of the specifications implemented as a Standard Service.
46
47
	 * The `psci_setup()` also does EL3 architectural setup.
	 */
48
49
50
51
	if (psci_setup((const psci_lib_args_t *)svc_arg) != PSCI_E_SUCCESS) {
		ret = 1;
	}

52
#if SPM_MM
53
	if (spm_mm_setup() != 0) {
54
55
56
57
		ret = 1;
	}
#endif

58
59
60
61
62
63
#if defined(SPD_spmd)
	if (spmd_setup() != 0) {
		ret = 1;
	}
#endif

Jeenu Viswambharan's avatar
Jeenu Viswambharan committed
64
65
66
67
68
#if SDEI_SUPPORT
	/* SDEI initialisation */
	sdei_init();
#endif

69
70
	trng_setup();

71
	return ret;
72
73
}

74
75
76
77
/*
 * Top-level Standard Service SMC handler. This handler will in turn dispatch
 * calls to PSCI SMC handler
 */
78
static uintptr_t std_svc_smc_handler(uint32_t smc_fid,
79
80
81
82
			     u_register_t x1,
			     u_register_t x2,
			     u_register_t x3,
			     u_register_t x4,
83
84
			     void *cookie,
			     void *handle,
85
			     u_register_t flags)
86
87
88
89
90
91
{
	/*
	 * Dispatch PSCI calls to PSCI SMC handler and return its return
	 * value
	 */
	if (is_psci_fid(smc_fid)) {
dp-arm's avatar
dp-arm committed
92
93
94
		uint64_t ret;

#if ENABLE_RUNTIME_INSTRUMENTATION
95
96
97
98
99

		/*
		 * Flush cache line so that even if CPU power down happens
		 * the timestamp update is reflected in memory.
		 */
dp-arm's avatar
dp-arm committed
100
101
		PMF_WRITE_TIMESTAMP(rt_instr_svc,
		    RT_INSTR_ENTER_PSCI,
102
		    PMF_CACHE_MAINT,
dp-arm's avatar
dp-arm committed
103
104
105
106
107
108
109
110
111
112
113
114
115
		    get_cpu_data(cpu_data_pmf_ts[CPU_DATA_PMF_TS0_IDX]));
#endif

		ret = psci_smc_handler(smc_fid, x1, x2, x3, x4,
		    cookie, handle, flags);

#if ENABLE_RUNTIME_INSTRUMENTATION
		PMF_CAPTURE_TIMESTAMP(rt_instr_svc,
		    RT_INSTR_EXIT_PSCI,
		    PMF_NO_CACHE_MAINT);
#endif

		SMC_RET1(handle, ret);
116
117
	}

118
#if SPM_MM
119
120
121
122
	/*
	 * Dispatch SPM calls to SPM SMC handler and return its return
	 * value
	 */
123
124
125
	if (is_spm_mm_fid(smc_fid)) {
		return spm_mm_smc_handler(smc_fid, x1, x2, x3, x4, cookie,
					  handle, flags);
126
127
128
	}
#endif

129
130
#if defined(SPD_spmd)
	/*
J-Alves's avatar
J-Alves committed
131
	 * Dispatch FFA calls to the FFA SMC handler implemented by the SPM
132
133
	 * dispatcher and return its return value
	 */
J-Alves's avatar
J-Alves committed
134
	if (is_ffa_fid(smc_fid)) {
135
136
137
138
139
		return spmd_smc_handler(smc_fid, x1, x2, x3, x4, cookie,
					handle, flags);
	}
#endif

Jeenu Viswambharan's avatar
Jeenu Viswambharan committed
140
141
142
143
144
145
146
#if SDEI_SUPPORT
	if (is_sdei_fid(smc_fid)) {
		return sdei_smc_handler(smc_fid, x1, x2, x3, x4, cookie, handle,
				flags);
	}
#endif

147
#if TRNG_SUPPORT
148
149
150
151
	if (is_trng_fid(smc_fid)) {
		return trng_smc_handler(smc_fid, x1, x2, x3, x4, cookie, handle,
				flags);
	}
152
#endif
johpow01's avatar
johpow01 committed
153
154
155
156
157
158
159
160
161
162
#if ENABLE_RME
	/*
	 * Granule transition service interface functions (GTSI) are allocated
	 * from the Std service range. Call the RMM dispatcher to handle calls.
	 */
	if (is_gtsi_fid(smc_fid)) {
		return rmmd_gtsi_handler(smc_fid, x1, x2, x3, x4, cookie,
						handle, flags);
	}
#endif
163

164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
	switch (smc_fid) {
	case ARM_STD_SVC_CALL_COUNT:
		/*
		 * Return the number of Standard Service Calls. PSCI is the only
		 * standard service implemented; so return number of PSCI calls
		 */
		SMC_RET1(handle, PSCI_NUM_CALLS);

	case ARM_STD_SVC_UID:
		/* Return UID to the caller */
		SMC_UUID_RET(handle, arm_svc_uid);

	case ARM_STD_SVC_VERSION:
		/* Return the version of current implementation */
		SMC_RET2(handle, STD_SVC_VERSION_MAJOR, STD_SVC_VERSION_MINOR);

	default:
		WARN("Unimplemented Standard Service Call: 0x%x \n", smc_fid);
		SMC_RET1(handle, SMC_UNK);
	}
}

/* Register Standard Service Calls as runtime service */
DECLARE_RT_SVC(
		std_svc,

		OEN_STD_START,
		OEN_STD_END,
		SMC_TYPE_FAST,
193
		std_svc_setup,
194
195
		std_svc_smc_handler
);