/*
 * Copyright (c) 2015-2021, 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/arm/common/plat_arm.h>
#include <plat/common/platform.h>

#pragma weak bl1_plat_get_image_desc

/* 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;
}
