xref: /optee_os/core/drivers/crypto/versal/ipi.c (revision 4502832d4a4766aa5219a31a4c7983cbbbb59231)
1614bc034SJorge Ramirez-Ortiz // SPDX-License-Identifier: BSD-2-Clause
2614bc034SJorge Ramirez-Ortiz /*
3614bc034SJorge Ramirez-Ortiz  * Copyright (C) Foundries Ltd. 2022
4614bc034SJorge Ramirez-Ortiz  * Author: Jorge Ramirez <jorge@foundries.io>
5614bc034SJorge Ramirez-Ortiz  */
6614bc034SJorge Ramirez-Ortiz 
7614bc034SJorge Ramirez-Ortiz #include <arm.h>
8614bc034SJorge Ramirez-Ortiz #include <initcall.h>
9614bc034SJorge Ramirez-Ortiz #include <ipi.h>
10614bc034SJorge Ramirez-Ortiz #include <kernel/panic.h>
11614bc034SJorge Ramirez-Ortiz #include <mm/core_memprot.h>
12614bc034SJorge Ramirez-Ortiz #include <string.h>
13614bc034SJorge Ramirez-Ortiz #include <tee/cache.h>
14614bc034SJorge Ramirez-Ortiz #include <util.h>
15614bc034SJorge Ramirez-Ortiz 
16614bc034SJorge Ramirez-Ortiz #define SEC_MODULE_SHIFT 8
17614bc034SJorge Ramirez-Ortiz #define SEC_MODULE_ID 5
18614bc034SJorge Ramirez-Ortiz 
19614bc034SJorge Ramirez-Ortiz #define CRYPTO_API_ID(__x) ((SEC_MODULE_ID << SEC_MODULE_SHIFT) | (__x))
20614bc034SJorge Ramirez-Ortiz 
versal_sha3_request(enum versal_crypto_api id,struct versal_cmd_args * arg)21*4502832dSJorge Ramirez-Ortiz static TEE_Result versal_sha3_request(enum versal_crypto_api id,
22*4502832dSJorge Ramirez-Ortiz 				      struct versal_cmd_args *arg)
23*4502832dSJorge Ramirez-Ortiz {
24*4502832dSJorge Ramirez-Ortiz 	struct versal_ipi_cmd cmd = { };
25*4502832dSJorge Ramirez-Ortiz 	uint32_t a = 0;
26*4502832dSJorge Ramirez-Ortiz 	uint32_t b = 0;
27*4502832dSJorge Ramirez-Ortiz 
28*4502832dSJorge Ramirez-Ortiz 	cmd.data[0] = CRYPTO_API_ID(id);
29*4502832dSJorge Ramirez-Ortiz 
30*4502832dSJorge Ramirez-Ortiz 	if (arg->data[0]) {
31*4502832dSJorge Ramirez-Ortiz 		/* write */
32*4502832dSJorge Ramirez-Ortiz 		reg_pair_from_64(virt_to_phys(arg->ibuf[0].mem.buf), &b, &a);
33*4502832dSJorge Ramirez-Ortiz 		cmd.data[1] = a;
34*4502832dSJorge Ramirez-Ortiz 		cmd.data[2] = b;
35*4502832dSJorge Ramirez-Ortiz 		cmd.data[3] = arg->data[0];
36*4502832dSJorge Ramirez-Ortiz 
37*4502832dSJorge Ramirez-Ortiz 		cmd.ibuf[0].mem = arg->ibuf[0].mem;
38*4502832dSJorge Ramirez-Ortiz 	} else {
39*4502832dSJorge Ramirez-Ortiz 		/* read */
40*4502832dSJorge Ramirez-Ortiz 		reg_pair_from_64(virt_to_phys(arg->ibuf[0].mem.buf), &b, &a);
41*4502832dSJorge Ramirez-Ortiz 		cmd.data[4] = a;
42*4502832dSJorge Ramirez-Ortiz 		cmd.data[5] = b;
43*4502832dSJorge Ramirez-Ortiz 
44*4502832dSJorge Ramirez-Ortiz 		cmd.ibuf[0].mem = arg->ibuf[0].mem;
45*4502832dSJorge Ramirez-Ortiz 	}
46*4502832dSJorge Ramirez-Ortiz 
47*4502832dSJorge Ramirez-Ortiz 	return versal_mbox_notify(&cmd, NULL, NULL);
48*4502832dSJorge Ramirez-Ortiz }
49*4502832dSJorge Ramirez-Ortiz 
versal_aes_update_aad_request(enum versal_crypto_api id,struct versal_cmd_args * arg)50dc23c448SJorge Ramirez-Ortiz static TEE_Result versal_aes_update_aad_request(enum versal_crypto_api id,
51dc23c448SJorge Ramirez-Ortiz 						struct versal_cmd_args *arg)
52dc23c448SJorge Ramirez-Ortiz {
53dc23c448SJorge Ramirez-Ortiz 	struct versal_ipi_cmd cmd = { };
54dc23c448SJorge Ramirez-Ortiz 	uint32_t a = 0;
55dc23c448SJorge Ramirez-Ortiz 	uint32_t b = 0;
56dc23c448SJorge Ramirez-Ortiz 
57dc23c448SJorge Ramirez-Ortiz 	reg_pair_from_64(virt_to_phys(arg->ibuf[0].mem.buf), &b, &a);
58dc23c448SJorge Ramirez-Ortiz 
59dc23c448SJorge Ramirez-Ortiz 	cmd.data[0] = CRYPTO_API_ID(id);
60dc23c448SJorge Ramirez-Ortiz 	cmd.data[1] = a;
61dc23c448SJorge Ramirez-Ortiz 	cmd.data[2] = b;
62dc23c448SJorge Ramirez-Ortiz 	cmd.data[3] = arg->data[0];
63dc23c448SJorge Ramirez-Ortiz 
64dc23c448SJorge Ramirez-Ortiz 	cmd.ibuf[0].mem = arg->ibuf[0].mem;
65dc23c448SJorge Ramirez-Ortiz 
66dc23c448SJorge Ramirez-Ortiz 	return versal_mbox_notify(&cmd, NULL, NULL);
67dc23c448SJorge Ramirez-Ortiz }
68dc23c448SJorge Ramirez-Ortiz 
versal_crypto_request(enum versal_crypto_api id,struct versal_cmd_args * arg,uint32_t * err)69614bc034SJorge Ramirez-Ortiz TEE_Result versal_crypto_request(enum versal_crypto_api id,
70614bc034SJorge Ramirez-Ortiz 				 struct versal_cmd_args *arg, uint32_t *err)
71614bc034SJorge Ramirez-Ortiz {
72614bc034SJorge Ramirez-Ortiz 	struct versal_ipi_cmd cmd = { };
73614bc034SJorge Ramirez-Ortiz 	uint32_t a = 0;
74614bc034SJorge Ramirez-Ortiz 	uint32_t b = 0;
75614bc034SJorge Ramirez-Ortiz 	size_t i = 0;
76614bc034SJorge Ramirez-Ortiz 
77*4502832dSJorge Ramirez-Ortiz 	if (id == VERSAL_SHA3_UPDATE)
78*4502832dSJorge Ramirez-Ortiz 		return versal_sha3_request(id, arg);
79*4502832dSJorge Ramirez-Ortiz 
80dc23c448SJorge Ramirez-Ortiz 	if (id == VERSAL_AES_UPDATE_AAD)
81dc23c448SJorge Ramirez-Ortiz 		return versal_aes_update_aad_request(id, arg);
82dc23c448SJorge Ramirez-Ortiz 
83614bc034SJorge Ramirez-Ortiz 	cmd.data[0] = CRYPTO_API_ID(id);
84614bc034SJorge Ramirez-Ortiz 	for (i = 1; i < arg->dlen + 1; i++)
85614bc034SJorge Ramirez-Ortiz 		cmd.data[i] = arg->data[i - 1];
86614bc034SJorge Ramirez-Ortiz 
87614bc034SJorge Ramirez-Ortiz 	/* src */
88614bc034SJorge Ramirez-Ortiz 	if (!arg->ibuf[0].mem.buf)
89614bc034SJorge Ramirez-Ortiz 		goto notify;
90614bc034SJorge Ramirez-Ortiz 
91614bc034SJorge Ramirez-Ortiz 	reg_pair_from_64(virt_to_phys(arg->ibuf[0].mem.buf), &b, &a);
92614bc034SJorge Ramirez-Ortiz 	cmd.data[i++] = a;
93614bc034SJorge Ramirez-Ortiz 	cmd.data[i++] = b;
94614bc034SJorge Ramirez-Ortiz 
95614bc034SJorge Ramirez-Ortiz 	/* dst */
96614bc034SJorge Ramirez-Ortiz 	if (!arg->ibuf[1].mem.buf)
97614bc034SJorge Ramirez-Ortiz 		goto cache;
98614bc034SJorge Ramirez-Ortiz 
99614bc034SJorge Ramirez-Ortiz 	if (arg->ibuf[1].only_cache)
100614bc034SJorge Ramirez-Ortiz 		goto cache;
101614bc034SJorge Ramirez-Ortiz 
102614bc034SJorge Ramirez-Ortiz 	reg_pair_from_64(virt_to_phys(arg->ibuf[1].mem.buf), &b, &a);
103614bc034SJorge Ramirez-Ortiz 	cmd.data[i++] = a;
104614bc034SJorge Ramirez-Ortiz 	cmd.data[i++] = b;
105614bc034SJorge Ramirez-Ortiz cache:
106614bc034SJorge Ramirez-Ortiz 	for (i = 0; i < VERSAL_MAX_IPI_BUF; i++)
107614bc034SJorge Ramirez-Ortiz 		cmd.ibuf[i].mem = arg->ibuf[i].mem;
108614bc034SJorge Ramirez-Ortiz notify:
109614bc034SJorge Ramirez-Ortiz 	return versal_mbox_notify(&cmd, NULL, err);
110614bc034SJorge Ramirez-Ortiz }
111