blob: 8d427f3c3e72c14dac86d4389ecad987fb355ea2 [file] [log] [blame]
// SPDX-License-Identifier: BSD-2-Clause
/*
* Copyright (C) 2019 Bryan O'Donoghue
* Copyright 2019 NXP
*
* Bryan O'Donoghue <bryan.odonoghue@linaro.org>
*/
#include <initcall.h>
#include <io.h>
#include <mm/core_memprot.h>
#include "imx_caam.h"
register_phys_mem_pgdir(MEM_AREA_IO_SEC, CAAM_BASE, CORE_MMU_PGDIR_SIZE);
static TEE_Result init_caam(void)
{
struct imx_caam_ctrl *caam;
uint32_t reg;
int i;
caam = (struct imx_caam_ctrl *)core_mmu_get_va(CAAM_BASE,
MEM_AREA_IO_SEC);
if (!caam)
return TEE_ERROR_GENERIC;
/*
* Set job-ring ownership to non-secure by default.
* A Linux kernel that runs after OP-TEE will run in normal-world
* so we want to enable that kernel to have total ownership of the
* CAAM job-rings.
*
* It is possible to use CAAM job-rings inside of OP-TEE i.e. in
* secure world code but, to do that OP-TEE and kernel should agree
* via a DTB which job-rings are owned by OP-TEE and which are
* owned by Kernel, something that the OP-TEE CAAM driver should
* set up.
*
* This code below simply sets a default for the case where no
* runtime OP-TEE CAAM code will be run
*/
for (i = 0; i < CAAM_NUM_JOB_RINGS; i++) {
reg = io_read32((vaddr_t)&caam->jr[i].jrmidr_ms);
reg |= JROWN_NS | JROWN_MID;
io_write32((vaddr_t)&caam->jr[i].jrmidr_ms, reg);
}
return TEE_SUCCESS;
}
driver_init(init_caam);