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

#include <arch_helpers.h>
#include <console.h>
#include <debug.h>
#include <platform.h>
#include <sp805.h>
#include <xlat_tables_v2.h>

/*
 * The following platform functions are all weakly defined. They provide typical
 * implementations that may be re-used by multiple platforms but may also be
 * overridden by a platform if required.
 */

#pragma weak tftf_platform_end
#pragma weak tftf_platform_watchdog_set
#pragma weak tftf_platform_watchdog_reset
#pragma weak tftf_plat_configure_mmu
#pragma weak tftf_plat_enable_mmu
#pragma weak tftf_plat_reset
#pragma weak plat_get_prot_regions

#if IMAGE_TFTF

#define IMAGE_RO_BASE	TFTF_BASE
IMPORT_SYM(uintptr_t,	 __RO_END__,		IMAGE_RO_END);

#define IMAGE_RW_BASE	IMAGE_RO_END
IMPORT_SYM(uintptr_t,	__TFTF_END__,		IMAGE_RW_END);

IMPORT_SYM(uintptr_t,	__COHERENT_RAM_START__,	COHERENT_RAM_START);
IMPORT_SYM(uintptr_t,	__COHERENT_RAM_END__,	COHERENT_RAM_END);

#elif IMAGE_NS_BL1U

IMPORT_SYM(uintptr_t,	 __RO_END__,		IMAGE_RO_END_UNALIGNED);
#define IMAGE_RO_BASE	NS_BL1U_RO_BASE
#define IMAGE_RO_END	round_up(IMAGE_RO_END_UNALIGNED, PAGE_SIZE)

#define IMAGE_RW_BASE	NS_BL1U_RW_BASE
IMPORT_SYM(uintptr_t,	__NS_BL1U_RAM_END__,	IMAGE_RW_END);

#elif IMAGE_NS_BL2U

#define IMAGE_RO_BASE	NS_BL2U_BASE
IMPORT_SYM(uintptr_t,	 __RO_END__,		IMAGE_RO_END);

#define IMAGE_RW_BASE	IMAGE_RO_END
IMPORT_SYM(uintptr_t,	__NS_BL2U_END__,	IMAGE_RW_END_UNALIGNED);
#define IMAGE_RW_END	round_up(IMAGE_RW_END_UNALIGNED, PAGE_SIZE)

#endif

void tftf_platform_end(void)
{
	/*
	 * Send EOT (End Of Transmission) on the UART.
	 * This can be used to shutdown a software model.
	 */
	static const char ascii_eot = 4;
	console_putc(ascii_eot);
}

void tftf_platform_watchdog_set(void)
{
	/* Placeholder function which should be redefined by each platform */
}

void tftf_platform_watchdog_reset(void)
{
	/* Placeholder function which should be redefined by each platform */
}

void tftf_plat_configure_mmu(void)
{
	/* RO data + Code */
	mmap_add_region(IMAGE_RO_BASE, IMAGE_RO_BASE,
			IMAGE_RO_END - IMAGE_RO_BASE, MT_CODE);

	/* Data + BSS */
	mmap_add_region(IMAGE_RW_BASE, IMAGE_RW_BASE,
			IMAGE_RW_END - IMAGE_RW_BASE, MT_RW_DATA);

#if IMAGE_TFTF
	mmap_add_region(COHERENT_RAM_START, COHERENT_RAM_START,
			COHERENT_RAM_END - COHERENT_RAM_START,
			MT_DEVICE | MT_RW | MT_NS);
#endif

	mmap_add(tftf_platform_get_mmap());
	init_xlat_tables();

	tftf_plat_enable_mmu();
}

void tftf_plat_enable_mmu(void)
{
#ifndef AARCH32
	if (IS_IN_EL1())
		enable_mmu_el1(0);
	else if (IS_IN_EL2())
		enable_mmu_el2(0);
	else
		panic();
#else
	if (IS_IN_HYP())
		enable_mmu_hyp(0);
	else
		enable_mmu_svc_mon(0);
#endif
}

void tftf_plat_reset(void)
{
	/*
	 * SP805 peripheral interrupt is not serviced in TFTF. The reset signal
	 * generated by it is used to reset the platform.
	 */
	sp805_wdog_start(1);

	/*
	 * Reset might take some execution cycles, Depending on the ratio between
	 * CPU clock frequency and Watchdog clock frequency
	 */
	while (1)
		;
}

const mem_region_t *plat_get_prot_regions(int *nelem)
{
	*nelem = 0;
	return NULL;
}
