1 /*
2  * SPDX-License-Identifier: BSD-3-Clause
3  * SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
4  */
5 
6 #include <arch.h>
7 #include <debug.h>
8 #include <gic.h>
9 #include <host_utils.h>
10 #include <platform_api.h>
11 #include <rmm_el3_ifc.h>
12 #include <stdint.h>
13 #include <xlat_tables.h>
14 
15 #define RMM_EL3_IFC_ABI_VERSION		(RMM_EL3_IFC_SUPPORTED_VERSION)
16 #define RMM_EL3_MAX_CPUS		(1U)
17 
18 /*
19  * Define and set the Boot Interface arguments.
20  */
21 static unsigned char el3_rmm_shared_buffer[PAGE_SIZE] __aligned(PAGE_SIZE);
22 
23 /*
24  * Create a basic boot manifest.
25  */
26 static struct rmm_core_manifest *boot_manifest =
27 			(struct rmm_core_manifest *)el3_rmm_shared_buffer;
28 
29 /*
30  * Performs some initialization needed before RMM can be ran, such as
31  * setting up callbacks for sysreg access.
32  */
setup_sysreg_and_boot_manifest(void)33 static void setup_sysreg_and_boot_manifest(void)
34 {
35 	/*
36 	 * Initialize ID_AA64MMFR0_EL1 with a physical address
37 	 * range of 48 bits (PARange bits set to 0b0101)
38 	 */
39 	(void)host_util_set_default_sysreg_cb("id_aa64mmfr0_el1",
40 				INPLACE(ID_AA64MMFR0_EL1_PARANGE, 5UL));
41 
42 	/*
43 	 * Initialize ICH_VTR_EL2 with 6 preemption bits.
44 	 * (PREbits is equal number of preemption bits minus one)
45 	 */
46 	(void)host_util_set_default_sysreg_cb("ich_vtr_el2",
47 				INPLACE(ICH_VTR_EL2_PRE_BITS, 5UL));
48 
49 	/* SCTLR_EL2 is reset to zero */
50 	(void)host_util_set_default_sysreg_cb("sctlr_el2", 0UL);
51 
52 	/* Initialize the boot manifest */
53 	boot_manifest->version = RMM_EL3_IFC_SUPPORTED_VERSION;
54 	boot_manifest->plat_data = (uintptr_t)NULL;
55 }
56 
57 /*
58  * Function to emulate the MMU enablement for the fake_host architecture.
59  */
enable_fake_host_mmu(void)60 static void enable_fake_host_mmu(void)
61 {
62 	write_sctlr_el2(SCTLR_EL2_WXN | SCTLR_EL2_M);
63 }
64 
65 void rmm_main(void);
66 
main(int argc,char * argv[])67 int main(int argc, char *argv[])
68 {
69 	(void)argc;
70 	(void)argv;
71 
72 	setup_sysreg_and_boot_manifest();
73 
74 	VERBOSE("RMM: Beginning of Fake Host execution\n");
75 
76 	plat_setup(0UL,
77 		   RMM_EL3_IFC_ABI_VERSION,
78 		   RMM_EL3_MAX_CPUS,
79 		   (uintptr_t)&el3_rmm_shared_buffer);
80 
81 	/*
82 	 * Enable the MMU. This is needed as some initialization code
83 	 * called by rmm_main() asserts that the mmu is enabled.
84 	 */
85 	enable_fake_host_mmu();
86 
87 	rmm_main();
88 
89 	VERBOSE("RMM: Fake Host execution completed\n");
90 
91 	return 0;
92 }
93