text: /*
   * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
   *
   * SPDX-License-Identifier: BSD-3-Clause
   */
  
  #include <assert.h>
  #include <errno.h>
  
  #include <platform_def.h>
  
  #include <bl1/tbbr/tbbr_img_desc.h>
  #include <common/bl_common.h>
  #include <common/debug.h>
  #include <lib/utils.h>
  #include <plat/common/platform.h>
  
  #include <plat_arm.h>
  
  /* Struct to keep track of usable memory */
  typedef struct bl1_mem_info {
  	uintptr_t mem_base;
  	unsigned int mem_size;
  } bl1_mem_info_t;
  
  static bl1_mem_info_t fwu_addr_map_secure[] = {
  	{
  		.mem_base = ARM_SHARED_RAM_BASE,
  		.mem_size = ARM_SHARED_RAM_SIZE
  	},
  	{
  		.mem_size = 0
  	}
  };
  
  static bl1_mem_info_t fwu_addr_map_non_secure[] = {
  	{
  		.mem_base = ARM_NS_DRAM1_BASE,
  		.mem_size = ARM_NS_DRAM1_SIZE
  	},
  	{
  		.mem_base = PLAT_ARM_NVM_BASE,
  		.mem_size = PLAT_ARM_NVM_SIZE
  	},
  	{
  		.mem_size = 0
  	}
  };
  
  int bl1_plat_mem_check(uintptr_t mem_base,
  		unsigned int mem_size,
  		unsigned int flags)
  {
  	unsigned int index = 0;
  	bl1_mem_info_t *mmap;
  
  	assert(mem_base);
  	assert(mem_size);
  	/*
  	 * The caller of this function is responsible for checking upfront that
  	 * the end address doesn't overflow. We double-check this in debug
  	 * builds.
  	 */
  	assert(!check_uptr_overflow(mem_base, mem_size - 1));
  
  	/*
  	 * Check the given image source and size.
  	 */
  	if (GET_SECURITY_STATE(flags) == SECURE)
  		mmap = fwu_addr_map_secure;
  	else
  		mmap = fwu_addr_map_non_secure;
  
  	while (mmap[index].mem_size) {
  		if ((mem_base >= mmap[index].mem_base) &&
  			((mem_base + mem_size)
  			<= (mmap[index].mem_base +
  			mmap[index].mem_size)))
  			return 0;
  
  		index++;
  	}
  
  	return -ENOMEM;
  }
  
  /*******************************************************************************
   * This function does linear search for image_id and returns image_desc.
   ******************************************************************************/
  image_desc_t *bl1_plat_get_image_desc(unsigned int image_id)
  {
  	unsigned int index = 0;
  
  	while (bl1_tbbr_image_descs[index].image_id != INVALID_IMAGE_ID) {
  		if (bl1_tbbr_image_descs[index].image_id == image_id)
  			return &bl1_tbbr_image_descs[index];
  		index++;
  	}
  
  	return NULL;
  }
  