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