xref: /rk3399_rockchip-uboot/drivers/crypto/rockchip/crypto_mpa.c (revision 6c61f8c15a4e99d3d9ab1317b2e202e2383dd553)
1*6c61f8c1SLin Jinhan // SPDX-License-Identifier: GPL-2.0
2*6c61f8c1SLin Jinhan /*
3*6c61f8c1SLin Jinhan  * Copyright (c) 2024 Rockchip Electronics Co., Ltd
4*6c61f8c1SLin Jinhan  */
5*6c61f8c1SLin Jinhan 
6*6c61f8c1SLin Jinhan #include <common.h>
7*6c61f8c1SLin Jinhan #include <malloc.h>
8*6c61f8c1SLin Jinhan #include <rockchip/crypto_mpa.h>
9*6c61f8c1SLin Jinhan 
rk_mpa_alloc(struct mpa_num ** mpa,void * data,u32 word_size)10*6c61f8c1SLin Jinhan int rk_mpa_alloc(struct mpa_num **mpa, void *data, u32 word_size)
11*6c61f8c1SLin Jinhan {
12*6c61f8c1SLin Jinhan 	u32 alignment = sizeof(u32);
13*6c61f8c1SLin Jinhan 	u32 byte_size = word_size * sizeof(u32);
14*6c61f8c1SLin Jinhan 	struct mpa_num *tmp_mpa = NULL;
15*6c61f8c1SLin Jinhan 
16*6c61f8c1SLin Jinhan 	if (!mpa || word_size == 0)
17*6c61f8c1SLin Jinhan 		return -EINVAL;
18*6c61f8c1SLin Jinhan 
19*6c61f8c1SLin Jinhan 	*mpa = NULL;
20*6c61f8c1SLin Jinhan 
21*6c61f8c1SLin Jinhan 	tmp_mpa = malloc(sizeof(*tmp_mpa));
22*6c61f8c1SLin Jinhan 	if (!tmp_mpa)
23*6c61f8c1SLin Jinhan 		return -ENOMEM;
24*6c61f8c1SLin Jinhan 
25*6c61f8c1SLin Jinhan 	memset(tmp_mpa, 0x00, sizeof(*tmp_mpa));
26*6c61f8c1SLin Jinhan 
27*6c61f8c1SLin Jinhan 	if (!data || (unsigned long)data % alignment) {
28*6c61f8c1SLin Jinhan 		tmp_mpa->d = memalign(alignment, byte_size);
29*6c61f8c1SLin Jinhan 		if (!tmp_mpa->d) {
30*6c61f8c1SLin Jinhan 			free(tmp_mpa);
31*6c61f8c1SLin Jinhan 			return -ENOMEM;
32*6c61f8c1SLin Jinhan 		}
33*6c61f8c1SLin Jinhan 
34*6c61f8c1SLin Jinhan 		if (data)
35*6c61f8c1SLin Jinhan 			memcpy(tmp_mpa->d, data, byte_size);
36*6c61f8c1SLin Jinhan 		else
37*6c61f8c1SLin Jinhan 			memset(tmp_mpa->d, 0x00, byte_size);
38*6c61f8c1SLin Jinhan 
39*6c61f8c1SLin Jinhan 		tmp_mpa->alloc = MPA_USE_ALLOC;
40*6c61f8c1SLin Jinhan 	} else {
41*6c61f8c1SLin Jinhan 		tmp_mpa->d = data;
42*6c61f8c1SLin Jinhan 	}
43*6c61f8c1SLin Jinhan 
44*6c61f8c1SLin Jinhan 	tmp_mpa->size  = word_size;
45*6c61f8c1SLin Jinhan 
46*6c61f8c1SLin Jinhan 	*mpa = tmp_mpa;
47*6c61f8c1SLin Jinhan 
48*6c61f8c1SLin Jinhan 	return 0;
49*6c61f8c1SLin Jinhan }
50*6c61f8c1SLin Jinhan 
rk_mpa_free(struct mpa_num ** mpa)51*6c61f8c1SLin Jinhan void rk_mpa_free(struct mpa_num **mpa)
52*6c61f8c1SLin Jinhan {
53*6c61f8c1SLin Jinhan 	struct mpa_num *tmp_mpa = NULL;
54*6c61f8c1SLin Jinhan 
55*6c61f8c1SLin Jinhan 	if (mpa && (*mpa)) {
56*6c61f8c1SLin Jinhan 		tmp_mpa = *mpa;
57*6c61f8c1SLin Jinhan 		if (tmp_mpa->alloc == MPA_USE_ALLOC)
58*6c61f8c1SLin Jinhan 			free(tmp_mpa->d);
59*6c61f8c1SLin Jinhan 
60*6c61f8c1SLin Jinhan 		free(tmp_mpa);
61*6c61f8c1SLin Jinhan 	}
62*6c61f8c1SLin Jinhan }
63*6c61f8c1SLin Jinhan 
64*6c61f8c1SLin Jinhan /*get bignum data length*/
rk_check_size(u32 * data,u32 max_word_size)65*6c61f8c1SLin Jinhan int rk_check_size(u32 *data, u32 max_word_size)
66*6c61f8c1SLin Jinhan {
67*6c61f8c1SLin Jinhan 	for (int i = (max_word_size - 1); i >= 0; i--) {
68*6c61f8c1SLin Jinhan 		if (data[i] == 0)
69*6c61f8c1SLin Jinhan 			continue;
70*6c61f8c1SLin Jinhan 		else
71*6c61f8c1SLin Jinhan 			return (i + 1);
72*6c61f8c1SLin Jinhan 	}
73*6c61f8c1SLin Jinhan 	return 0;
74*6c61f8c1SLin Jinhan }
75