xref: /OK3568_Linux_fs/u-boot/drivers/crypto/rockchip/crypto_v2_util.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #include <common.h>
7*4882a593Smuzhiyun #include <rockchip/crypto_v2_util.h>
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun /* ------------------------------------------------------------
10*4882a593Smuzhiyun  **
11*4882a593Smuzhiyun  * @brief This function executes a reversed words copy on a specified buffer.
12*4882a593Smuzhiyun  *
13*4882a593Smuzhiyun  *        on a 6 words buffer:
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  *        buff[5] <---> buff[0]
16*4882a593Smuzhiyun  *        buff[4] <---> buff[1]
17*4882a593Smuzhiyun  *        buff[3] <---> buff[2]
18*4882a593Smuzhiyun  *
19*4882a593Smuzhiyun  * @param[in] dst_ptr - The counter buffer.
20*4882a593Smuzhiyun  * @param[in] size    - The counter size in words.
21*4882a593Smuzhiyun  *
22*4882a593Smuzhiyun  */
util_reverse_words_buff(u32 * buff_ptr,u32 size_words)23*4882a593Smuzhiyun void util_reverse_words_buff(u32 *buff_ptr, u32 size_words)
24*4882a593Smuzhiyun {
25*4882a593Smuzhiyun 	u32 i;
26*4882a593Smuzhiyun 	u32 temp;
27*4882a593Smuzhiyun 	u32 *high_swap_ptr, *low_swap_ptr;
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun 	/* initialize the source and the destination poision */
30*4882a593Smuzhiyun 	high_swap_ptr = buff_ptr + size_words - 1;
31*4882a593Smuzhiyun 	low_swap_ptr  = buff_ptr;
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun 	/* execute the reverse memcpoy */
34*4882a593Smuzhiyun 	for (i = 0; i < (size_words / 2); i++) {
35*4882a593Smuzhiyun 		temp				= *high_swap_ptr;
36*4882a593Smuzhiyun 		*(high_swap_ptr--)	= *low_swap_ptr;
37*4882a593Smuzhiyun 		*(low_swap_ptr++)	= temp;
38*4882a593Smuzhiyun 	}
39*4882a593Smuzhiyun } /* END OF util_reverse_words_buff */
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun /* ------------------------------------------------------------
42*4882a593Smuzhiyun  **
43*4882a593Smuzhiyun  * @brief This function executes a reversed byte copy on a specified buffer.
44*4882a593Smuzhiyun  *
45*4882a593Smuzhiyun  *        on a 6 byte buffer:
46*4882a593Smuzhiyun  *
47*4882a593Smuzhiyun  *        buff[5] <---> buff[0]
48*4882a593Smuzhiyun  *        buff[4] <---> buff[1]
49*4882a593Smuzhiyun  *        buff[3] <---> buff[2]
50*4882a593Smuzhiyun  *
51*4882a593Smuzhiyun  * @param[in] dst_ptr - The counter buffer.
52*4882a593Smuzhiyun  * @param[in] src_ptr - The counter size in bytes.
53*4882a593Smuzhiyun  *
54*4882a593Smuzhiyun  */
util_reverse_buff(u8 * buff_ptr,u32 size)55*4882a593Smuzhiyun void util_reverse_buff(u8 *buff_ptr, u32 size)
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun 	u32 i;
58*4882a593Smuzhiyun 	u32 temp;
59*4882a593Smuzhiyun 	u8 *high_swap_ptr, *low_swap_ptr;
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun 	/* initialize the source and the destination poision */
62*4882a593Smuzhiyun 	high_swap_ptr = buff_ptr + size - 1;
63*4882a593Smuzhiyun 	low_swap_ptr  = buff_ptr;
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 	/* execute the reverse memcpoy */
66*4882a593Smuzhiyun 	for (i = 0; i < (size / 2); i++) {
67*4882a593Smuzhiyun 		temp			= *high_swap_ptr;
68*4882a593Smuzhiyun 		*(high_swap_ptr--)	= *low_swap_ptr;
69*4882a593Smuzhiyun 		*(low_swap_ptr++)	= temp;
70*4882a593Smuzhiyun 	}
71*4882a593Smuzhiyun } /* END OF util_reverse_buff */
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun /* ------------------------------------------------------------
74*4882a593Smuzhiyun  **
75*4882a593Smuzhiyun  * @brief This function executes a reverse bytes copying from one buffer to
76*4882a593Smuzhiyun  * another buffer.
77*4882a593Smuzhiyun  *
78*4882a593Smuzhiyun  * @param[in] dst_ptr - The pointer to destination buffer.
79*4882a593Smuzhiyun  * @param[in] src_ptr - The pointer to source buffer.
80*4882a593Smuzhiyun  * @param[in] size    - The size in bytes.
81*4882a593Smuzhiyun  *
82*4882a593Smuzhiyun  */
util_reverse_memcpy(u8 * dst_ptr,const u8 * src_ptr,u32 size)83*4882a593Smuzhiyun void util_reverse_memcpy(u8 *dst_ptr, const u8 *src_ptr, u32 size)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun 	u32 i;
86*4882a593Smuzhiyun 	u32 buff_dst_pos, buff_src_pos;
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun 	/* execute the reverse copy in case of different buffers */
89*4882a593Smuzhiyun 	/* initialize the source and the destination position */
90*4882a593Smuzhiyun 	buff_dst_pos = size - 1;
91*4882a593Smuzhiyun 	buff_src_pos = 0;
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 	for (i = 0; i < size; i++)
94*4882a593Smuzhiyun 		dst_ptr[buff_dst_pos--] = src_ptr[buff_src_pos++];
95*4882a593Smuzhiyun } /* END OF util_reverse_memcpy */
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun /* ------------------------------------------------------------
98*4882a593Smuzhiyun  **
99*4882a593Smuzhiyun  * @brief This function executes a memory copy between 2 buffers.
100*4882a593Smuzhiyun  *
101*4882a593Smuzhiyun  * @param[in] dst_ptr - The first counter buffer.
102*4882a593Smuzhiyun  * @param[in] src_ptr - The second counter buffer.
103*4882a593Smuzhiyun  * @param[in] size    - the first counter size in words.
104*4882a593Smuzhiyun  *
105*4882a593Smuzhiyun  */
util_word_memcpy(u32 * dst_ptr,u32 * src_ptr,u32 size)106*4882a593Smuzhiyun void util_word_memcpy(u32 *dst_ptr, u32 *src_ptr, u32 size)
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun 	u32 i;
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun 	/* execute the reverse memcpoy */
111*4882a593Smuzhiyun 	for (i = 0; i < size; i++)
112*4882a593Smuzhiyun 		dst_ptr[i] = src_ptr[i];
113*4882a593Smuzhiyun } /* END OF util_memcpy */
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun /* ------------------------------------------------------------
116*4882a593Smuzhiyun  **
117*4882a593Smuzhiyun  * @brief This function executes a reverse bytes copying from one buffer
118*4882a593Smuzhiyun  * to another buffer.
119*4882a593Smuzhiyun  *
120*4882a593Smuzhiyun  * @param[in] dst_ptr - The pointer to destination buffer.
121*4882a593Smuzhiyun  * @param[in] src_ptr - The pointer to source buffer.
122*4882a593Smuzhiyun  * @param[in] size    - The size in words.
123*4882a593Smuzhiyun  *
124*4882a593Smuzhiyun  */
util_reverse_word_memcpy(u32 * dst_ptr,u32 * src_ptr,u32 size)125*4882a593Smuzhiyun void util_reverse_word_memcpy(u32 *dst_ptr, u32 *src_ptr, u32 size)
126*4882a593Smuzhiyun {
127*4882a593Smuzhiyun 	u32 i;
128*4882a593Smuzhiyun 	u32 buff_dst_pos, buff_src_pos;
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun 	/* execute the reverse copy in case of different buffers */
131*4882a593Smuzhiyun 	/* initialize the source and the destination position */
132*4882a593Smuzhiyun 	buff_dst_pos = size - 1;
133*4882a593Smuzhiyun 	buff_src_pos = 0;
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun 	for (i = 0; i < size; i++)
136*4882a593Smuzhiyun 		dst_ptr[buff_dst_pos--] = src_ptr[buff_src_pos++];
137*4882a593Smuzhiyun } /* END OF util_reverse_memcpy */
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun /* ------------------------------------------------------------
140*4882a593Smuzhiyun  **
141*4882a593Smuzhiyun  * @brief This function executes a memory set operation on a buffer.
142*4882a593Smuzhiyun  *
143*4882a593Smuzhiyun  * @param[in] buff_ptr - the buffer.
144*4882a593Smuzhiyun  * @param[in] val      - The value to set the buffer.
145*4882a593Smuzhiyun  * @param[in] size     - the buffers size in words.
146*4882a593Smuzhiyun  *
147*4882a593Smuzhiyun  */
util_word_memset(u32 * buff_ptr,u32 val,u32 size)148*4882a593Smuzhiyun void util_word_memset(u32 *buff_ptr, u32 val, u32 size)
149*4882a593Smuzhiyun {
150*4882a593Smuzhiyun 	u32 i;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 	/* execute the reverse memcpoy */
153*4882a593Smuzhiyun 	for (i = 0; i < size; i++)
154*4882a593Smuzhiyun 		buff_ptr[i] = val;
155*4882a593Smuzhiyun } /* END OF util_memcpy */
156