1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright 2017-2019 NXP 4 * 5 * Brief CAAM Global Controller. 6 */ 7 #include <caam_common.h> 8 #include <caam_hal_cfg.h> 9 #include <caam_hal_clk.h> 10 #include <caam_hal_ctrl.h> 11 #include <caam_hash.h> 12 #include <caam_jr.h> 13 #include <caam_pwr.h> 14 #include <caam_rng.h> 15 #include <caam_utils_mem.h> 16 #include <initcall.h> 17 #include <kernel/panic.h> 18 #include <tee_api_types.h> 19 20 /* Crypto driver initialization */ 21 static TEE_Result crypto_driver_init(void) 22 { 23 TEE_Result retresult = TEE_ERROR_GENERIC; 24 enum caam_status retstatus = CAAM_FAILURE; 25 struct caam_jrcfg jrcfg = {}; 26 27 /* Enable the CAAM Clock */ 28 caam_hal_clk_enable(true); 29 30 retstatus = caam_hal_cfg_get_conf(&jrcfg); 31 if (retstatus != CAAM_NO_ERROR) { 32 retresult = TEE_ERROR_NOT_SUPPORTED; 33 goto exit_init; 34 } 35 36 /* Initialize the CAAM Controller */ 37 caam_hal_ctrl_init(jrcfg.base); 38 39 /* Initialize the Job Ring to be used */ 40 retstatus = caam_jr_init(&jrcfg); 41 if (retstatus != CAAM_NO_ERROR) { 42 retresult = TEE_ERROR_GENERIC; 43 goto exit_init; 44 } 45 46 /* Initialize the RNG Module */ 47 retstatus = caam_rng_init(jrcfg.base); 48 if (retstatus != CAAM_NO_ERROR) { 49 retresult = TEE_ERROR_GENERIC; 50 goto exit_init; 51 } 52 53 /* Initialize the Hash Module */ 54 retstatus = caam_hash_init(jrcfg.base); 55 if (retstatus != CAAM_NO_ERROR) { 56 retresult = TEE_ERROR_GENERIC; 57 goto exit_init; 58 } 59 60 /* Everything is OK, register the Power Management handler */ 61 caam_pwr_init(); 62 63 /* 64 * Configure Job Rings to NS World 65 * If the Driver Crypto is not used CFG_NXP_CAAM_RUNTIME_JR is not 66 * enable, hence relax the JR used for the CAAM configuration to 67 * the Non-Secure 68 */ 69 if (jrcfg.base) 70 caam_hal_cfg_setup_nsjobring(&jrcfg); 71 72 retresult = TEE_SUCCESS; 73 exit_init: 74 if (retresult != TEE_SUCCESS) { 75 EMSG("CAAM Driver initialization (0x%" PRIx32 ")", retresult); 76 panic(); 77 } 78 79 return retresult; 80 } 81 82 driver_init(crypto_driver_init); 83 84 /* Crypto driver late initialization to complete on-going CAAM operations */ 85 static TEE_Result init_caam_late(void) 86 { 87 enum caam_status ret = CAAM_BUSY; 88 89 ret = caam_jr_complete(); 90 91 if (ret != CAAM_NO_ERROR) { 92 EMSG("CAAM initialization failed"); 93 panic(); 94 } 95 96 return TEE_SUCCESS; 97 } 98 99 driver_init_late(init_caam_late); 100