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

/* SDEI configuration for ARM platforms */

#include <bl31/ehf.h>
#include <common/debug.h>
#include <services/sdei.h>

#if SDEI_IN_FCONF
#include <plat/arm/common/fconf_sdei_getter.h>
#endif
#include <plat/common/platform.h>
#include <platform_def.h>


#if SDEI_IN_FCONF
/* Private event mappings */
static sdei_ev_map_t arm_sdei_private[PLAT_SDEI_DP_EVENT_MAX_CNT + 1] = { 0 };

/* Shared event mappings */
static sdei_ev_map_t arm_sdei_shared[PLAT_SDEI_DS_EVENT_MAX_CNT] = { 0 };

void plat_sdei_setup(void)
{
	uint32_t i;

	arm_sdei_private[0] = (sdei_ev_map_t)SDEI_DEFINE_EVENT_0(ARM_SDEI_SGI);

	for (i = 0; i < FCONF_GET_PROPERTY(sdei, dyn_config, private_ev_cnt); i++) {
		arm_sdei_private[i + 1] = (sdei_ev_map_t)SDEI_PRIVATE_EVENT(
			FCONF_GET_PROPERTY(sdei, dyn_config, private_ev_nums[i]),
			FCONF_GET_PROPERTY(sdei, dyn_config, private_ev_intrs[i]),
			FCONF_GET_PROPERTY(sdei, dyn_config, private_ev_flags[i]));
	}

	for (i = 0; i < FCONF_GET_PROPERTY(sdei, dyn_config, shared_ev_cnt); i++) {
		arm_sdei_shared[i] = (sdei_ev_map_t)SDEI_SHARED_EVENT(
			FCONF_GET_PROPERTY(sdei, dyn_config, shared_ev_nums[i]),
			FCONF_GET_PROPERTY(sdei, dyn_config, shared_ev_intrs[i]),
			FCONF_GET_PROPERTY(sdei, dyn_config, shared_ev_flags[i]));
	}
	INFO("FCONF: SDEI platform setup\n");
}
#else
/* Private event mappings */
static sdei_ev_map_t arm_sdei_private[] = {
	PLAT_ARM_PRIVATE_SDEI_EVENTS
};

/* Shared event mappings */
static sdei_ev_map_t arm_sdei_shared[] = {
	PLAT_ARM_SHARED_SDEI_EVENTS
};

void plat_sdei_setup(void)
{
	INFO("SDEI platform setup\n");
}
#endif /* SDEI_IN_FCONF */

/* Export ARM SDEI events */
REGISTER_SDEI_MAP(arm_sdei_private, arm_sdei_shared);
