xref: /rk3399_rockchip-uboot/include/rockchip/crypto_v2_util.h (revision b353a43c9e441e8665efd1cc47824714ad67ed3f)
1*b353a43cSLin Jinhan /* SPDX-License-Identifier:     GPL-2.0+ */
2*b353a43cSLin Jinhan /*
3*b353a43cSLin Jinhan  * (C) Copyright 2019 Rockchip Electronics Co., Ltd
4*b353a43cSLin Jinhan  */
5*b353a43cSLin Jinhan 
6*b353a43cSLin Jinhan #ifndef _ROCKCHIP_CRYPTO_V2_UTIL_H_
7*b353a43cSLin Jinhan #define _ROCKCHIP_CRYPTO_V2_UTIL_H_
8*b353a43cSLin Jinhan 
9*b353a43cSLin Jinhan #ifdef __cplusplus
10*b353a43cSLin Jinhan extern "C"
11*b353a43cSLin Jinhan {
12*b353a43cSLin Jinhan #endif
13*b353a43cSLin Jinhan 
14*b353a43cSLin Jinhan /************************ Defines ******************************/
15*b353a43cSLin Jinhan 
16*b353a43cSLin Jinhan /* invers the bytes on a word- used for output from HASH */
17*b353a43cSLin Jinhan #ifdef BIG__ENDIAN
18*b353a43cSLin Jinhan #define UTIL_INVERSE_UINT32_BYTES(val)	(val)
19*b353a43cSLin Jinhan #else
20*b353a43cSLin Jinhan #define UTIL_INVERSE_UINT32_BYTES(val) \
21*b353a43cSLin Jinhan 	(((val) >> 24) | (((val) & 0x00FF0000) >> 8) | \
22*b353a43cSLin Jinhan 	(((val) & 0x0000FF00) << 8) | (((val) & 0x000000FF) << 24))
23*b353a43cSLin Jinhan #endif
24*b353a43cSLin Jinhan 
25*b353a43cSLin Jinhan /* invers the bytes on a word - used for input data for HASH */
26*b353a43cSLin Jinhan #ifdef BIG__ENDIAN
27*b353a43cSLin Jinhan #define UTIL_REVERT_UINT32_BYTES(val) \
28*b353a43cSLin Jinhan 	(((val) >> 24) | (((val) & 0x00FF0000) >> 8) | \
29*b353a43cSLin Jinhan 	(((val) & 0x0000FF00) << 8) | (((val) & 0x000000FF) << 24))
30*b353a43cSLin Jinhan #else
31*b353a43cSLin Jinhan #define UTIL_REVERT_UINT32_BYTES(val)	(val)
32*b353a43cSLin Jinhan #endif
33*b353a43cSLin Jinhan 
34*b353a43cSLin Jinhan /* the minimum and maximum macros */
35*b353a43cSLin Jinhan #undef min
36*b353a43cSLin Jinhan #define min(a, b) (((a) < (b)) ? (a) : (b))
37*b353a43cSLin Jinhan 
38*b353a43cSLin Jinhan #undef max
39*b353a43cSLin Jinhan #define max(a, b) (((a) > (b)) ? (a) : (b))
40*b353a43cSLin Jinhan 
41*b353a43cSLin Jinhan /* MACRO to count one bits */
42*b353a43cSLin Jinhan #define COUNT_ONE_BITS(number, bit_count) \
43*b353a43cSLin Jinhan do { \
44*b353a43cSLin Jinhan 	u32 tmp_num = number; \
45*b353a43cSLin Jinhan 	bit_count = 0; \
46*b353a43cSLin Jinhan 	while (tmp_num) { \
47*b353a43cSLin Jinhan 		tmp_num = tmp_num & (tmp_num - 1); \
48*b353a43cSLin Jinhan 	bit_count = bit_count + 1; \
49*b353a43cSLin Jinhan 	} \
50*b353a43cSLin Jinhan } while (0)
51*b353a43cSLin Jinhan 
52*b353a43cSLin Jinhan /* ------------------------------------------------------------
53*b353a43cSLin Jinhan  **
54*b353a43cSLin Jinhan  * @brief This function executes a reversed words copy on a specified buffer.
55*b353a43cSLin Jinhan  *
56*b353a43cSLin Jinhan  *        on a 6 words byffer:
57*b353a43cSLin Jinhan  *
58*b353a43cSLin Jinhan  *        buff[5] <---> buff[0]
59*b353a43cSLin Jinhan  *        buff[4] <---> buff[1]
60*b353a43cSLin Jinhan  *        buff[3] <---> buff[2]
61*b353a43cSLin Jinhan  *
62*b353a43cSLin Jinhan  * @param[in] dst_ptr - The counter buffer.
63*b353a43cSLin Jinhan  * @param[in] size    - The counter size in words.
64*b353a43cSLin Jinhan  *
65*b353a43cSLin Jinhan  */
66*b353a43cSLin Jinhan void util_reverse_words_buff(u32 *buff_ptr, u32 size_words);
67*b353a43cSLin Jinhan 
68*b353a43cSLin Jinhan /* ------------------------------------------------------------
69*b353a43cSLin Jinhan  **
70*b353a43cSLin Jinhan  * @brief This function executes a reversed byte copy on a specified buffer.
71*b353a43cSLin Jinhan  *
72*b353a43cSLin Jinhan  *        on a 6 byte byffer:
73*b353a43cSLin Jinhan  *
74*b353a43cSLin Jinhan  *        buff[5] <---> buff[0]
75*b353a43cSLin Jinhan  *        buff[4] <---> buff[1]
76*b353a43cSLin Jinhan  *        buff[3] <---> buff[2]
77*b353a43cSLin Jinhan  *
78*b353a43cSLin Jinhan  * @param[in] dst_ptr - The counter buffer.
79*b353a43cSLin Jinhan  * @param[in] src_ptr - The counter size in bytes.
80*b353a43cSLin Jinhan  *
81*b353a43cSLin Jinhan  */
82*b353a43cSLin Jinhan void util_reverse_buff(u8 *buff_ptr, u32 size);
83*b353a43cSLin Jinhan 
84*b353a43cSLin Jinhan /* ------------------------------------------------------------
85*b353a43cSLin Jinhan  **
86*b353a43cSLin Jinhan  * @brief This function executes a memory copy between 2 buffers.
87*b353a43cSLin Jinhan  *
88*b353a43cSLin Jinhan  * @param[in] dst_ptr - The first counter buffer.
89*b353a43cSLin Jinhan  * @param[in] src_ptr - The second counter buffer.
90*b353a43cSLin Jinhan  * @param[in] size    - The counter size in words.
91*b353a43cSLin Jinhan  *
92*b353a43cSLin Jinhan  */
93*b353a43cSLin Jinhan void util_word_memcpy(u32 *dst_ptr, u32 *src_ptr, u32 size);
94*b353a43cSLin Jinhan 
95*b353a43cSLin Jinhan /* ------------------------------------------------------------
96*b353a43cSLin Jinhan  **
97*b353a43cSLin Jinhan  * @brief This function executes a memory set operation on a buffer.
98*b353a43cSLin Jinhan  *
99*b353a43cSLin Jinhan  * @param[in] buff_ptr - the buffer.
100*b353a43cSLin Jinhan  * @param[in] val		- The value to set the buffer.
101*b353a43cSLin Jinhan  * @param[in] size		- the buffers size in words.
102*b353a43cSLin Jinhan  *
103*b353a43cSLin Jinhan  */
104*b353a43cSLin Jinhan void util_word_memset(u32 *buff_ptr, u32 val, u32 size);
105*b353a43cSLin Jinhan 
106*b353a43cSLin Jinhan /* ------------------------------------------------------------
107*b353a43cSLin Jinhan  **
108*b353a43cSLin Jinhan  * @brief This function executes a reverse bytes copying from one buffer
109*b353a43cSLin Jinhan  *	  to another buffer.
110*b353a43cSLin Jinhan  *
111*b353a43cSLin Jinhan  * @param[in] dst_ptr - The pointer to destination buffer.
112*b353a43cSLin Jinhan  * @param[in] src_ptr - The pointer to source buffer.
113*b353a43cSLin Jinhan  * @param[in] size    - The size in words.
114*b353a43cSLin Jinhan  *
115*b353a43cSLin Jinhan  */
116*b353a43cSLin Jinhan void util_reverse_word_memcpy(u32 *dst_ptr, u32 *src_ptr, u32 size);
117*b353a43cSLin Jinhan 
118*b353a43cSLin Jinhan /* ------------------------------------------------------------
119*b353a43cSLin Jinhan  **
120*b353a43cSLin Jinhan  * @brief This function executes a reverse bytes copying from one buffer
121*b353a43cSLin Jinhan  *	  to another buffer.
122*b353a43cSLin Jinhan  *
123*b353a43cSLin Jinhan  * @param[in] dst_ptr - The pointer to destination buffer.
124*b353a43cSLin Jinhan  * @param[in] src_ptr - The pointer to source buffer.
125*b353a43cSLin Jinhan  * @param[in] size    - The size in bytes.
126*b353a43cSLin Jinhan  *
127*b353a43cSLin Jinhan  */
128*b353a43cSLin Jinhan void util_reverse_memcpy(u8 *dst_ptr, const u8 *src_ptr, u32 size);
129*b353a43cSLin Jinhan 
130*b353a43cSLin Jinhan #ifdef __cplusplus
131*b353a43cSLin Jinhan }
132*b353a43cSLin Jinhan #endif
133*b353a43cSLin Jinhan 
134*b353a43cSLin Jinhan #endif
135*b353a43cSLin Jinhan 
136