xref: /optee_os/core/drivers/crypto/versal/ipi.c (revision a846630f4435a7127bdee968781e6d6eb296f5fa)
1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3  * Copyright (C) Foundries Ltd. 2022
4  * Author: Jorge Ramirez <jorge@foundries.io>
5  */
6 
7 #include <arm.h>
8 #include <initcall.h>
9 #include <ipi.h>
10 #include <kernel/panic.h>
11 #include <mm/core_memprot.h>
12 #include <string.h>
13 #include <tee/cache.h>
14 #include <util.h>
15 
16 #define SEC_MODULE_SHIFT 8
17 #define SEC_MODULE_ID 5
18 
19 #define CRYPTO_API_ID(__x) ((SEC_MODULE_ID << SEC_MODULE_SHIFT) | (__x))
20 
21 static TEE_Result versal_aes_update_aad_request(enum versal_crypto_api id,
22 						struct versal_cmd_args *arg)
23 {
24 	struct versal_ipi_cmd cmd = { };
25 	uint32_t a = 0;
26 	uint32_t b = 0;
27 
28 	reg_pair_from_64(virt_to_phys(arg->ibuf[0].mem.buf), &b, &a);
29 
30 	cmd.data[0] = CRYPTO_API_ID(id);
31 	cmd.data[1] = a;
32 	cmd.data[2] = b;
33 	cmd.data[3] = arg->data[0];
34 
35 	cmd.ibuf[0].mem = arg->ibuf[0].mem;
36 
37 	return versal_mbox_notify(&cmd, NULL, NULL);
38 }
39 
40 TEE_Result versal_crypto_request(enum versal_crypto_api id,
41 				 struct versal_cmd_args *arg, uint32_t *err)
42 {
43 	struct versal_ipi_cmd cmd = { };
44 	uint32_t a = 0;
45 	uint32_t b = 0;
46 	size_t i = 0;
47 
48 	if (id == VERSAL_AES_UPDATE_AAD)
49 		return versal_aes_update_aad_request(id, arg);
50 
51 	cmd.data[0] = CRYPTO_API_ID(id);
52 	for (i = 1; i < arg->dlen + 1; i++)
53 		cmd.data[i] = arg->data[i - 1];
54 
55 	/* src */
56 	if (!arg->ibuf[0].mem.buf)
57 		goto notify;
58 
59 	reg_pair_from_64(virt_to_phys(arg->ibuf[0].mem.buf), &b, &a);
60 	cmd.data[i++] = a;
61 	cmd.data[i++] = b;
62 
63 	/* dst */
64 	if (!arg->ibuf[1].mem.buf)
65 		goto cache;
66 
67 	if (arg->ibuf[1].only_cache)
68 		goto cache;
69 
70 	reg_pair_from_64(virt_to_phys(arg->ibuf[1].mem.buf), &b, &a);
71 	cmd.data[i++] = a;
72 	cmd.data[i++] = b;
73 cache:
74 	for (i = 0; i < VERSAL_MAX_IPI_BUF; i++)
75 		cmd.ibuf[i].mem = arg->ibuf[i].mem;
76 notify:
77 	return versal_mbox_notify(&cmd, NULL, err);
78 }
79