xref: /optee_os/core/drivers/crypto/ele/memutils.c (revision 89aaf545c66d18461586b92ed88a35bfebacb8fe)
1*89aaf545SSahil Malhotra // SPDX-License-Identifier: BSD-2-Clause
2*89aaf545SSahil Malhotra /*
3*89aaf545SSahil Malhotra  * Copyright 2025 NXP
4*89aaf545SSahil Malhotra  */
5*89aaf545SSahil Malhotra #include <io.h>
6*89aaf545SSahil Malhotra #include <kernel/tee_misc.h>
7*89aaf545SSahil Malhotra #include <mm/core_memprot.h>
8*89aaf545SSahil Malhotra #include <string.h>
9*89aaf545SSahil Malhotra #include <memutils.h>
10*89aaf545SSahil Malhotra 
imx_ele_buf_cache_op(enum utee_cache_operation op,struct imx_ele_buf * ele_buf)11*89aaf545SSahil Malhotra static void imx_ele_buf_cache_op(enum utee_cache_operation op,
12*89aaf545SSahil Malhotra 				 struct imx_ele_buf *ele_buf)
13*89aaf545SSahil Malhotra {
14*89aaf545SSahil Malhotra 	if (ele_buf && ele_buf->data)
15*89aaf545SSahil Malhotra 		cache_operation(op, ele_buf->data, ele_buf->size);
16*89aaf545SSahil Malhotra }
17*89aaf545SSahil Malhotra 
imx_ele_buf_alloc(struct imx_ele_buf * ele_buf,const uint8_t * buf,size_t size)18*89aaf545SSahil Malhotra TEE_Result imx_ele_buf_alloc(struct imx_ele_buf *ele_buf, const uint8_t *buf,
19*89aaf545SSahil Malhotra 			     size_t size)
20*89aaf545SSahil Malhotra {
21*89aaf545SSahil Malhotra 	if (!ele_buf || !size)
22*89aaf545SSahil Malhotra 		return TEE_ERROR_BAD_PARAMETERS;
23*89aaf545SSahil Malhotra 
24*89aaf545SSahil Malhotra 	ele_buf->data = alloc_cache_aligned(size);
25*89aaf545SSahil Malhotra 	if (!ele_buf->data) {
26*89aaf545SSahil Malhotra 		EMSG("buffer allocation failed");
27*89aaf545SSahil Malhotra 		return TEE_ERROR_OUT_OF_MEMORY;
28*89aaf545SSahil Malhotra 	}
29*89aaf545SSahil Malhotra 
30*89aaf545SSahil Malhotra 	ele_buf->paddr = virt_to_phys(ele_buf->data);
31*89aaf545SSahil Malhotra 	if (!ele_buf->paddr) {
32*89aaf545SSahil Malhotra 		free(ele_buf->data);
33*89aaf545SSahil Malhotra 		return TEE_ERROR_OUT_OF_MEMORY;
34*89aaf545SSahil Malhotra 	}
35*89aaf545SSahil Malhotra 
36*89aaf545SSahil Malhotra 	reg_pair_from_64((uint64_t)ele_buf->paddr, &ele_buf->paddr_msb,
37*89aaf545SSahil Malhotra 			 &ele_buf->paddr_lsb);
38*89aaf545SSahil Malhotra 
39*89aaf545SSahil Malhotra 	ele_buf->size = size;
40*89aaf545SSahil Malhotra 
41*89aaf545SSahil Malhotra 	if (buf)
42*89aaf545SSahil Malhotra 		memcpy(ele_buf->data, buf, size);
43*89aaf545SSahil Malhotra 
44*89aaf545SSahil Malhotra 	imx_ele_buf_cache_op(TEE_CACHEFLUSH, ele_buf);
45*89aaf545SSahil Malhotra 
46*89aaf545SSahil Malhotra 	return TEE_SUCCESS;
47*89aaf545SSahil Malhotra }
48*89aaf545SSahil Malhotra 
imx_ele_buf_free(struct imx_ele_buf * ele_buf)49*89aaf545SSahil Malhotra void imx_ele_buf_free(struct imx_ele_buf *ele_buf)
50*89aaf545SSahil Malhotra {
51*89aaf545SSahil Malhotra 	if (ele_buf) {
52*89aaf545SSahil Malhotra 		free(ele_buf->data);
53*89aaf545SSahil Malhotra 		ele_buf->data = NULL;
54*89aaf545SSahil Malhotra 		ele_buf->paddr = 0;
55*89aaf545SSahil Malhotra 		ele_buf->size = 0;
56*89aaf545SSahil Malhotra 	}
57*89aaf545SSahil Malhotra }
58*89aaf545SSahil Malhotra 
imx_ele_buf_copy(struct imx_ele_buf * ele_buf,uint8_t * buf,size_t size)59*89aaf545SSahil Malhotra TEE_Result imx_ele_buf_copy(struct imx_ele_buf *ele_buf, uint8_t *buf,
60*89aaf545SSahil Malhotra 			    size_t size)
61*89aaf545SSahil Malhotra {
62*89aaf545SSahil Malhotra 	if (!ele_buf || !buf || !size)
63*89aaf545SSahil Malhotra 		return TEE_ERROR_BAD_PARAMETERS;
64*89aaf545SSahil Malhotra 
65*89aaf545SSahil Malhotra 	if (size < ele_buf->size)
66*89aaf545SSahil Malhotra 		return TEE_ERROR_SHORT_BUFFER;
67*89aaf545SSahil Malhotra 
68*89aaf545SSahil Malhotra 	imx_ele_buf_cache_op(TEE_CACHEINVALIDATE, ele_buf);
69*89aaf545SSahil Malhotra 	memcpy(buf, ele_buf->data, ele_buf->size);
70*89aaf545SSahil Malhotra 
71*89aaf545SSahil Malhotra 	return TEE_SUCCESS;
72*89aaf545SSahil Malhotra }
73