xref: /optee_os/core/drivers/crypto/caam/caam_ctrl.c (revision 2d7a8964dfcbe6c3494a0889831818dd8f153f4a)
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