xref: /arm-trusted-firmware/plat/qemu/common/qemu_common.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu 
2*91f16700Schasinglulu /*
3*91f16700Schasinglulu  * Copyright (c) 2015-2023, Arm Limited and Contributors. All rights reserved.
4*91f16700Schasinglulu  *
5*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
6*91f16700Schasinglulu  */
7*91f16700Schasinglulu 
8*91f16700Schasinglulu #include <platform_def.h>
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <arch_helpers.h>
11*91f16700Schasinglulu #include <common/bl_common.h>
12*91f16700Schasinglulu #include <lib/xlat_tables/xlat_tables_v2.h>
13*91f16700Schasinglulu #include <services/el3_spmc_ffa_memory.h>
14*91f16700Schasinglulu 
15*91f16700Schasinglulu #include <plat/common/platform.h>
16*91f16700Schasinglulu #include "qemu_private.h"
17*91f16700Schasinglulu 
18*91f16700Schasinglulu #define MAP_DEVICE0	MAP_REGION_FLAT(DEVICE0_BASE,			\
19*91f16700Schasinglulu 					DEVICE0_SIZE,			\
20*91f16700Schasinglulu 					MT_DEVICE | MT_RW | MT_SECURE)
21*91f16700Schasinglulu 
22*91f16700Schasinglulu #ifdef DEVICE1_BASE
23*91f16700Schasinglulu #define MAP_DEVICE1	MAP_REGION_FLAT(DEVICE1_BASE,			\
24*91f16700Schasinglulu 					DEVICE1_SIZE,			\
25*91f16700Schasinglulu 					MT_DEVICE | MT_RW | MT_SECURE)
26*91f16700Schasinglulu #endif
27*91f16700Schasinglulu 
28*91f16700Schasinglulu #ifdef DEVICE2_BASE
29*91f16700Schasinglulu #define MAP_DEVICE2	MAP_REGION_FLAT(DEVICE2_BASE,			\
30*91f16700Schasinglulu 					DEVICE2_SIZE,			\
31*91f16700Schasinglulu 					MT_DEVICE | MT_RW | MT_SECURE)
32*91f16700Schasinglulu #endif
33*91f16700Schasinglulu 
34*91f16700Schasinglulu #define MAP_SHARED_RAM	MAP_REGION_FLAT(SHARED_RAM_BASE,		\
35*91f16700Schasinglulu 					SHARED_RAM_SIZE,		\
36*91f16700Schasinglulu 					MT_DEVICE  | MT_RW | MT_SECURE)
37*91f16700Schasinglulu 
38*91f16700Schasinglulu #define MAP_BL32_MEM	MAP_REGION_FLAT(BL32_MEM_BASE, BL32_MEM_SIZE,	\
39*91f16700Schasinglulu 					MT_MEMORY | MT_RW | MT_SECURE)
40*91f16700Schasinglulu 
41*91f16700Schasinglulu #define MAP_NS_DRAM0	MAP_REGION_FLAT(NS_DRAM0_BASE, NS_DRAM0_SIZE,	\
42*91f16700Schasinglulu 					MT_MEMORY | MT_RW | MT_NS)
43*91f16700Schasinglulu 
44*91f16700Schasinglulu #define MAP_FLASH0	MAP_REGION_FLAT(QEMU_FLASH0_BASE, QEMU_FLASH0_SIZE, \
45*91f16700Schasinglulu 					MT_MEMORY | MT_RO | MT_SECURE)
46*91f16700Schasinglulu 
47*91f16700Schasinglulu #define MAP_FLASH1	MAP_REGION_FLAT(QEMU_FLASH1_BASE, QEMU_FLASH1_SIZE, \
48*91f16700Schasinglulu 					MT_MEMORY | MT_RO | MT_SECURE)
49*91f16700Schasinglulu 
50*91f16700Schasinglulu #ifdef FW_HANDOFF_BASE
51*91f16700Schasinglulu #define MAP_FW_HANDOFF MAP_REGION_FLAT(FW_HANDOFF_BASE, FW_HANDOFF_SIZE, \
52*91f16700Schasinglulu 				       MT_MEMORY | MT_RW | MT_SECURE)
53*91f16700Schasinglulu #endif
54*91f16700Schasinglulu #ifdef FW_NS_HANDOFF_BASE
55*91f16700Schasinglulu #define MAP_FW_NS_HANDOFF MAP_REGION_FLAT(FW_NS_HANDOFF_BASE, FW_HANDOFF_SIZE, \
56*91f16700Schasinglulu 					  MT_MEMORY | MT_RW | MT_NS)
57*91f16700Schasinglulu #endif
58*91f16700Schasinglulu /*
59*91f16700Schasinglulu  * Table of regions for various BL stages to map using the MMU.
60*91f16700Schasinglulu  * This doesn't include TZRAM as the 'mem_layout' argument passed to
61*91f16700Schasinglulu  * arm_configure_mmu_elx() will give the available subset of that,
62*91f16700Schasinglulu  */
63*91f16700Schasinglulu #ifdef IMAGE_BL1
64*91f16700Schasinglulu static const mmap_region_t plat_qemu_mmap[] = {
65*91f16700Schasinglulu 	MAP_FLASH0,
66*91f16700Schasinglulu 	MAP_FLASH1,
67*91f16700Schasinglulu 	MAP_SHARED_RAM,
68*91f16700Schasinglulu 	MAP_DEVICE0,
69*91f16700Schasinglulu #ifdef MAP_DEVICE1
70*91f16700Schasinglulu 	MAP_DEVICE1,
71*91f16700Schasinglulu #endif
72*91f16700Schasinglulu #ifdef MAP_DEVICE2
73*91f16700Schasinglulu 	MAP_DEVICE2,
74*91f16700Schasinglulu #endif
75*91f16700Schasinglulu 	{0}
76*91f16700Schasinglulu };
77*91f16700Schasinglulu #endif
78*91f16700Schasinglulu #ifdef IMAGE_BL2
79*91f16700Schasinglulu static const mmap_region_t plat_qemu_mmap[] = {
80*91f16700Schasinglulu 	MAP_FLASH0,
81*91f16700Schasinglulu 	MAP_FLASH1,
82*91f16700Schasinglulu 	MAP_SHARED_RAM,
83*91f16700Schasinglulu 	MAP_DEVICE0,
84*91f16700Schasinglulu #ifdef MAP_DEVICE1
85*91f16700Schasinglulu 	MAP_DEVICE1,
86*91f16700Schasinglulu #endif
87*91f16700Schasinglulu #ifdef MAP_DEVICE2
88*91f16700Schasinglulu 	MAP_DEVICE2,
89*91f16700Schasinglulu #endif
90*91f16700Schasinglulu 	MAP_NS_DRAM0,
91*91f16700Schasinglulu #if SPM_MM
92*91f16700Schasinglulu 	QEMU_SP_IMAGE_MMAP,
93*91f16700Schasinglulu #else
94*91f16700Schasinglulu 	MAP_BL32_MEM,
95*91f16700Schasinglulu #endif
96*91f16700Schasinglulu #ifdef MAP_FW_HANDOFF
97*91f16700Schasinglulu 	MAP_FW_HANDOFF,
98*91f16700Schasinglulu #endif
99*91f16700Schasinglulu 	{0}
100*91f16700Schasinglulu };
101*91f16700Schasinglulu #endif
102*91f16700Schasinglulu #ifdef IMAGE_BL31
103*91f16700Schasinglulu static const mmap_region_t plat_qemu_mmap[] = {
104*91f16700Schasinglulu 	MAP_SHARED_RAM,
105*91f16700Schasinglulu 	MAP_DEVICE0,
106*91f16700Schasinglulu #ifdef MAP_DEVICE1
107*91f16700Schasinglulu 	MAP_DEVICE1,
108*91f16700Schasinglulu #endif
109*91f16700Schasinglulu #ifdef MAP_DEVICE2
110*91f16700Schasinglulu 	MAP_DEVICE2,
111*91f16700Schasinglulu #endif
112*91f16700Schasinglulu #ifdef MAP_FW_HANDOFF
113*91f16700Schasinglulu 	MAP_FW_HANDOFF,
114*91f16700Schasinglulu #endif
115*91f16700Schasinglulu #ifdef MAP_FW_NS_HANDOFF
116*91f16700Schasinglulu 	MAP_FW_NS_HANDOFF,
117*91f16700Schasinglulu #endif
118*91f16700Schasinglulu #if SPM_MM
119*91f16700Schasinglulu 	MAP_NS_DRAM0,
120*91f16700Schasinglulu 	QEMU_SPM_BUF_EL3_MMAP,
121*91f16700Schasinglulu #elif !SPMC_AT_EL3
122*91f16700Schasinglulu 	MAP_BL32_MEM,
123*91f16700Schasinglulu #endif
124*91f16700Schasinglulu 	{0}
125*91f16700Schasinglulu };
126*91f16700Schasinglulu #endif
127*91f16700Schasinglulu #ifdef IMAGE_BL32
128*91f16700Schasinglulu static const mmap_region_t plat_qemu_mmap[] = {
129*91f16700Schasinglulu 	MAP_SHARED_RAM,
130*91f16700Schasinglulu 	MAP_DEVICE0,
131*91f16700Schasinglulu #ifdef MAP_DEVICE1
132*91f16700Schasinglulu 	MAP_DEVICE1,
133*91f16700Schasinglulu #endif
134*91f16700Schasinglulu #ifdef MAP_DEVICE2
135*91f16700Schasinglulu 	MAP_DEVICE2,
136*91f16700Schasinglulu #endif
137*91f16700Schasinglulu 	{0}
138*91f16700Schasinglulu };
139*91f16700Schasinglulu #endif
140*91f16700Schasinglulu 
141*91f16700Schasinglulu /*******************************************************************************
142*91f16700Schasinglulu  * Returns QEMU platform specific memory map regions.
143*91f16700Schasinglulu  ******************************************************************************/
144*91f16700Schasinglulu const mmap_region_t *plat_qemu_get_mmap(void)
145*91f16700Schasinglulu {
146*91f16700Schasinglulu 	return plat_qemu_mmap;
147*91f16700Schasinglulu }
148*91f16700Schasinglulu 
149*91f16700Schasinglulu #if MEASURED_BOOT || TRUSTED_BOARD_BOOT
150*91f16700Schasinglulu int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size)
151*91f16700Schasinglulu {
152*91f16700Schasinglulu 	return get_mbedtls_heap_helper(heap_addr, heap_size);
153*91f16700Schasinglulu }
154*91f16700Schasinglulu #endif
155*91f16700Schasinglulu 
156*91f16700Schasinglulu #if SPMC_AT_EL3
157*91f16700Schasinglulu /*
158*91f16700Schasinglulu  * When using the EL3 SPMC implementation allocate the datastore
159*91f16700Schasinglulu  * for tracking shared memory descriptors in normal memory.
160*91f16700Schasinglulu  */
161*91f16700Schasinglulu #define PLAT_SPMC_SHMEM_DATASTORE_SIZE 64 * 1024
162*91f16700Schasinglulu 
163*91f16700Schasinglulu uint8_t plat_spmc_shmem_datastore[PLAT_SPMC_SHMEM_DATASTORE_SIZE];
164*91f16700Schasinglulu 
165*91f16700Schasinglulu int plat_spmc_shmem_datastore_get(uint8_t **datastore, size_t *size)
166*91f16700Schasinglulu {
167*91f16700Schasinglulu 	*datastore = plat_spmc_shmem_datastore;
168*91f16700Schasinglulu 	*size = PLAT_SPMC_SHMEM_DATASTORE_SIZE;
169*91f16700Schasinglulu 	return 0;
170*91f16700Schasinglulu }
171*91f16700Schasinglulu 
172*91f16700Schasinglulu int plat_spmc_shmem_begin(struct ffa_mtd *desc)
173*91f16700Schasinglulu {
174*91f16700Schasinglulu 	return 0;
175*91f16700Schasinglulu }
176*91f16700Schasinglulu 
177*91f16700Schasinglulu int plat_spmc_shmem_reclaim(struct ffa_mtd *desc)
178*91f16700Schasinglulu {
179*91f16700Schasinglulu 	return 0;
180*91f16700Schasinglulu }
181*91f16700Schasinglulu #endif
182*91f16700Schasinglulu 
183*91f16700Schasinglulu #if defined(SPD_spmd) && (SPMC_AT_EL3 == 0)
184*91f16700Schasinglulu /*
185*91f16700Schasinglulu  * A dummy implementation of the platform handler for Group0 secure interrupt.
186*91f16700Schasinglulu  */
187*91f16700Schasinglulu int plat_spmd_handle_group0_interrupt(uint32_t intid)
188*91f16700Schasinglulu {
189*91f16700Schasinglulu 	(void)intid;
190*91f16700Schasinglulu 	return -1;
191*91f16700Schasinglulu }
192*91f16700Schasinglulu #endif /*defined(SPD_spmd) && (SPMC_AT_EL3 == 0)*/
193