blob: 394ea29834d5d1db41b3d6fb450467cfb72c1762 [file] [log] [blame]
// 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);
}
}