xref: /arm-trusted-firmware/plat/arm/common/arm_bl1_fwu.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2015-2021, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <assert.h>
8*91f16700Schasinglulu #include <errno.h>
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <platform_def.h>
11*91f16700Schasinglulu 
12*91f16700Schasinglulu #include <bl1/tbbr/tbbr_img_desc.h>
13*91f16700Schasinglulu #include <common/bl_common.h>
14*91f16700Schasinglulu #include <common/debug.h>
15*91f16700Schasinglulu #include <lib/utils.h>
16*91f16700Schasinglulu #include <plat/arm/common/plat_arm.h>
17*91f16700Schasinglulu #include <plat/common/platform.h>
18*91f16700Schasinglulu 
19*91f16700Schasinglulu #pragma weak bl1_plat_get_image_desc
20*91f16700Schasinglulu 
21*91f16700Schasinglulu /* Struct to keep track of usable memory */
22*91f16700Schasinglulu typedef struct bl1_mem_info {
23*91f16700Schasinglulu 	uintptr_t mem_base;
24*91f16700Schasinglulu 	unsigned int mem_size;
25*91f16700Schasinglulu } bl1_mem_info_t;
26*91f16700Schasinglulu 
27*91f16700Schasinglulu static bl1_mem_info_t fwu_addr_map_secure[] = {
28*91f16700Schasinglulu 	{
29*91f16700Schasinglulu 		.mem_base = ARM_SHARED_RAM_BASE,
30*91f16700Schasinglulu 		.mem_size = ARM_SHARED_RAM_SIZE
31*91f16700Schasinglulu 	},
32*91f16700Schasinglulu 	{
33*91f16700Schasinglulu 		.mem_size = 0
34*91f16700Schasinglulu 	}
35*91f16700Schasinglulu };
36*91f16700Schasinglulu 
37*91f16700Schasinglulu static bl1_mem_info_t fwu_addr_map_non_secure[] = {
38*91f16700Schasinglulu 	{
39*91f16700Schasinglulu 		.mem_base = ARM_NS_DRAM1_BASE,
40*91f16700Schasinglulu 		.mem_size = ARM_NS_DRAM1_SIZE
41*91f16700Schasinglulu 	},
42*91f16700Schasinglulu 	{
43*91f16700Schasinglulu 		.mem_base = PLAT_ARM_NVM_BASE,
44*91f16700Schasinglulu 		.mem_size = PLAT_ARM_NVM_SIZE
45*91f16700Schasinglulu 	},
46*91f16700Schasinglulu 	{
47*91f16700Schasinglulu 		.mem_size = 0
48*91f16700Schasinglulu 	}
49*91f16700Schasinglulu };
50*91f16700Schasinglulu 
51*91f16700Schasinglulu int bl1_plat_mem_check(uintptr_t mem_base,
52*91f16700Schasinglulu 		unsigned int mem_size,
53*91f16700Schasinglulu 		unsigned int flags)
54*91f16700Schasinglulu {
55*91f16700Schasinglulu 	unsigned int index = 0;
56*91f16700Schasinglulu 	bl1_mem_info_t *mmap;
57*91f16700Schasinglulu 
58*91f16700Schasinglulu 	assert(mem_base);
59*91f16700Schasinglulu 	assert(mem_size);
60*91f16700Schasinglulu 	/*
61*91f16700Schasinglulu 	 * The caller of this function is responsible for checking upfront that
62*91f16700Schasinglulu 	 * the end address doesn't overflow. We double-check this in debug
63*91f16700Schasinglulu 	 * builds.
64*91f16700Schasinglulu 	 */
65*91f16700Schasinglulu 	assert(!check_uptr_overflow(mem_base, mem_size - 1));
66*91f16700Schasinglulu 
67*91f16700Schasinglulu 	/*
68*91f16700Schasinglulu 	 * Check the given image source and size.
69*91f16700Schasinglulu 	 */
70*91f16700Schasinglulu 	if (GET_SECURITY_STATE(flags) == SECURE)
71*91f16700Schasinglulu 		mmap = fwu_addr_map_secure;
72*91f16700Schasinglulu 	else
73*91f16700Schasinglulu 		mmap = fwu_addr_map_non_secure;
74*91f16700Schasinglulu 
75*91f16700Schasinglulu 	while (mmap[index].mem_size) {
76*91f16700Schasinglulu 		if ((mem_base >= mmap[index].mem_base) &&
77*91f16700Schasinglulu 			((mem_base + mem_size)
78*91f16700Schasinglulu 			<= (mmap[index].mem_base +
79*91f16700Schasinglulu 			mmap[index].mem_size)))
80*91f16700Schasinglulu 			return 0;
81*91f16700Schasinglulu 
82*91f16700Schasinglulu 		index++;
83*91f16700Schasinglulu 	}
84*91f16700Schasinglulu 
85*91f16700Schasinglulu 	return -ENOMEM;
86*91f16700Schasinglulu }
87*91f16700Schasinglulu 
88*91f16700Schasinglulu /*******************************************************************************
89*91f16700Schasinglulu  * This function does linear search for image_id and returns image_desc.
90*91f16700Schasinglulu  ******************************************************************************/
91*91f16700Schasinglulu image_desc_t *bl1_plat_get_image_desc(unsigned int image_id)
92*91f16700Schasinglulu {
93*91f16700Schasinglulu 	unsigned int index = 0;
94*91f16700Schasinglulu 
95*91f16700Schasinglulu 	while (bl1_tbbr_image_descs[index].image_id != INVALID_IMAGE_ID) {
96*91f16700Schasinglulu 		if (bl1_tbbr_image_descs[index].image_id == image_id)
97*91f16700Schasinglulu 			return &bl1_tbbr_image_descs[index];
98*91f16700Schasinglulu 		index++;
99*91f16700Schasinglulu 	}
100*91f16700Schasinglulu 
101*91f16700Schasinglulu 	return NULL;
102*91f16700Schasinglulu }
103