xref: /optee_os/core/drivers/imx/dcp/dcp_utils.c (revision 8e155bae3a5eb9d1a3ed9260bd7281a7a35f5086)
193e678edSClement Faure // SPDX-License-Identifier: BSD-2-Clause
293e678edSClement Faure /*
393e678edSClement Faure  * Copyright 2020 NXP
493e678edSClement Faure  */
593e678edSClement Faure #include <dcp_utils.h>
693e678edSClement Faure #include <drivers/imx/dcp.h>
7*8e155baeSVesa Jääskeläinen #include <kernel/tee_misc.h>
893e678edSClement Faure #include <malloc.h>
993e678edSClement Faure #include <mm/core_memprot.h>
1093e678edSClement Faure #include <string.h>
1193e678edSClement Faure #include <trace.h>
1293e678edSClement Faure 
dcp_calloc_align_buf(struct dcp_align_buf * buf,size_t size)1393e678edSClement Faure TEE_Result dcp_calloc_align_buf(struct dcp_align_buf *buf, size_t size)
1493e678edSClement Faure {
1593e678edSClement Faure 	if (!buf) {
1693e678edSClement Faure 		EMSG("Error, buf is null");
1793e678edSClement Faure 		return TEE_ERROR_BAD_PARAMETERS;
1893e678edSClement Faure 	}
1993e678edSClement Faure 
20*8e155baeSVesa Jääskeläinen 	buf->data = alloc_cache_aligned(size);
2193e678edSClement Faure 	if (!buf->data)
2293e678edSClement Faure 		return TEE_ERROR_OUT_OF_MEMORY;
2393e678edSClement Faure 
2493e678edSClement Faure 	buf->paddr = virt_to_phys(buf->data);
2593e678edSClement Faure 
2693e678edSClement Faure 	if (!buf->paddr) {
2793e678edSClement Faure 		dcp_free(buf);
2893e678edSClement Faure 		return TEE_ERROR_OUT_OF_MEMORY;
2993e678edSClement Faure 	}
3093e678edSClement Faure 
3193e678edSClement Faure 	buf->size = size;
3293e678edSClement Faure 
3393e678edSClement Faure 	return TEE_SUCCESS;
3493e678edSClement Faure }
3593e678edSClement Faure 
dcp_free(struct dcp_align_buf * buf)3693e678edSClement Faure void dcp_free(struct dcp_align_buf *buf)
3793e678edSClement Faure {
3893e678edSClement Faure 	free(buf->data);
3993e678edSClement Faure }
4093e678edSClement Faure 
dcp_left_shift_buffer(uint8_t * input,uint8_t * result,size_t buffer_size)4193e678edSClement Faure void dcp_left_shift_buffer(uint8_t *input, uint8_t *result, size_t buffer_size)
4293e678edSClement Faure {
4393e678edSClement Faure 	unsigned int i = 0;
4493e678edSClement Faure 	uint8_t overflow = 0;
4593e678edSClement Faure 
4693e678edSClement Faure 	/* For each byte */
4793e678edSClement Faure 	for (i = 0; i < buffer_size; i++) {
4893e678edSClement Faure 		/* Left shift a bytes by one */
4993e678edSClement Faure 		result[buffer_size - 1 - i] =
5093e678edSClement Faure 			input[buffer_size - 1 - i] << 1 | overflow;
5193e678edSClement Faure 
5293e678edSClement Faure 		overflow = input[buffer_size - 1 - i] >> 7;
5393e678edSClement Faure 	}
5493e678edSClement Faure }
5593e678edSClement Faure 
dcp_udelay(uint32_t time)5693e678edSClement Faure void dcp_udelay(uint32_t time)
5793e678edSClement Faure {
5893e678edSClement Faure 	uint32_t counter = time * 500;
5993e678edSClement Faure 
6093e678edSClement Faure 	/* Implementation of a Software loop assuming CPU clock of 500MHz */
6193e678edSClement Faure 	while (counter--) {
6293e678edSClement Faure 		isb();
6393e678edSClement Faure 		dsb();
6493e678edSClement Faure 	};
6593e678edSClement Faure }
6693e678edSClement Faure 
dcp_reverse(uint8_t * in,uint8_t * out,size_t size)6793e678edSClement Faure void dcp_reverse(uint8_t *in, uint8_t *out, size_t size)
6893e678edSClement Faure {
6993e678edSClement Faure 	unsigned int i = 0;
7093e678edSClement Faure 
7193e678edSClement Faure 	for (i = 0; i < size; i++)
7293e678edSClement Faure 		out[i] = in[size - 1 - i];
7393e678edSClement Faure }
7493e678edSClement Faure 
dcp_xor(uint8_t * a,uint8_t * b,uint8_t * out,size_t size)7593e678edSClement Faure void dcp_xor(uint8_t *a, uint8_t *b, uint8_t *out, size_t size)
7693e678edSClement Faure {
7793e678edSClement Faure 	unsigned int i = 0;
7893e678edSClement Faure 
7993e678edSClement Faure 	for (i = 0; i < size; i++)
8093e678edSClement Faure 		out[i] = a[i] ^ b[i];
8193e678edSClement Faure }
8293e678edSClement Faure 
dcp_cmac_padding(uint8_t * block,size_t len)8393e678edSClement Faure void dcp_cmac_padding(uint8_t *block, size_t len)
8493e678edSClement Faure {
8593e678edSClement Faure 	unsigned int i = 0;
8693e678edSClement Faure 
8793e678edSClement Faure 	for (i = len; i < DCP_AES128_BLOCK_SIZE; i++) {
8893e678edSClement Faure 		if (i == len)
8993e678edSClement Faure 			block[i] = BIT(7);
9093e678edSClement Faure 		else
9193e678edSClement Faure 			block[i] = 0x0;
9293e678edSClement Faure 	}
9393e678edSClement Faure }
94