xref: /optee_os/core/drivers/imx_caam.c (revision fab76a67be360648d5f14df4f10e64476dc5983c)
1*fab76a67SClement Faure // SPDX-License-Identifier: BSD-2-Clause
2*fab76a67SClement Faure /*
3*fab76a67SClement Faure  * Copyright (C) 2019 Bryan O'Donoghue
4*fab76a67SClement Faure  * Copyright 2019, 2023 NXP
5*fab76a67SClement Faure  *
6*fab76a67SClement Faure  * Bryan O'Donoghue <bryan.odonoghue@linaro.org>
7*fab76a67SClement Faure  */
8*fab76a67SClement Faure 
9*fab76a67SClement Faure #include <initcall.h>
10*fab76a67SClement Faure #include <io.h>
11*fab76a67SClement Faure #include <mm/core_memprot.h>
12*fab76a67SClement Faure 
13*fab76a67SClement Faure struct imx_caam_job_ring {
14*fab76a67SClement Faure 	uint32_t			jrmidr_ms;
15*fab76a67SClement Faure 	uint32_t			jrmidr_ls;
16*fab76a67SClement Faure };
17*fab76a67SClement Faure 
18*fab76a67SClement Faure #define CAAM_NUM_JOB_RINGS		4
19*fab76a67SClement Faure 
20*fab76a67SClement Faure /* CAAM ownersip definition bits */
21*fab76a67SClement Faure #define JROWN_NS			BIT(3)
22*fab76a67SClement Faure #define JROWN_MID			0x01
23*fab76a67SClement Faure 
24*fab76a67SClement Faure /* A basic sub-set of the CAAM */
25*fab76a67SClement Faure struct imx_caam_ctrl {
26*fab76a67SClement Faure 	uint32_t			res0;
27*fab76a67SClement Faure 	uint32_t			mcfgr;
28*fab76a67SClement Faure 	uint32_t			res1;
29*fab76a67SClement Faure 	uint32_t			scfgr;
30*fab76a67SClement Faure 	struct imx_caam_job_ring	jr[CAAM_NUM_JOB_RINGS];
31*fab76a67SClement Faure };
32*fab76a67SClement Faure 
33*fab76a67SClement Faure register_phys_mem_pgdir(MEM_AREA_IO_SEC, CAAM_BASE, CORE_MMU_PGDIR_SIZE);
34*fab76a67SClement Faure 
init_caam(void)35*fab76a67SClement Faure static TEE_Result init_caam(void)
36*fab76a67SClement Faure {
37*fab76a67SClement Faure 	struct imx_caam_ctrl *caam;
38*fab76a67SClement Faure 	uint32_t reg;
39*fab76a67SClement Faure 	int i;
40*fab76a67SClement Faure 
41*fab76a67SClement Faure 	caam = (struct imx_caam_ctrl *)
42*fab76a67SClement Faure 		core_mmu_get_va(CAAM_BASE, MEM_AREA_IO_SEC,
43*fab76a67SClement Faure 				sizeof(struct imx_caam_ctrl));
44*fab76a67SClement Faure 	if (!caam)
45*fab76a67SClement Faure 		return TEE_ERROR_GENERIC;
46*fab76a67SClement Faure 
47*fab76a67SClement Faure 	/*
48*fab76a67SClement Faure 	 * Set job-ring ownership to non-secure by default.
49*fab76a67SClement Faure 	 * A Linux kernel that runs after OP-TEE will run in normal-world
50*fab76a67SClement Faure 	 * so we want to enable that kernel to have total ownership of the
51*fab76a67SClement Faure 	 * CAAM job-rings.
52*fab76a67SClement Faure 	 *
53*fab76a67SClement Faure 	 * It is possible to use CAAM job-rings inside of OP-TEE i.e. in
54*fab76a67SClement Faure 	 * secure world code but, to do that OP-TEE and kernel should agree
55*fab76a67SClement Faure 	 * via a DTB which job-rings are owned by OP-TEE and which are
56*fab76a67SClement Faure 	 * owned by Kernel, something that the OP-TEE CAAM driver should
57*fab76a67SClement Faure 	 * set up.
58*fab76a67SClement Faure 	 *
59*fab76a67SClement Faure 	 * This code below simply sets a default for the case where no
60*fab76a67SClement Faure 	 * runtime OP-TEE CAAM code will be run
61*fab76a67SClement Faure 	 */
62*fab76a67SClement Faure 	for (i = 0; i < CAAM_NUM_JOB_RINGS; i++) {
63*fab76a67SClement Faure 		reg = io_read32((vaddr_t)&caam->jr[i].jrmidr_ms);
64*fab76a67SClement Faure 		reg |= JROWN_NS | JROWN_MID;
65*fab76a67SClement Faure 		io_write32((vaddr_t)&caam->jr[i].jrmidr_ms, reg);
66*fab76a67SClement Faure 	}
67*fab76a67SClement Faure 
68*fab76a67SClement Faure 	return TEE_SUCCESS;
69*fab76a67SClement Faure }
70*fab76a67SClement Faure 
71*fab76a67SClement Faure driver_init(init_caam);
72