/*
 * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include <bl_common.h>
#include <debug.h>
#include <plat_arm.h>
#include <platform.h>
#include "../drivers/scp/css_scp.h"

/* Weak definition may be overridden in specific CSS based platform */
#pragma weak bl2u_plat_handle_scp_bl2u

/* Data structure which holds the SCP_BL2U image info for BL2U */
static image_info_t scp_bl2u_image_info;

/*******************************************************************************
 * BL1 can pass platform dependent information to BL2U in x1.
 * In case of ARM CSS platforms x1 contains SCP_BL2U image info.
 * In case of ARM FVP platforms x1 is not used.
 * In both cases, x0 contains the extents of the memory available to BL2U
 ******************************************************************************/
void bl2u_early_platform_setup(meminfo_t *mem_layout, void *plat_info)
{
	if (!plat_info)
		panic();

	arm_bl2u_early_platform_setup(mem_layout, plat_info);

	scp_bl2u_image_info = *(image_info_t *)plat_info;
}

/*******************************************************************************
 * Transfer SCP_BL2U from Trusted RAM using the SCP Download protocol.
 ******************************************************************************/
int bl2u_plat_handle_scp_bl2u(void)
{
	int ret;

	INFO("BL2U: Initiating SCP_BL2U transfer to SCP\n");

	ret = css_scp_boot_image_xfer((void *)scp_bl2u_image_info.image_base,
		scp_bl2u_image_info.image_size);

	if (ret == 0)
		ret = css_scp_boot_ready();

	if (ret == 0)
		INFO("BL2U: SCP_BL2U transferred to SCP\n");
	else
		ERROR("BL2U: SCP_BL2U transfer failure\n");

	return ret;
}
