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