| // 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); |
| } |
| } |