xref: /arm-trusted-firmware/services/std_svc/drtm/drtm_res_address_map.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2022 Arm Limited. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier:    BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <stdint.h>
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #include <plat/common/platform.h>
10*91f16700Schasinglulu #include <services/drtm_svc.h>
11*91f16700Schasinglulu #include <platform_def.h>
12*91f16700Schasinglulu 
13*91f16700Schasinglulu /* Address map revision generated by this code. */
14*91f16700Schasinglulu #define DRTM_ADDRESS_MAP_REVISION	U(0x0001)
15*91f16700Schasinglulu 
16*91f16700Schasinglulu /* Amount of space needed for address map based on PLAT_DRTM_MMAP_ENTRIES */
17*91f16700Schasinglulu #define DRTM_ADDRESS_MAP_SIZE (sizeof(drtm_memory_region_descriptor_table_t) + \
18*91f16700Schasinglulu 			       (sizeof(drtm_mem_region_t) * \
19*91f16700Schasinglulu 				PLAT_DRTM_MMAP_ENTRIES))
20*91f16700Schasinglulu 
21*91f16700Schasinglulu /* Allocate space for DRTM-formatted address map to be constructed. */
22*91f16700Schasinglulu static uint8_t drtm_address_map[DRTM_ADDRESS_MAP_SIZE];
23*91f16700Schasinglulu 
24*91f16700Schasinglulu static uint64_t drtm_address_map_size;
25*91f16700Schasinglulu 
26*91f16700Schasinglulu drtm_memory_region_descriptor_table_t *drtm_build_address_map(void)
27*91f16700Schasinglulu {
28*91f16700Schasinglulu 	/* Set up pointer to DRTM memory map. */
29*91f16700Schasinglulu 	drtm_memory_region_descriptor_table_t *map =
30*91f16700Schasinglulu 		(drtm_memory_region_descriptor_table_t *)drtm_address_map;
31*91f16700Schasinglulu 
32*91f16700Schasinglulu 	/* Get the platform memory map. */
33*91f16700Schasinglulu 	const mmap_region_t *mmap = plat_get_addr_mmap();
34*91f16700Schasinglulu 	unsigned int i;
35*91f16700Schasinglulu 
36*91f16700Schasinglulu 	/* Set up header for address map structure. */
37*91f16700Schasinglulu 	map->revision = DRTM_ADDRESS_MAP_REVISION;
38*91f16700Schasinglulu 	map->reserved = 0x0000;
39*91f16700Schasinglulu 
40*91f16700Schasinglulu 	/* Iterate through mmap and generate DRTM address map. */
41*91f16700Schasinglulu 	for (i = 0U; mmap[i].base_pa != 0UL; i++) {
42*91f16700Schasinglulu 		/* Set PA of region. */
43*91f16700Schasinglulu 		map->region[i].region_address = mmap[i].base_pa;
44*91f16700Schasinglulu 
45*91f16700Schasinglulu 		/* Set size of region (in 4kb chunks). */
46*91f16700Schasinglulu 		map->region[i].region_size_type = 0;
47*91f16700Schasinglulu 		ARM_DRTM_REGION_SIZE_TYPE_SET_4K_PAGE_NUM(
48*91f16700Schasinglulu 			map->region[i].region_size_type,
49*91f16700Schasinglulu 			mmap[i].size / PAGE_SIZE_4KB);
50*91f16700Schasinglulu 
51*91f16700Schasinglulu 		/* Set type and cacheability. */
52*91f16700Schasinglulu 		switch (MT_TYPE(mmap[i].attr)) {
53*91f16700Schasinglulu 		case MT_DEVICE:
54*91f16700Schasinglulu 			ARM_DRTM_REGION_SIZE_TYPE_SET_REGION_TYPE(
55*91f16700Schasinglulu 				map->region[i].region_size_type,
56*91f16700Schasinglulu 				ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_DEVICE);
57*91f16700Schasinglulu 			break;
58*91f16700Schasinglulu 		case MT_NON_CACHEABLE:
59*91f16700Schasinglulu 			ARM_DRTM_REGION_SIZE_TYPE_SET_REGION_TYPE(
60*91f16700Schasinglulu 				map->region[i].region_size_type,
61*91f16700Schasinglulu 				ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_NCAR);
62*91f16700Schasinglulu 			ARM_DRTM_REGION_SIZE_TYPE_SET_CACHEABILITY(
63*91f16700Schasinglulu 				map->region[i].region_size_type,
64*91f16700Schasinglulu 				ARM_DRTM_REGION_SIZE_TYPE_CACHEABILITY_NC);
65*91f16700Schasinglulu 			break;
66*91f16700Schasinglulu 		case MT_MEMORY:
67*91f16700Schasinglulu 			ARM_DRTM_REGION_SIZE_TYPE_SET_REGION_TYPE(
68*91f16700Schasinglulu 				map->region[i].region_size_type,
69*91f16700Schasinglulu 				ARM_DRTM_REGION_SIZE_TYPE_REGION_TYPE_NORMAL);
70*91f16700Schasinglulu 			break;
71*91f16700Schasinglulu 		default:
72*91f16700Schasinglulu 			return NULL;
73*91f16700Schasinglulu 		}
74*91f16700Schasinglulu 	}
75*91f16700Schasinglulu 
76*91f16700Schasinglulu 	map->num_regions = i;
77*91f16700Schasinglulu 
78*91f16700Schasinglulu 	/* Store total size of address map. */
79*91f16700Schasinglulu 	drtm_address_map_size = sizeof(drtm_memory_region_descriptor_table_t);
80*91f16700Schasinglulu 	drtm_address_map_size += (i * sizeof(drtm_mem_region_t));
81*91f16700Schasinglulu 
82*91f16700Schasinglulu 	return map;
83*91f16700Schasinglulu }
84*91f16700Schasinglulu 
85*91f16700Schasinglulu uint64_t drtm_get_address_map_size(void)
86*91f16700Schasinglulu {
87*91f16700Schasinglulu 	return drtm_address_map_size;
88*91f16700Schasinglulu }
89