// SPDX-License-Identifier: BSD-2-Clause
/*
 * Copyright 2017-2019 NXP
 *
 * Brief   CAAM Configuration.
 */
#include <caam_common.h>
#include <caam_hal_cfg.h>
#include <caam_hal_ctrl.h>
#include <caam_hal_jr.h>
#include <caam_jr.h>
#include <kernel/generic_boot.h>
#include <mm/core_memprot.h>
#include <registers/jr_regs.h>

enum caam_status caam_hal_cfg_get_conf(struct caam_jrcfg *jrcfg)
{
	enum caam_status retstatus = CAAM_FAILURE;
	vaddr_t ctrl_base = 0;
	void *fdt = NULL;

	fdt = get_dt();

	/*
	 * First get the CAAM Controller base address from the DTB,
	 * if DTB present and if the CAAM Controller defined in it.
	 */
	if (fdt)
		caam_hal_cfg_get_ctrl_dt(fdt, &ctrl_base);

	if (!ctrl_base) {
		ctrl_base = (vaddr_t)phys_to_virt(CAAM_BASE, MEM_AREA_IO_SEC);
		if (!ctrl_base) {
			if (!core_mmu_add_mapping(MEM_AREA_IO_SEC, CAAM_BASE,
						  CORE_MMU_PGDIR_SIZE)) {
				EMSG("Unable to map CAAM Registers");
				goto exit_get_conf;
			}

			ctrl_base = (vaddr_t)phys_to_virt(CAAM_BASE,
							  MEM_AREA_IO_SEC);
		}

		if (!ctrl_base) {
			EMSG("Unable to get the CAAM Base address");
			goto exit_get_conf;
		}
	}

	jrcfg->base = ctrl_base;

	/*
	 * Next get the Job Ring reserved for the Secure environment
	 * into the DTB. If nothing reserved use the default hard coded
	 * value.
	 */
	if (fdt)
		caam_hal_cfg_get_jobring_dt(fdt, jrcfg);

	if (!jrcfg->offset) {
		jrcfg->offset = (CFG_JR_INDEX + 1) * JRX_BLOCK_SIZE;
		jrcfg->it_num = CFG_JR_INT;

#ifdef CFG_NXP_CAAM_RUNTIME_JR
		if (fdt) {
			/* Ensure Secure Job Ring is secure only into DTB */
			caam_hal_cfg_disable_jobring_dt(fdt, jrcfg);
		}
#endif
	}

	jrcfg->nb_jobs = NB_JOBS_QUEUE;

	retstatus = CAAM_NO_ERROR;

exit_get_conf:
	HAL_TRACE("HAL CFG Get CAAM config ret (0x%x)\n", retstatus);
	return retstatus;
}

void caam_hal_cfg_setup_nsjobring(struct caam_jrcfg *jrcfg)
{
	enum caam_status status = CAAM_FAILURE;
	paddr_t jr_offset = 0;
	uint8_t jrnum = 0;

	for (jrnum = caam_hal_ctrl_jrnum(jrcfg->base); jrnum; jrnum--) {
		jr_offset = jrnum * JRX_BLOCK_SIZE;

#ifdef CFG_NXP_CAAM_RUNTIME_JR
		/*
		 * When the Cryptographic driver is enabled, keep the
		 * Secure Job Ring don't release it.
		 */
		if (jr_offset == jrcfg->offset)
			continue;
#endif
		status = caam_hal_jr_setowner(jrcfg->base, jr_offset,
					      JROWN_ARM_NS);
		if (status == CAAM_NO_ERROR)
			caam_hal_jr_prepare_backup(jrcfg->base, jr_offset);
	}
}
