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