xref: /arm-trusted-firmware/plat/arm/common/trp/arm_trp_setup.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2021-2022, Arm Limited. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <common/bl_common.h>
8*91f16700Schasinglulu #include <common/debug.h>
9*91f16700Schasinglulu #include <drivers/arm/pl011.h>
10*91f16700Schasinglulu #include <drivers/console.h>
11*91f16700Schasinglulu #include <services/rmm_core_manifest.h>
12*91f16700Schasinglulu #include <services/rmmd_svc.h>
13*91f16700Schasinglulu #include <services/trp/platform_trp.h>
14*91f16700Schasinglulu #include <trp_helpers.h>
15*91f16700Schasinglulu 
16*91f16700Schasinglulu #include <plat/arm/common/plat_arm.h>
17*91f16700Schasinglulu #include <platform_def.h>
18*91f16700Schasinglulu 
19*91f16700Schasinglulu /*******************************************************************************
20*91f16700Schasinglulu  * Received from boot manifest and populated here
21*91f16700Schasinglulu  ******************************************************************************/
22*91f16700Schasinglulu extern uint32_t trp_boot_manifest_version;
23*91f16700Schasinglulu 
24*91f16700Schasinglulu /*******************************************************************************
25*91f16700Schasinglulu  * Initialize the UART
26*91f16700Schasinglulu  ******************************************************************************/
27*91f16700Schasinglulu static console_t arm_trp_runtime_console;
28*91f16700Schasinglulu 
29*91f16700Schasinglulu static int arm_trp_process_manifest(struct rmm_manifest *manifest)
30*91f16700Schasinglulu {
31*91f16700Schasinglulu 	/* padding field on the manifest must be RES0 */
32*91f16700Schasinglulu 	assert(manifest->padding == 0U);
33*91f16700Schasinglulu 
34*91f16700Schasinglulu 	/* Verify the Boot Manifest Version. Only the Major is considered */
35*91f16700Schasinglulu 	if (RMMD_MANIFEST_VERSION_MAJOR !=
36*91f16700Schasinglulu 		RMMD_GET_MANIFEST_VERSION_MAJOR(manifest->version)) {
37*91f16700Schasinglulu 		return E_RMM_BOOT_MANIFEST_VERSION_NOT_SUPPORTED;
38*91f16700Schasinglulu 	}
39*91f16700Schasinglulu 
40*91f16700Schasinglulu 	trp_boot_manifest_version = manifest->version;
41*91f16700Schasinglulu 	flush_dcache_range((uintptr_t)manifest, sizeof(struct rmm_manifest));
42*91f16700Schasinglulu 
43*91f16700Schasinglulu 	return 0;
44*91f16700Schasinglulu }
45*91f16700Schasinglulu 
46*91f16700Schasinglulu void arm_trp_early_platform_setup(struct rmm_manifest *manifest)
47*91f16700Schasinglulu {
48*91f16700Schasinglulu 	int rc;
49*91f16700Schasinglulu 
50*91f16700Schasinglulu 	rc = arm_trp_process_manifest(manifest);
51*91f16700Schasinglulu 	if (rc != 0) {
52*91f16700Schasinglulu 		trp_boot_abort(rc);
53*91f16700Schasinglulu 	}
54*91f16700Schasinglulu 
55*91f16700Schasinglulu 	/*
56*91f16700Schasinglulu 	 * Initialize a different console than already in use to display
57*91f16700Schasinglulu 	 * messages from trp
58*91f16700Schasinglulu 	 */
59*91f16700Schasinglulu 	rc = console_pl011_register(PLAT_ARM_TRP_UART_BASE,
60*91f16700Schasinglulu 				    PLAT_ARM_TRP_UART_CLK_IN_HZ,
61*91f16700Schasinglulu 				    ARM_CONSOLE_BAUDRATE,
62*91f16700Schasinglulu 				    &arm_trp_runtime_console);
63*91f16700Schasinglulu 	if (rc == 0) {
64*91f16700Schasinglulu 		panic();
65*91f16700Schasinglulu 	}
66*91f16700Schasinglulu 
67*91f16700Schasinglulu 	console_set_scope(&arm_trp_runtime_console,
68*91f16700Schasinglulu 			  CONSOLE_FLAG_BOOT | CONSOLE_FLAG_RUNTIME);
69*91f16700Schasinglulu }
70*91f16700Schasinglulu 
71*91f16700Schasinglulu void trp_early_platform_setup(struct rmm_manifest *manifest)
72*91f16700Schasinglulu {
73*91f16700Schasinglulu 	arm_trp_early_platform_setup(manifest);
74*91f16700Schasinglulu }
75