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