xref: /optee_os/core/drivers/crypto/versal/ipi.c (revision 614bc034d8ce7e3cfb6da5110d76dbab381ce2c9)
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 TEE_Result versal_crypto_request(enum versal_crypto_api id,
22 				 struct versal_cmd_args *arg, uint32_t *err)
23 {
24 	struct versal_ipi_cmd cmd = { };
25 	uint32_t a = 0;
26 	uint32_t b = 0;
27 	size_t i = 0;
28 
29 	cmd.data[0] = CRYPTO_API_ID(id);
30 	for (i = 1; i < arg->dlen + 1; i++)
31 		cmd.data[i] = arg->data[i - 1];
32 
33 	/* src */
34 	if (!arg->ibuf[0].mem.buf)
35 		goto notify;
36 
37 	reg_pair_from_64(virt_to_phys(arg->ibuf[0].mem.buf), &b, &a);
38 	cmd.data[i++] = a;
39 	cmd.data[i++] = b;
40 
41 	/* dst */
42 	if (!arg->ibuf[1].mem.buf)
43 		goto cache;
44 
45 	if (arg->ibuf[1].only_cache)
46 		goto cache;
47 
48 	reg_pair_from_64(virt_to_phys(arg->ibuf[1].mem.buf), &b, &a);
49 	cmd.data[i++] = a;
50 	cmd.data[i++] = b;
51 cache:
52 	for (i = 0; i < VERSAL_MAX_IPI_BUF; i++)
53 		cmd.ibuf[i].mem = arg->ibuf[i].mem;
54 notify:
55 	return versal_mbox_notify(&cmd, NULL, err);
56 }
57