/*
 * Copyright (c) 2023, ARM Limited and Contributors. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */
#include <common/debug.h>
#include <services/el3_spmd_logical_sp.h>
#include <services/ffa_svc.h>
#include <smccc_helpers.h>

#define SPMD_LP_PARTITION_ID SPMD_LP_ID_START
#define SPMD_LP_UUID {0xe98e43ad, 0xb7db524f, 0x47a3bf57, 0x1588f4e3}

/* SPMD Logical SP currently only supports sending direct message. */
#define SPMD_PARTITION_PROPERTIES FFA_PARTITION_DIRECT_REQ_SEND

#define SPMD_LP_MAX_SUPPORTED_SP 10
static void fvp_get_partition_info(void)
{
	struct ffa_value ret = { 0 };
	uint32_t target_uuid[4] = { 0 };
	static struct ffa_partition_info_v1_1
		part_info[SPMD_LP_MAX_SUPPORTED_SP] = { 0 };

	uint16_t num_partitions = 0;

	if (!spmd_el3_invoke_partition_info_get(target_uuid, 0, 0, &ret)) {
		panic();
	}

	if (is_ffa_error(&ret)) {
		panic();
	}

	num_partitions = ffa_partition_info_regs_get_last_idx(ret) + 1;
	if (num_partitions > SPMD_LP_MAX_SUPPORTED_SP) {
		panic();
	}

	INFO("Number of secure partitions = %d\n", num_partitions);

	for (uint16_t i = 0; i < num_partitions; i++) {
		INFO("***Start Partition***\n");
		if (!ffa_partition_info_regs_get_part_info(ret, i, &part_info[i]))
			panic();
		INFO("\tPartition ID: 0x%x\n", part_info[i].ep_id);
		INFO("\tvCPU count:0x%x\n", part_info[i].execution_ctx_count);
		INFO("\tProperties: 0x%x\n", part_info[i].properties);
		INFO("\tUUID: 0x%x 0x%x 0x%x 0x%x\n", part_info[i].uuid[0],
				part_info[i].uuid[1], part_info[i].uuid[2],
				part_info[i].uuid[3]);
		INFO("***End Partition***\n");
	}

}

static int32_t fvp_spmd_logical_partition_init(void)
{
	INFO("FVP SPMD LSP: Init function called.\n");

	fvp_get_partition_info();
	return 0;
}

/*
 * Platform specific SMC handler used to translate SIP SMCs or other platform
 * specific SMCs into FF-A direct messages.
 */
uintptr_t plat_spmd_logical_sp_smc_handler(unsigned int smc_fid,
			u_register_t x1,
			u_register_t x2,
			u_register_t x3,
			u_register_t x4,
			void *cookie,
			void *handle,
			u_register_t flags)
{
	struct ffa_value retval = { 0 };
	uint64_t send_recv_id = SPMD_LP_PARTITION_ID << 16 | 0x8001;

	/*
	 * Forward the SMC as direct request.
	 */
	if (!spmd_el3_ffa_msg_direct_req(send_recv_id, x2, x3, x4, handle, &retval)) {
		panic();
	}

	SMC_RET8(handle, retval.func, retval.arg1, retval.arg2, retval.arg3,
			retval.arg4, retval.arg5, retval.arg6, retval.arg7);
}

/* Register SPMD logical partition  */
DECLARE_SPMD_LOGICAL_PARTITION(
	fvp_spmd_logical_partition,
	fvp_spmd_logical_partition_init,/* Init Function */
	SPMD_LP_PARTITION_ID,		/* FF-A Partition ID */
	SPMD_LP_UUID,			/* UUID */
	SPMD_PARTITION_PROPERTIES	/* Partition Properties. */
);
