1 /*
2  * SPDX-License-Identifier: BSD-3-Clause
3  * SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
4  */
5 
6 #ifndef RMM_EL3_IFC_H
7 #define RMM_EL3_IFC_H
8 
9 #ifndef __ASSEMBLER__
10 #include <dev_type.h>
11 #endif
12 
13 #include <sizes.h>
14 #include <smc.h>
15 
16 #ifndef __ASSEMBLER__
17 #include <stdbool.h>
18 #include <stddef.h>
19 #endif
20 
21 /***************************************
22  * Error codes for the EL3-RMM interface
23  ***************************************/
24 
25 #define E_RMM_OK			 (0)
26 #define E_RMM_UNK			(-1)
27 #define E_RMM_BAD_ADDR			(-2)
28 #define E_RMM_BAD_PAS			(-3)
29 #define E_RMM_NOMEM			(-4)
30 #define E_RMM_INVAL                     (-5)
31 #define E_RMM_AGAIN			(-6)
32 
33 /****************************************
34  * Generic defines for RMM-EL3 interface
35  ****************************************/
36 
37 /* Signature Algorithm ID */
38 #define ATTEST_KEY_CURVE_ECC_SECP384R1  (0U)
39 
40 /* Hash Algorithm ID */
41 #define EL3_TOKEN_SIGN_HASH_ALG_SHA384	(1U)
42 
43 /********************************************
44  * SMC Function IDs for the EL3-RMM interface
45  ********************************************/
46 
47 					/* 0x1B0 - 0x1B1 */
48 #define SMC_RMM_GTSI_DELEGATE		SMC64_STD_FID(RMM_EL3, U(0))
49 #define SMC_RMM_GTSI_UNDELEGATE		SMC64_STD_FID(RMM_EL3, U(1))
50 
51 					/* 0x1B2 - 0x1B3 */
52 #define SMC_RMM_GET_REALM_ATTEST_KEY	SMC64_STD_FID(RMM_EL3, U(2))
53 #define SMC_RMM_GET_PLAT_TOKEN		SMC64_STD_FID(RMM_EL3, U(3))
54 
55 					/* 0x1CF */
56 #define SMC_RMM_BOOT_COMPLETE		SMC64_STD_FID(RMM_EL3, U(0x1F))
57 
58 /* SMC_RMM_BOOT_COMPLETE return codes */
59 #define E_RMM_BOOT_SUCCESS				(0)
60 #define E_RMM_BOOT_UNKNOWN_ERROR			(-1)
61 #define E_RMM_BOOT_VERSION_NOT_VALID			(-2)
62 #define E_RMM_BOOT_CPUS_OUT_OF_RANGE			(-3)
63 #define E_RMM_BOOT_CPU_ID_OUT_OF_RANGE			(-4)
64 #define E_RMM_BOOT_INVALID_SHARED_BUFFER		(-5)
65 #define E_RMM_BOOT_MANIFEST_VERSION_NOT_SUPPORTED	(-6)
66 #define E_RMM_BOOT_MANIFEST_DATA_ERROR			(-7)
67 
68 /* Starting RMM-EL3 interface version 0.4 */
69 					/* 0x1B4 */
70 #define SMC_RMM_EL3_FEATURES		SMC64_STD_FID(RMM_EL3, U(4))
71 
72 					/* 0x1B5 */
73 #define SMC_RMM_EL3_TOKEN_SIGN		SMC64_STD_FID(RMM_EL3, U(5))
74 
75 
76 /************************
77  * Version related macros
78  ************************/
79 
80 /*
81  * RMM-EL3 Interface and Boot Manifest versions encoding:
82  *	- Bit[31] RES0
83  *	- Bits [30:16] Major version
84  *	- Bits [15:0] Minor version
85  */
86 #define RMM_EL3_IFC_GET_VERS_MAJOR(_version)			\
87 				(((_version) >> 16) & 0x7FFFU)
88 #define RMM_EL3_IFC_GET_VERS_MINOR(_version)			\
89 				((_version) & 0xFFFFU)
90 
91 #define RMM_EL3_IFC_MAKE_VERSION(_major, _minor)		\
92 	(((((_major) & 0x7FFFU) << 16) | ((_minor) & 0xFFFFU)))
93 
94 /*
95  * The Major version value for the RMM-EL3 Interface supported by this
96  * implementation of RMM.
97  */
98 #define RMM_EL3_IFC_VERS_MAJOR		(U(0))
99 
100 /*
101  * The Minor version value for the RMM-EL3 Interface supported by this
102  * implementation of RMM.
103  */
104 #define RMM_EL3_IFC_VERS_MINOR		(U(3))
105 
106 /*
107  * Check if RMM-EL3 Interface is compatible. The Major version should match
108  * and the minor version should be >= the number expected by RMM.
109  */
110 #define IS_RMM_EL3_IFC_COMPATIBLE(_version)				\
111 	((RMM_EL3_IFC_GET_VERS_MAJOR(_version) == RMM_EL3_IFC_VERS_MAJOR) && \
112 	 (RMM_EL3_IFC_GET_VERS_MINOR(_version) >= RMM_EL3_IFC_VERS_MINOR))
113 
114 
115 #define RMM_EL3_MANIFEST_GET_VERS_MAJOR					\
116 				RMM_EL3_IFC_GET_VERS_MAJOR
117 #define RMM_EL3_MANIFEST_GET_VERS_MINOR					\
118 				RMM_EL3_IFC_GET_VERS_MINOR
119 #define RMM_EL3_MANIFEST_MAKE_VERSION					\
120 				RMM_EL3_IFC_MAKE_VERSION
121 
122 /*
123  * The Major version value for the Boot Manifest supported by this
124  * implementation of RMM.
125  */
126 #define RMM_EL3_MANIFEST_VERS_MAJOR	(U(0))
127 
128 /*
129  * The Minor version value for the Boot Manifest supported by this
130  * implementation of RMM.
131  */
132 #define RMM_EL3_MANIFEST_VERS_MINOR	(U(3))
133 
134 /*
135  * Check if EL3 Manifest is compatible. The Major version should match
136  * and the minor version should be >= the number expected by RMM.
137  */
138 #define IS_RMM_EL3_MANIFEST_COMPATIBLE(_version)				\
139 	((RMM_EL3_MANIFEST_GET_VERS_MAJOR(_version) == RMM_EL3_MANIFEST_VERS_MAJOR) && \
140 	 (RMM_EL3_MANIFEST_GET_VERS_MINOR(_version) >= RMM_EL3_MANIFEST_VERS_MINOR))
141 
142 #ifndef __ASSEMBLER__
143 
144 /***************************************************************************
145  * SMC_RMM_EL3_FEATURES related definitions
146  ***************************************************************************/
147 #define RMM_EL3_IFC_FEAT_REG_0_IDX			U(0)
148 #define RMM_EL3_IFC_FEAT_REG_0_EL3_TOKEN_SIGN_SHIFT	U(0)
149 #define RMM_EL3_IFC_FEAT_REG_0_EL3_TOKEN_SIGN_WIDTH	U(1)
150 
151 /***************************************************************************
152  * SMC_RMM_EL3_TOKEN_SIGN related definitions and structures
153  ***************************************************************************/
154 
155 /* Command code for SMC_RMM_EL3_TOKEN_SIGN SMC */
156 #define SMC_RMM_EL3_TOKEN_SIGN_PUSH_REQ_OP		U(1)
157 #define SMC_RMM_EL3_TOKEN_SIGN_PULL_RESP_OP		U(2)
158 #define SMC_RMM_EL3_TOKEN_SIGN_GET_RAK_PUB_OP		U(3)
159 
160 /* The Max hash size is set to be SHA-512 Digest size */
161 #define EL3_TOKEN_REQUEST_MAX_HASH_LEN			64
162 /* The Max Signature is set to be a buffer of 512 Bytes (4096 bits) */
163 #define EL3_TOKEN_RESPONSE_MAX_SIG_LEN			512
164 
165 /* Structure format in which EL3 expects a request */
166 struct el3_token_sign_request {
167 	SET_MEMBER(uint32_t sign_alg_id, 0x0, 0x8);
168 	SET_MEMBER(uint64_t cookie, 0x8, 0x10);		/* Passthrough to response */
169 	SET_MEMBER(uint64_t req_ticket, 0x10, 0x18);	/* Passthrough to response */
170 	SET_MEMBER(uint32_t hash_alg_id, 0x18, 0x20);
171 	SET_MEMBER(uint8_t hash_buf[EL3_TOKEN_REQUEST_MAX_HASH_LEN], 0x20, 0x60);
172 };
173 COMPILER_ASSERT(U(offsetof(struct el3_token_sign_request, sign_alg_id)) == 0x0U);
174 COMPILER_ASSERT(U(offsetof(struct el3_token_sign_request, cookie)) == 0x8U);
175 COMPILER_ASSERT(U(offsetof(struct el3_token_sign_request, req_ticket)) == 0x10U);
176 COMPILER_ASSERT(U(offsetof(struct el3_token_sign_request, hash_alg_id)) == 0x18U);
177 COMPILER_ASSERT(U(offsetof(struct el3_token_sign_request, hash_buf)) == 0x20U);
178 
179 /* Structure format in which EL3 is expected to return data */
180 struct el3_token_sign_response {
181 	SET_MEMBER(uint64_t cookie, 0x0, 0x8);		/* Passthrough from request */
182 	SET_MEMBER(uint64_t req_ticket, 0x8, 0x10);	/* Passthrough from request */
183 	SET_MEMBER(uint16_t sig_len, 0x10, 0x12);
184 	SET_MEMBER(uint8_t signature_buf[EL3_TOKEN_RESPONSE_MAX_SIG_LEN], 0x12, 0x212);
185 };
186 
187 COMPILER_ASSERT(U(offsetof(struct el3_token_sign_response, cookie)) == 0x0U);
188 COMPILER_ASSERT(U(offsetof(struct el3_token_sign_response, req_ticket)) == 0x8U);
189 COMPILER_ASSERT(U(offsetof(struct el3_token_sign_response, sig_len)) == 0x10U);
190 COMPILER_ASSERT(U(offsetof(struct el3_token_sign_response, signature_buf)) == 0x12U);
191 
192 /***************************************************************************
193  * RMM-EL3 Interface related functions
194  ***************************************************************************/
195 
196 /*
197  * Accessors to the parameters obtained through the RMM-EL3 Interface arguments.
198  */
199 unsigned int rmm_el3_ifc_get_version(void);
200 uintptr_t rmm_el3_ifc_get_shared_buf_pa(void);
201 
rmm_el3_ifc_get_shared_buf_size(void)202 static inline size_t rmm_el3_ifc_get_shared_buf_size(void)
203 {
204 	return SZ_4K;
205 }
206 
207 /*
208  * Validate the RMM-EL3 Interface boot arguments and initialize the
209  * rmm_el3_ifc library. This function must be called only once during cold
210  * boot.
211  *
212  * This function must be called prior to enable the MMU and data cache for
213  * RMM execution.
214  *
215  * Args:
216  *	- x0 - x3: Arguments passed through registers x0 to x3.
217  *	- shared_buf_va: Virtual address where the RMM-EL3 shared
218  *	  will be mapped by the platform.
219  *
220  * Return:
221  *	- 0 on success or a negative error code otherwise.
222  */
223 int rmm_el3_ifc_init(unsigned long x0, unsigned long x1, unsigned long x2,
224 		     unsigned long x3, uintptr_t shared_buf_va);
225 
226 /*
227  * This function performs an early validation of the CPU Id received
228  * during warm boot and stores it into tpidr_el2.
229  *
230  * If the validation fails it will call into EL3 and will not return
231  * to the caller.
232  *
233  * Args:
234  *	- x0: CPU Id received from EL3.
235  * Return:
236  *	- Validated CPU Id or will not return on an error.
237  */
238 unsigned int rmm_el3_ifc_validate_cpuid(unsigned long x0);
239 
240 /*
241  * Return a pointer to the RMM <-> EL3 shared pointer and lock it to prevent
242  * concurrent access.
243  *
244  * Return:	Exclusive pointer to the RMM <-> EL3 shared area.
245  */
246 uintptr_t rmm_el3_ifc_get_shared_buf_locked(void);
247 
248 /*
249  * Release the RMM <-> EL3 buffer.
250  */
251 void rmm_el3_ifc_release_shared_buf(void);
252 
253 /*****************************************************************************
254  * Boot Manifest definitions, functions and structures (v0.4)
255  ****************************************************************************/
256 
257 /* Console info structure */
258 struct console_info {
259 	uintptr_t base;			/* Console base address */
260 	uint64_t map_pages;		/* Num of pages to be mapped in RMM for the console MMIO */
261 	char name[8];			/* Name of console */
262 	uint64_t clk_in_hz;		/* UART clock (in Hz) for the console */
263 	uint64_t baud_rate;		/* Baud rate */
264 	uint64_t flags;			/* Additional flags RES0 */
265 };
266 
267 struct console_list {
268 	uint64_t num_consoles;		/* Number of consoles */
269 	struct console_info *consoles;	/* Pointer to console_info[] */
270 	uint64_t checksum;		/* Checksum of console_info data */
271 };
272 
273 /* Memory bank/IO region structure */
274 struct memory_bank {
275 	uintptr_t base;			/* Base address */
276 	uint64_t size;			/* Size of bank/IO region */
277 };
278 
279 /* Memory/IO region layout info structure */
280 struct memory_info {
281 	uint64_t num_banks;		/* Number of memory banks/IO regions */
282 	struct memory_bank *banks;	/* Pointer to memory_banks[] */
283 	uint64_t checksum;		/* Checksum of memory_info data */
284 };
285 
286 /* Boot Manifest core structure as per v0.4 */
287 struct rmm_core_manifest {
288 	uint32_t version;		/* Manifest version */
289 	uint32_t padding;		/* RES0 */
290 	uintptr_t plat_data;		/* Manifest platform data */
291 	/* Platform DRAM data (from v0.2) */
292 	struct memory_info plat_dram;
293 	/* Platform console list (from v0.3) */
294 	struct console_list plat_console;
295 	/* Platform device address ranges (v0.4) */
296 	struct memory_info plat_ncoh_region;
297 	struct memory_info plat_coh_region;
298 };
299 
300 COMPILER_ASSERT_NO_CBMC(U(offsetof(struct rmm_core_manifest, version)) == 0U);
301 COMPILER_ASSERT_NO_CBMC(U(offsetof(struct rmm_core_manifest, plat_data)) == 8U);
302 COMPILER_ASSERT_NO_CBMC(U(offsetof(struct rmm_core_manifest, plat_dram)) == 16U);
303 COMPILER_ASSERT_NO_CBMC(U(offsetof(struct rmm_core_manifest, plat_console)) == 40U);
304 COMPILER_ASSERT_NO_CBMC(U(offsetof(struct rmm_core_manifest, plat_ncoh_region)) == 64U);
305 COMPILER_ASSERT_NO_CBMC(U(offsetof(struct rmm_core_manifest, plat_coh_region)) == 88U);
306 
307 /*
308  * Accessors to the Boot Manifest data
309  */
310 unsigned int rmm_el3_ifc_get_manifest_version(void);
311 
312 /*
313  * These functions must be called only after the core manifest has
314  * been processed (See rmm_el3_ifc_process_boot_manifest()). Also, since
315  * the shared buffer can be reclaimed for communication during rmm_main(), we
316  * restrict this call to be allowed before the MMU is enabled by the platform.
317  */
318 /*
319  * Return a pointer to the platform manifest data if setup by EL3 Firmware
320  */
321 uintptr_t rmm_el3_ifc_get_plat_manifest_pa(void);
322 
323 /*
324  * Return validated DRAM data passed in plat_dram pointer
325  * from the Boot Manifest v0.2 onwards.
326  *
327  * Args:
328  *	- max_num_banks:	Maximum number of platform's DRAM banks
329  *				supported.
330  *	- plat_dram_info:	Return physical address to the platform
331  *				DRAM info structure setup by EL3 Firmware,
332  *				or NULL in case of error.
333  *
334  * Return:
335  *	- E_RMM_BOOT_SUCCESS			    Success.
336  *	- E_RMM_BOOT_MANIFEST_VERSION_NOT_SUPPORTED Version reported by the
337  *						    Boot Manifest is not
338  *						    supported by this API.
339  *	- E_RMM_BOOT_MANIFEST_DATA_ERROR	    Error parsing data.
340  */
341 int rmm_el3_ifc_get_dram_data_validated_pa(unsigned long max_num_banks,
342 					   struct memory_info **plat_dram_info);
343 
344 /*
345  * Return validated Console list passed in plat_console pointer
346  * from the Boot Manifest v0.3 onwards.
347  *
348  * Args:
349  *	- plat_console_list:	Return physical address to platform console
350 				list structure setup by EL3 Firmware,
351  *				or NULL in case of error.
352  *
353  * Return:
354  *	- E_RMM_BOOT_SUCCESS			    Success.
355  *	- E_RMM_BOOT_MANIFEST_VERSION_NOT_SUPPORTED Version reported by the
356  *						    Boot Manifest is not
357  *						    supported by this API.
358  *	- E_RMM_BOOT_MANIFEST_DATA_ERROR	    Error parsing data.
359  */
360 int rmm_el3_ifc_get_console_list_pa(struct console_list **plat_console_list);
361 
362 /*
363  * Return validated device address ranges data passed in plat_ncoh_region and
364  * plat_coh_region fields from the Boot Manifest v0.4 onwards.
365  *
366  * Args:
367  *	- max_num_banks:	Maximum number device memory banks supported
368  *				by platform for a particular device memory range.
369  *	- plat_dev_region_info:	Return physical address to the platform
370  *				device address ranges info structure setup by EL3
371  *				Firmware, or NULL in case it is not available.
372  *	- type:			Device address ranges coherency type.
373  *
374  * Return:
375  *	- E_RMM_BOOT_SUCCESS			    Success.
376  *	- E_RMM_BOOT_MANIFEST_VERSION_NOT_SUPPORTED Version reported by the
377  *						    Boot Manifest is not
378  *						    supported by this API.
379  *	- E_RMM_BOOT_MANIFEST_DATA_ERROR	    Error parsing data.
380  *
381  * Note:
382  *	Function can return E_RMM_BOOT_SUCCESS and set *plat_dev_range_info to NULL
383  *	in case when a particular device memory range is not available.
384  */
385 int rmm_el3_ifc_get_dev_range_validated_pa(unsigned long max_num_banks,
386 					   struct memory_info **plat_dev_range_info,
387 					   enum dev_coh_type type);
388 
389 /****************************************************************************
390  * RMM-EL3 Runtime interface APIs
391  ***************************************************************************/
392 
393 /*
394  * Get the realm attestation key to sign the realm attestation token. It is
395  * expected that only the private key is retrieved in raw format.
396  *
397  * Args:
398  *	- buf:		Pointer to the buffer used to get the attestation key
399  *			from EL3. This must belong to the RMM-EL3 shared memory
400  *			and must be locked before use.
401  *	- buflen	Maximum size for the Realm Attestation Key.
402  *	- len:		Pointer to a size_t variable to store the size of the
403  *			received realm attestation key.
404  *	- crv:		ECC Crve type for querying attestation key from monitor.
405  *
406  * Return:
407  *	- E_RMM_OK	On Success.
408  *	- E_RMM_INVAL	If the arguments are invalid.
409  *	- E_RMM_AGAIN	EL3 is busy and the key cannot be retrieved at this
410  *			time. At least one further call will be needed in
411  *			order to retrieve the key.
412  */
413 int rmm_el3_ifc_get_realm_attest_key(uintptr_t buf, size_t buflen,
414 					size_t *len, unsigned int crv);
415 
416 /*
417  * Get the platform token from the EL3 firmware and pass the public hash
418  * value to it.
419  * If the whole token does not fit in the buffer, a piece of the token will be
420  * returned in the buffer, and this function will have to be called
421  * sequentially in order to obtain the full token. Output variable
422  * remaining_len will indicate how much of the token remains to be retrieved.
423  *
424  * Args:
425  *	- buf:			Pointer to the buffer used to get the platform
426  *				token from EL3. This must belong to the
427  *				RMM-EL3 shared memory and must be locked
428  *				before use.
429  *	- buflen		Buffer size.
430  *	- token_hunk_len:	Return the size of the retrieved token hunk.
431  *	- hash_size:		Size of the SHA digest used for the token
432  *				generation.
433  *				If hash_size contains a valid size (> 0), the
434  *				buffer will contain the first part of the token
435  *				after returning. Further calls to this API need
436  *				to have hash_size set to 0 to retrieve rest of
437  *				the platform token.
438  *	- remaining_len:	Return the number of bytes of the token that are
439  *				pending transfer.
440  *
441  * Return:
442  *	- E_RMM_OK		if part (or entirety) of the token has been
443  *				received successfully.
444  *	- E_RMM_INVAL		An error in input arguments. This could also be
445  *				due to the fact that the token has been
446  *				retrieved fully in a prior call and the
447  *				arguments should correspond to token generation
448  *				phase.
449  *	- E_RMM_AGAIN		EL3 is busy and the platform token cannot be
450  *				retrieved at this time. At least one further
451  *				call will be needed in order to retrieve the
452  *				token.
453  */
454 int rmm_el3_ifc_get_platform_token(uintptr_t buf, size_t buflen,
455 					size_t hash_size,
456 					size_t *token_hunk_len,
457 					size_t *remaining_len);
458 
rmm_el3_ifc_gtsi_delegate(unsigned long addr)459 static inline unsigned long rmm_el3_ifc_gtsi_delegate(unsigned long addr)
460 {
461 	return monitor_call(SMC_RMM_GTSI_DELEGATE, addr,
462 				0UL, 0UL, 0UL, 0UL, 0UL);
463 }
464 
rmm_el3_ifc_gtsi_undelegate(unsigned long addr)465 static inline unsigned long rmm_el3_ifc_gtsi_undelegate(unsigned long addr)
466 {
467 	return monitor_call(SMC_RMM_GTSI_UNDELEGATE, addr,
468 				0UL, 0UL, 0UL, 0UL, 0UL);
469 }
470 
471 /*
472  * Abort the boot process and return to EL3 FW reporting
473  * the ec error code.
474  *
475  * Args:
476  *	- ec:		SMC_RMM_BOOT_COMPLETE return code
477  */
478 __dead2 void rmm_el3_ifc_report_fail_to_el3(int ec);
479 
480 /*
481  * Query if EL3_TOKEN_SIGN feature is supported by EL3 firmware.
482  * Return true or false depending on the support.
483  */
484 bool rmm_el3_ifc_el3_token_sign_supported(void);
485 
486 /*
487  * Push the attestation signing request to EL3 firmware.
488  * Optional interface from the RMM-EL3 interface v0.4 onwards.
489  *
490  * Args:
491  *	- req:		Pointer to the token sign request to be pushed to EL3.
492  *			The structure must be located in the RMM-EL3 shared
493  *			memory buffer and must be locked before use.
494  *
495  * Return:
496  *	- E_RMM_OK	On Success.
497  *	- E_RMM_INVAL	If the arguments are invalid.
498  *	- E_RMM_AGAIN	Indicates that the request was not queued since the
499  *			queue in EL3 is full.
500  *	- E_RMM_UNK	If the SMC is not implemented or if interface
501  *			version is < 0.4.
502  */
503 int rmm_el3_ifc_push_el3_token_sign_request(const struct el3_token_sign_request *req);
504 
505 /*
506  * Pull the attestation signing response from the EL3 firmware.
507  * Optional interface from the RMM-EL3 interface v0.4 onwards.
508  * Args:
509  *	- resp:		Pointer to the token sign response to get from EL3.
510  *			The structure must be located in the RMM-EL3 shared
511  *			memory buffer and must be locked before use.
512  *
513  * Return:
514  *	- E_RMM_OK	On Success.
515  *	- E_RMM_INVAL	If the arguments are invalid.
516  *	- E_RMM_AGAIN	Indicates that a response is not ready yet.
517  *	- E_RMM_UNK	If the SMC is not implemented or if interface
518  *			version is < 0.4.
519  */
520 int rmm_el3_ifc_pull_el3_token_sign_response(const struct el3_token_sign_response *resp);
521 
522 /*
523  * Get the realm attestation public key when EL3 is used to sign attestaion
524  * tokens.
525  * Optional interface from the RMM-EL3 interface v0.4 onwards.
526  * Args:
527  *	- buf		Pointer to the buffer used to get the attestation public key
528  *			This must belong to the RMM-EL3 shared memory and must be locked
529  *			before use.
530  *	- buflen	The size of the buffer `buf`.
531  *	- len		Pointer to a size_t variable to store the size of the
532  *			received response.
533  *	- crv		The ECC curve for which the public key is requested.
534  *
535  * Return:
536  *	- E_RMM_OK	On Success.
537  *	- E_RMM_INVAL	If the arguments are invalid.
538  *	- E_RMM_AGAIN	Indicates that a response is not ready yet.
539  *	- E_RMM_UNK	If the SMC is not implemented or if interface
540  *			version is < 0.4.
541  */
542 int rmm_el3_ifc_get_realm_attest_pub_key_from_el3(uintptr_t buf, size_t buflen,
543 					size_t *len, unsigned int crv);
544 
545 /*
546  * Access the feature register. This is supported for interface version 0.4 and
547  * later.
548  *
549  * Args:
550  * 	- feat_reg_idx	The feature register index.
551  *	- feat_reg	Pointer to store the value of the register.
552  * Return:
553  *	- E_RMM_OK	On Success.
554  *	- E_RMM_INVAL	If the arguments are invalid.
555  *	- E_RMM_UNK	If the SMC is not present if interface
556  *			version is < 0.4.
557  */
558 int rmm_el3_ifc_get_feat_register(unsigned int feat_reg_idx, uint64_t *feat_reg);
559 
560 #endif /* __ASSEMBLER__ */
561 #endif /* RMM_EL3_IFC_H */
562