/*
 * Copyright (c) 2019, MediaTek Inc. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include <assert.h>
#include <arch_helpers.h>
#include <common/bl_common.h>
#include <common/desc_image_load.h>
#include <plat/common/common_def.h>
#include <drivers/console.h>
#include <common/debug.h>
#include <drivers/generic_delay_timer.h>
#include <mcucfg.h>
#include <mt_gic_v3.h>
#include <lib/coreboot.h>
#include <lib/mmio.h>
#include <mtk_mcdi.h>
#include <mtk_plat_common.h>
#include <mtspmc.h>
#include <plat_debug.h>
#include <plat_params.h>
#include <plat_private.h>
#include <platform_def.h>
#include <scu.h>
#include <spm.h>
#include <drivers/ti/uart/uart_16550.h>

static entry_point_info_t bl32_ep_info;
static entry_point_info_t bl33_ep_info;

static void platform_setup_cpu(void)
{
	mmio_write_32((uintptr_t)&mt8183_mcucfg->mp0_rw_rsvd0, 0x00000001);

	/* Mcusys dcm control */
	/* Enable pll plldiv dcm */
	mmio_setbits_32((uintptr_t)&mt8183_mcucfg->bus_pll_divider_cfg,
		BUS_PLLDIV_DCM);
	mmio_setbits_32((uintptr_t)&mt8183_mcucfg->mp0_pll_divider_cfg,
		MP0_PLLDIV_DCM);
	mmio_setbits_32((uintptr_t)&mt8183_mcucfg->mp2_pll_divider_cfg,
		MP2_PLLDIV_DCM);
	/* Enable mscib dcm  */
	mmio_clrsetbits_32((uintptr_t)&mt8183_mcucfg->mscib_dcm_en,
		MCSIB_CACTIVE_SEL_MASK, MCSIB_CACTIVE_SEL);
	mmio_clrsetbits_32((uintptr_t)&mt8183_mcucfg->mscib_dcm_en,
		MCSIB_DCM_MASK, MCSIB_DCM);
	/* Enable adb400 dcm */
	mmio_clrsetbits_32((uintptr_t)&mt8183_mcucfg->cci_adb400_dcm_config,
		CCI_ADB400_DCM_MASK, CCI_ADB400_DCM);
	/* Enable bus clock dcm */
	mmio_setbits_32((uintptr_t)&mt8183_mcucfg->cci_clk_ctrl,
		MCU_BUS_DCM);
	/* Enable bus fabric dcm */
	mmio_clrsetbits_32(
		(uintptr_t)&mt8183_mcucfg->mcusys_bus_fabric_dcm_ctrl,
		MCUSYS_BUS_FABRIC_DCM_MASK,
		MCUSYS_BUS_FABRIC_DCM);
	/* Enable l2c sram dcm */
	mmio_setbits_32((uintptr_t)&mt8183_mcucfg->l2c_sram_ctrl,
		L2C_SRAM_DCM);
	/* Enable busmp0 sync dcm */
	mmio_clrsetbits_32((uintptr_t)&mt8183_mcucfg->sync_dcm_config,
		SYNC_DCM_MASK, SYNC_DCM);
	/* Enable cntvalue dcm */
	mmio_setbits_32((uintptr_t)&mt8183_mcucfg->mcu_misc_dcm_ctrl,
		CNTVALUEB_DCM);
	/* Enable dcm cluster stall */
	mmio_clrsetbits_32(
		(uintptr_t)&mt8183_mcucfg->sync_dcm_cluster_config,
		MCUSYS_MAX_ACCESS_LATENCY_MASK,
		MCUSYS_MAX_ACCESS_LATENCY);
	mmio_setbits_32((uintptr_t)&mt8183_mcucfg->sync_dcm_cluster_config,
		MCU0_SYNC_DCM_STALL_WR_EN);
	/* Enable rgu dcm */
	mmio_setbits_32((uintptr_t)&mt8183_mcucfg->mp0_rgu_dcm_config,
		CPUSYS_RGU_DCM_CINFIG);
}

/*******************************************************************************
 * Return a pointer to the 'entry_point_info' structure of the next image for
 * the security state specified. BL33 corresponds to the non-secure image type
 * while BL32 corresponds to the secure image type. A NULL pointer is returned
 * if the image does not exist.
 ******************************************************************************/
entry_point_info_t *bl31_plat_get_next_image_ep_info(uint32_t type)
{
	entry_point_info_t *next_image_info;

	next_image_info = (type == NON_SECURE) ? &bl33_ep_info : &bl32_ep_info;
	assert(next_image_info->h.type == PARAM_EP);

	/* None of the images on this platform can have 0x0 as the entrypoint */
	if (next_image_info->pc)
		return next_image_info;
	else
		return NULL;
}

/*******************************************************************************
 * Perform any BL31 early platform setup. Here is an opportunity to copy
 * parameters passed by the calling EL (S-EL1 in BL2 & S-EL3 in BL1) before they
 * are lost (potentially). This needs to be done before the MMU is initialized
 * so that the memory layout can be used while creating page tables.
 * BL2 has flushed this information to memory, so we are guaranteed to pick up
 * good data.
 ******************************************************************************/
void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1,
				u_register_t arg2, u_register_t arg3)
{
	static console_16550_t console;

	params_early_setup(arg1);

#if COREBOOT
	if (coreboot_serial.type)
		console_16550_register(coreboot_serial.baseaddr,
				       coreboot_serial.input_hertz,
				       coreboot_serial.baud,
				       &console);
#else
	console_16550_register(UART0_BASE, UART_CLOCK, UART_BAUDRATE, &console);
#endif

	NOTICE("MT8183 bl31_setup\n");

	bl31_params_parse_helper(arg0, &bl32_ep_info, &bl33_ep_info);
}


/*******************************************************************************
 * Perform any BL31 platform setup code
 ******************************************************************************/
void bl31_platform_setup(void)
{
	platform_setup_cpu();
	generic_delay_timer_init();

	/* Initialize the GIC driver, CPU and distributor interfaces */
	mt_gic_driver_init();
	mt_gic_init();

	/* Init mcsi SF */
	plat_mtk_cci_init_sf();

#if SPMC_MODE == 1
	spmc_init();
#endif
	spm_boot_init();
	mcdi_init();
}

/*******************************************************************************
 * Perform the very early platform specific architectural setup here. At the
 * moment this is only intializes the mmu in a quick and dirty way.
 ******************************************************************************/
void bl31_plat_arch_setup(void)
{
	plat_mtk_cci_init();
	plat_mtk_cci_enable();

	enable_scu(read_mpidr());

	plat_configure_mmu_el3(BL_CODE_BASE,
			       BL_COHERENT_RAM_END - BL_CODE_BASE,
			       BL_CODE_BASE,
			       BL_CODE_END,
			       BL_COHERENT_RAM_BASE,
			       BL_COHERENT_RAM_END);
}
