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