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