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 Faurestatic 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