1b353a43cSLin Jinhan // SPDX-License-Identifier: GPL-2.0 2b353a43cSLin Jinhan /* 3b353a43cSLin Jinhan * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd 4b353a43cSLin Jinhan */ 5b353a43cSLin Jinhan 6b353a43cSLin Jinhan #ifndef _ROCKCHIP_CRYPTO_V2_PKA_H_ 7b353a43cSLin Jinhan #define _ROCKCHIP_CRYPTO_V2_PKA_H_ 8b353a43cSLin Jinhan #include <common.h> 9*6c61f8c1SLin Jinhan #include <rockchip/crypto_mpa.h> 10b353a43cSLin Jinhan #include <rockchip/crypto_v2.h> 11b353a43cSLin Jinhan #include <rockchip/crypto_v2_util.h> 12b353a43cSLin Jinhan 13b353a43cSLin Jinhan #define CRYPTO_BASE crypto_base 14b353a43cSLin Jinhan 15b353a43cSLin Jinhan 16b353a43cSLin Jinhan #define RK_MAX_RSA_NBITS 4096 17b353a43cSLin Jinhan #define RK_MAX_RSA_NCHARS ((RK_MAX_RSA_NBITS) / 8) 18b353a43cSLin Jinhan #define RK_MAX_RSA_BWORDS ((RK_MAX_RSA_NBITS) / 32) 19b353a43cSLin Jinhan 20b353a43cSLin Jinhan /* define NpCreateFlag values */ 21b353a43cSLin Jinhan #define RK_PKA_CREATE_NP 1 22b353a43cSLin Jinhan #define RK_PKA_SET_NP 0 23b353a43cSLin Jinhan /* size of buffer for Barrett modulus tag NP, used in PKI algorithms */ 24b353a43cSLin Jinhan #define RK_PKA_BARRETT_IN_WORDS 5 25b353a43cSLin Jinhan /* Barrett modulus tag type - 5 words size array */ 26b353a43cSLin Jinhan typedef u32 RK_PKA_NP_t[RK_PKA_BARRETT_IN_WORDS]; 27b353a43cSLin Jinhan 28b353a43cSLin Jinhan #define RK_PKA_MemSetZero(buf, size) \ 29b353a43cSLin Jinhan util_word_memset((void *)buf, 0x00, size) 30b353a43cSLin Jinhan 31b353a43cSLin Jinhan #define RK_PKA_FastMemCpy(dst, src, size) \ 32b353a43cSLin Jinhan util_word_memcpy((void *)dst, (void *)src, size) 33b353a43cSLin Jinhan 34b353a43cSLin Jinhan #define RK_PKA_ReverseMemcpy(dst, src, size) \ 35b353a43cSLin Jinhan util_reverse_word_memcpy((void *)dst, (void *)src, size) 36b353a43cSLin Jinhan 37b353a43cSLin Jinhan #define RES_DISCARD 0x3F 38b353a43cSLin Jinhan 39b353a43cSLin Jinhan /* base address - 0x00F10B00 */ 40b353a43cSLin Jinhan #define RK_PKI_ERROR_BASE 0x00F10B00 41b353a43cSLin Jinhan #define RK_PKI_HW_VER_INCORRECT_ERROR (RK_PKI_ERROR_BASE + 0x0UL) 42b353a43cSLin Jinhan #define RK_PKI_HW_DECRYPED_ERROR (RK_PKI_ERROR_BASE + 0x1UL) 43b353a43cSLin Jinhan #define RK_PKI_KEY_SIZE_ERROR (RK_PKI_ERROR_BASE + 0x2UL) 44b353a43cSLin Jinhan 45b353a43cSLin Jinhan /* Error definitions for PKA using */ 46b353a43cSLin Jinhan #define RK_PKA_ILLEGAL_PTR_ERROR (RK_PKI_ERROR_BASE + 0x20UL) 47b353a43cSLin Jinhan #define RK_PKA_ENTRIES_COUNT_ERROR (RK_PKI_ERROR_BASE + 0x21UL) 48b353a43cSLin Jinhan #define RK_PKA_REGISTER_SIZES_ERROR (RK_PKI_ERROR_BASE + 0x22UL) 49b353a43cSLin Jinhan #define RK_PKA_SET_MAP_MODE_ERROR (RK_PKI_ERROR_BASE + 0x23UL) 50b353a43cSLin Jinhan 51b353a43cSLin Jinhan #define RK_PKA_DIVIDER_IS_NULL_ERROR (RK_PKI_ERROR_BASE + 0x2EUL) 52b353a43cSLin Jinhan #define RK_PKA_MODULUS_IS_NULL_ERROR (RK_PKI_ERROR_BASE + 0x2FUL) 53b353a43cSLin Jinhan #define RK_PKA_DATA_SIZE_ERROR (RK_PKI_ERROR_BASE + 0x30UL) 54b353a43cSLin Jinhan #define RK_PKA_OPERATION_SIZE_ERROR (RK_PKI_ERROR_BASE + 0x31UL) 55b353a43cSLin Jinhan 56b353a43cSLin Jinhan #define RK_PKA_MAX_REGS_COUNT 8 57b353a43cSLin Jinhan #define RK_PKA_MAX_PHYS_MEM_REGS_COUNT 32 58b353a43cSLin Jinhan #define RK_PKA_MAX_REGS_MEM_SIZE_BYTES 4096 59b353a43cSLin Jinhan 60b353a43cSLin Jinhan /* PKA control values */ 61b353a43cSLin Jinhan #define RK_PKA_PIPE_READY 1 62b353a43cSLin Jinhan #define RK_PKA_OP_DONE 1 63b353a43cSLin Jinhan #define RK_PKA_SW_REST 1 64b353a43cSLin Jinhan 65b353a43cSLin Jinhan /* PKA N_NP_T0_T1 register fields positions (low bit position) */ 66b353a43cSLin Jinhan #define RK_PKA_N_NP_T0_T1_REG_N_POS CRYPTO_N_VIRTUAL_ADDR_SHIFT 67b353a43cSLin Jinhan #define RK_PKA_N_NP_T0_T1_REG_NP_POS CRYPTO_NP_VIRTUAL_ADDR_SHIFT 68b353a43cSLin Jinhan #define RK_PKA_N_NP_T0_T1_REG_T0_POS CRYPTO_T0_VIRTUAL_ADDR_SHIFT 69b353a43cSLin Jinhan #define RK_PKA_N_NP_T0_T1_REG_T1_POS CRYPTO_T1_VIRTUAL_ADDR_SHIFT 70b353a43cSLin Jinhan 71b353a43cSLin Jinhan /* PKA N_NP_T0_T1 register default (reset) value: N=0, NP=1, T0=30, T1=31 */ 72b353a43cSLin Jinhan #define PKA_N 0UL 73b353a43cSLin Jinhan #define PKA_NP 1UL 74b353a43cSLin Jinhan #define PKA_T0 30UL 75b353a43cSLin Jinhan #define PKA_T1 31UL 76b353a43cSLin Jinhan #define RK_PKA_N_NP_T0_T1_REG_DEFAULT_VAL \ 77b353a43cSLin Jinhan (PKA_N << RK_PKA_N_NP_T0_T1_REG_N_POS | \ 78b353a43cSLin Jinhan PKA_NP << RK_PKA_N_NP_T0_T1_REG_NP_POS | \ 79b353a43cSLin Jinhan PKA_T0 << RK_PKA_N_NP_T0_T1_REG_T0_POS | \ 80b353a43cSLin Jinhan PKA_T1 << RK_PKA_N_NP_T0_T1_REG_T1_POS) 81b353a43cSLin Jinhan 82b353a43cSLin Jinhan /* PKA STATUS register fields positions (low bit position) */ 83b353a43cSLin Jinhan #define RK_PKA_STATUS_PIPE_IS_REDY_POS 0 84b353a43cSLin Jinhan #define RK_PKA_STATUS_PKA_BUSY_POS 1 85b353a43cSLin Jinhan #define RK_PKA_STATUS_ALU_OUT_ZERO_POS 2 86b353a43cSLin Jinhan #define RK_PKA_STATUS_ALU_MODOVRFLW_POS 3 87b353a43cSLin Jinhan #define RK_PKA_STATUS_DIV_BY_ZERO_POS 4 88b353a43cSLin Jinhan #define RK_PKA_STATUS_ALU_CARRY_POS 5 89b353a43cSLin Jinhan #define RK_PKA_STATUS_ALU_SIGN_OUT_POS 6 90b353a43cSLin Jinhan #define RK_PKA_STATUS_MODINV_OF_ZERO_POS 7 91b353a43cSLin Jinhan #define RK_PKA_STATUS_PKA_CPU_BUSY_POS 8 92b353a43cSLin Jinhan #define RK_PKA_STATUS_OPCODE_POS 9 93b353a43cSLin Jinhan #define RK_PKA_STATUS_TAG_POS 14 94b353a43cSLin Jinhan 95b353a43cSLin Jinhan #define RK_PKA_STATUS_OPCODE_MASK 0x1FUl 96b353a43cSLin Jinhan #define RK_PKA_STATUS_TAG_MASK 0x3FUl 97b353a43cSLin Jinhan 98b353a43cSLin Jinhan /* PKA OPCODE register fields positions (low bit position) */ 99b353a43cSLin Jinhan #define RK_PKA_OPCODE_TAG_POS 0 100b353a43cSLin Jinhan #define RK_PKA_OPCODE_RESULT_POS 6 101b353a43cSLin Jinhan #define RK_PKA_OPCODE_R_DISCARD_POS 11 102b353a43cSLin Jinhan #define RK_PKA_OPCODE_OPERAND_2_POS 12 103b353a43cSLin Jinhan #define RK_PKA_OPCODE_OPERAND_2_IMMED_POS 17 104b353a43cSLin Jinhan #define RK_PKA_OPCODE_OPERAND_1_POS 18 105b353a43cSLin Jinhan #define RK_PKA_OPCODE_OPERAND_1_IMMED_POS 23 106b353a43cSLin Jinhan #define RK_PKA_OPCODE_LEN_POS 24 107b353a43cSLin Jinhan #define RK_PKA_OPCODE_OPERATION_ID_POS 27 108b353a43cSLin Jinhan 109b353a43cSLin Jinhan /* PKA data registers base address 110b353a43cSLin Jinhan *should be always zero since it's the offset 111b353a43cSLin Jinhan * from the start of the PKA memory and not from the HOST memory 112b353a43cSLin Jinhan */ 113b353a43cSLin Jinhan #define RK_PKA_DATA_REGS_BASE_ADDR (CRYPTO_BASE + CRYPTO_SRAM_BASE) 114b353a43cSLin Jinhan #define RK_PKA_DATA_REGS_MEMORY_OFFSET_ADDR (CRYPTO_BASE + CRYPTO_SRAM_BASE) 115b353a43cSLin Jinhan 116b353a43cSLin Jinhan /* Machine Opcodes definitions (according to HW CRS ) */ 117b353a43cSLin Jinhan #define RK_PKA_MIN_OPCODE 0x00 118b353a43cSLin Jinhan 119b353a43cSLin Jinhan #define PKA_Add 0x04 120b353a43cSLin Jinhan #define PKA_AddIm 0x04 121b353a43cSLin Jinhan #define PKA_Sub 0x05 122b353a43cSLin Jinhan #define PKA_SubIm 0x05 123b353a43cSLin Jinhan #define PKA_Neg 0x05 124b353a43cSLin Jinhan #define PKA_ModAdd 0x06 125b353a43cSLin Jinhan #define PKA_ModAddIm 0x06 126b353a43cSLin Jinhan #define PKA_ModSub 0x07 127b353a43cSLin Jinhan #define PKA_ModSubIm 0x07 128b353a43cSLin Jinhan #define PKA_ModNeg 0x07 129b353a43cSLin Jinhan #define PKA_AND 0x08 130b353a43cSLin Jinhan #define PKA_Test0 0x08 131b353a43cSLin Jinhan #define PKA_Clr0 0x08 132b353a43cSLin Jinhan #define PKA_Clr 0x08 133b353a43cSLin Jinhan #define PKA_OR 0x09 134b353a43cSLin Jinhan #define PKA_Copy 0x09 135b353a43cSLin Jinhan #define PKA_SetBit0 0x09 136b353a43cSLin Jinhan #define PKA_XOR 0x0A 137b353a43cSLin Jinhan #define PKA_Flip0 0x0A 138b353a43cSLin Jinhan #define PKA_InvertBits 0x0A 139b353a43cSLin Jinhan #define PKA_Compare 0x0A 140b353a43cSLin Jinhan #define PKA_SHR0 0x0C 141b353a43cSLin Jinhan #define PKA_SHR1 0x0D 142b353a43cSLin Jinhan #define PKA_SHL0 0x0E 143b353a43cSLin Jinhan #define PKA_SHL1 0x0F 144b353a43cSLin Jinhan #define PKA_LMul 0x10 145b353a43cSLin Jinhan #define PKA_ModMul 0x11 146b353a43cSLin Jinhan #define PKA_ModMulNR 0x12 147b353a43cSLin Jinhan #define PKA_ModExp 0x13 148b353a43cSLin Jinhan #define PKA_Div 0x14 149b353a43cSLin Jinhan #define PKA_ModInv 0x15 150b353a43cSLin Jinhan #define PKA_ModDiv 0x16 151b353a43cSLin Jinhan #define PKA_HMul 0x17 152b353a43cSLin Jinhan #define PKA_Terminate 0x00 153b353a43cSLin Jinhan 154b353a43cSLin Jinhan #define RK_PKA_MAX_OPCODE 0x17 155b353a43cSLin Jinhan 156b353a43cSLin Jinhan /*************************************************************/ 157b353a43cSLin Jinhan /* Macros for waiting PKA machine ready states */ 158b353a43cSLin Jinhan /*************************************************************/ 159b353a43cSLin Jinhan 160b353a43cSLin Jinhan void rk_pka_ram_ctrl_enable(void); 161b353a43cSLin Jinhan 162b353a43cSLin Jinhan void rk_pka_ram_ctrl_disable(void); 163b353a43cSLin Jinhan 164b353a43cSLin Jinhan void rk_pka_wait_on_ram_ready(void); 165b353a43cSLin Jinhan 166b353a43cSLin Jinhan void rk_pka_wait_on_pipe_ready(void); 167b353a43cSLin Jinhan 168b353a43cSLin Jinhan void rk_pka_wait_on_done(void); 169b353a43cSLin Jinhan 170b353a43cSLin Jinhan /***************************************************** 171b353a43cSLin Jinhan * Macros for controlling PKA machine and changing * 172b353a43cSLin Jinhan * PKA sizes table and mapping table settings. * 173b353a43cSLin Jinhan *****************************************************/ 174b353a43cSLin Jinhan #define PKA_CLK_ENABLE() 175b353a43cSLin Jinhan 176b353a43cSLin Jinhan #define PKA_CLK_DISABLE() 177b353a43cSLin Jinhan 178b353a43cSLin Jinhan void rk_pka_set_startmemaddr_reg(u32 start_mem_addr); 179b353a43cSLin Jinhan 180b353a43cSLin Jinhan void rk_pka_set_N_NP_T0_T1_reg(u32 N, u32 NP, u32 T0, u32 T1); 181b353a43cSLin Jinhan 182b353a43cSLin Jinhan void rk_pka_set_default_N_NP_T0_T1_reg(void); 183b353a43cSLin Jinhan 184b353a43cSLin Jinhan void rk_pka_get_status(u32 *status); 185b353a43cSLin Jinhan 186b353a43cSLin Jinhan void rk_pka_get_status_alu_outzero(u32 *status); 187b353a43cSLin Jinhan 188b353a43cSLin Jinhan void rk_pka_get_status_mod_overfl(u32 *status); 189b353a43cSLin Jinhan 190b353a43cSLin Jinhan void rk_pka_get_status_div_byzero(u32 *status); 191b353a43cSLin Jinhan 192b353a43cSLin Jinhan void rk_pka_get_status_carry(u32 *status); 193b353a43cSLin Jinhan 194b353a43cSLin Jinhan void rk_pka_get_status_alu_signout(u32 *status); 195b353a43cSLin Jinhan 196b353a43cSLin Jinhan void rk_pka_get_status_modinv_ofzero(u32 *status); 197b353a43cSLin Jinhan 198b353a43cSLin Jinhan void rk_pka_get_status_opcode(u32 *status); 199b353a43cSLin Jinhan 200b353a43cSLin Jinhan void rk_pka_get_status_tag(u32 *status); 201b353a43cSLin Jinhan 202b353a43cSLin Jinhan /****************************************************************** 203b353a43cSLin Jinhan * Macros for setting and reading sizes from PKA regsSizesTable * 204b353a43cSLin Jinhan ******************************************************************/ 205b353a43cSLin Jinhan void rk_pka_set_regsize(u32 size_bits, u32 entry_num); 206b353a43cSLin Jinhan 207b353a43cSLin Jinhan void rk_pka_read_regsize(u32 *size_bits, u32 entry_num); 208b353a43cSLin Jinhan 209b353a43cSLin Jinhan /****************************************************************** 210b353a43cSLin Jinhan * Macros for setting and reading addresses of PKA data registers * 211b353a43cSLin Jinhan ******************************************************************/ 212b353a43cSLin Jinhan void rk_pka_set_regaddr(u32 vir_reg, u32 phys_addr); 213b353a43cSLin Jinhan 214b353a43cSLin Jinhan void rk_pka_get_regaddr(u32 vir_reg, u32 *phys_addr); 215b353a43cSLin Jinhan 216b353a43cSLin Jinhan void rk_pka_read_regaddr(u32 vir_reg, u32 *phys_addr); 217b353a43cSLin Jinhan 218b353a43cSLin Jinhan /********************************************** 219b353a43cSLin Jinhan * Macros for setting Full PKI opcode * 220b353a43cSLin Jinhan **********************************************/ 221b353a43cSLin Jinhan u32 rk_pka_make_full_opcode(u32 opcode, u32 len_id, 222b353a43cSLin Jinhan u32 is_a_immed, u32 op_a, 223b353a43cSLin Jinhan u32 is_b_immed, u32 op_b, 224b353a43cSLin Jinhan u32 res_discard, u32 res, 225b353a43cSLin Jinhan u32 tag); 226b353a43cSLin Jinhan 227b353a43cSLin Jinhan /****************************************************** 228b353a43cSLin Jinhan * Macros for reading and loading PKA memory data * 229b353a43cSLin Jinhan ******************************************************/ 230b353a43cSLin Jinhan void rk_pka_hw_load_value2pka_mem(u32 addr, u32 val); 231b353a43cSLin Jinhan 232b353a43cSLin Jinhan void rk_pka_hw_load_block2pka_mem(u32 addr, u32 *ptr, 233b353a43cSLin Jinhan u32 size_words); 234b353a43cSLin Jinhan 235b353a43cSLin Jinhan void rk_pka_hw_reverse_load_block2pka_mem(u32 addr, u32 *ptr, 236b353a43cSLin Jinhan u32 size_words); 237b353a43cSLin Jinhan 238b353a43cSLin Jinhan void rk_pka_hw_clear_pka_mem(u32 addr, u32 size_words); 239b353a43cSLin Jinhan 240b353a43cSLin Jinhan void rk_pka_hw_read_value_from_pka_mem(u32 addr, u32 *val); 241b353a43cSLin Jinhan 242b353a43cSLin Jinhan void rk_pka_hw_read_block_from_pka_mem(u32 addr, u32 *ptr, 243b353a43cSLin Jinhan u32 size_words); 244b353a43cSLin Jinhan 245b353a43cSLin Jinhan void rk_pka_hw_reverse_read_block_from_pka_mem(u32 addr, u32 *ptr, 246b353a43cSLin Jinhan u32 size_words); 247b353a43cSLin Jinhan 248b353a43cSLin Jinhan u32 rk_pka_exec_operation(u32 opcode, u8 len_id, 249b353a43cSLin Jinhan u8 is_a_immed, s8 op_a, 250b353a43cSLin Jinhan u8 is_b_immed, s8 op_b, 251b353a43cSLin Jinhan u8 res_discard, s8 res, u8 tag); 252b353a43cSLin Jinhan 253b353a43cSLin Jinhan /************************************************************************* 254b353a43cSLin Jinhan * Macros for calling PKA operations (names according to operation issue * 255b353a43cSLin Jinhan *************************************************************************/ 256b353a43cSLin Jinhan 257b353a43cSLin Jinhan /*--------------------------------------*/ 258b353a43cSLin Jinhan /* 1. ADD - SUBTRACT operations */ 259b353a43cSLin Jinhan /*--------------------------------------*/ 260b353a43cSLin Jinhan /* Add: res = op_a + op_b */ 261b353a43cSLin Jinhan #define RK_PKA_Add(len_id, op_a, op_b, res, tag) \ 262b353a43cSLin Jinhan rk_pka_exec_operation(PKA_Add, (len_id), 0, (op_a),\ 263b353a43cSLin Jinhan 0, (op_b), 0, (res), (tag)) 264b353a43cSLin Jinhan 265b353a43cSLin Jinhan /* AddIm: res = op_a + op_b_im */ 266b353a43cSLin Jinhan #define RK_PKA_AddIm(len_id, op_a, op_b_im, res, tag) \ 267b353a43cSLin Jinhan rk_pka_exec_operation(PKA_Add, (len_id), 0, (op_a), \ 268b353a43cSLin Jinhan 1, (op_b_im), 0, (res), (tag)) 269b353a43cSLin Jinhan 270b353a43cSLin Jinhan /* Sub: res = op_a - op_b */ 271b353a43cSLin Jinhan #define RK_PKA_Sub(len_id, op_a, op_b, res, tag) \ 272b353a43cSLin Jinhan rk_pka_exec_operation(PKA_Sub, (len_id), 0, (op_a), \ 273b353a43cSLin Jinhan 0, (op_b), 0, (res), (tag)) 274b353a43cSLin Jinhan 275b353a43cSLin Jinhan /* SubIm: res = op_a - op_b_im */ 276b353a43cSLin Jinhan #define RK_PKA_SubIm(len_id, op_a, op_b_im, res, tag) \ 277b353a43cSLin Jinhan rk_pka_exec_operation(PKA_Sub, (len_id), 0, (op_a), \ 278b353a43cSLin Jinhan 1, (op_b_im), 0, (res), (tag)) 279b353a43cSLin Jinhan 280b353a43cSLin Jinhan /* Neg: res = 0 - op_b */ 281b353a43cSLin Jinhan #define RK_PKA_Neg(len_id, op_b, res, tag) \ 282b353a43cSLin Jinhan rk_pka_exec_operation(PKA_Sub, (len_id), 1, 0, \ 283b353a43cSLin Jinhan 0, (op_b), 0, (res), (tag)) 284b353a43cSLin Jinhan 285b353a43cSLin Jinhan /* ModAdd: res = (op_a + op_b) mod N */ 286b353a43cSLin Jinhan #define RK_PKA_ModAdd(len_id, op_a, op_b, res, tag) \ 287b353a43cSLin Jinhan rk_pka_exec_operation(PKA_ModAdd, (len_id), 0, (op_a), \ 288b353a43cSLin Jinhan 0, (op_b), 0, (res), (tag)) 289b353a43cSLin Jinhan 290b353a43cSLin Jinhan /* ModAddIm: res = (op_a + op_b_im) mod N */ 291b353a43cSLin Jinhan #define RK_PKA_ModAddIm(len_id, op_a, op_b_im, res, tag) \ 292b353a43cSLin Jinhan rk_pka_exec_operation(PKA_ModAdd, (len_id), 0, (op_a), \ 293b353a43cSLin Jinhan 1, (op_b_im), 0, (res), (tag)) 294b353a43cSLin Jinhan 295b353a43cSLin Jinhan /* ModSub: res = (op_a - op_b) mod N */ 296b353a43cSLin Jinhan #define RK_PKA_ModSub(len_id, op_a, op_b, res, tag) \ 297b353a43cSLin Jinhan rk_pka_exec_operation(PKA_ModSub, (len_id), 0, (op_a), \ 298b353a43cSLin Jinhan 0, (op_b), 0, (res), (tag)) 299b353a43cSLin Jinhan 300b353a43cSLin Jinhan /* ModSubIm: res = (op_a - op_b_im) mod N */ 301b353a43cSLin Jinhan #define RK_PKA_ModSubIm(len_id, op_a, op_b_im, res, tag) \ 302b353a43cSLin Jinhan rk_pka_exec_operation(PKA_ModSub, (len_id), 0, (op_a), \ 303b353a43cSLin Jinhan 1, (op_b_im), 0, (res), (tag)) 304b353a43cSLin Jinhan 305b353a43cSLin Jinhan /* ModNeg: res = (0 - op_b) mod N */ 306b353a43cSLin Jinhan #define RK_PKA_ModNeg(len_id, op_b, res, tag) \ 307b353a43cSLin Jinhan rk_pka_exec_operation(PKA_ModSub, (len_id), 1, 0, \ 308b353a43cSLin Jinhan 0, (op_b), 0, (res), (tag)) 309b353a43cSLin Jinhan 310b353a43cSLin Jinhan /*--------------------------------------*/ 311b353a43cSLin Jinhan /* 2. Logical operations */ 312b353a43cSLin Jinhan /*--------------------------------------*/ 313b353a43cSLin Jinhan 314b353a43cSLin Jinhan /* AND: res = op_a & op_b */ 315b353a43cSLin Jinhan #define RK_PKA_AND(len_id, op_a, op_b, res, tag) \ 316b353a43cSLin Jinhan rk_pka_exec_operation(PKA_AND, (len_id), 0, (op_a), \ 317b353a43cSLin Jinhan 0, (op_b), 0, (res), (tag)) 318b353a43cSLin Jinhan 319b353a43cSLin Jinhan /* AndIm: res = op_a & op_b */ 320b353a43cSLin Jinhan #define RK_PKA_AndIm(len_id, op_a, op_b, res, tag) \ 321b353a43cSLin Jinhan rk_pka_exec_operation(PKA_AND, (len_id), 0, (op_a), \ 322b353a43cSLin Jinhan 1, (op_b), 0, (res), (tag)) 323b353a43cSLin Jinhan 324b353a43cSLin Jinhan /* Tst0: op_a & 0x1 - tests the bit 0 of operand A. */ 325b353a43cSLin Jinhan /* If bit0 = 0, then ZeroOfStatus = 1, else 0 */ 326b353a43cSLin Jinhan #define RK_PKA_Tst0(len_id, op_a, tag) \ 327b353a43cSLin Jinhan rk_pka_exec_operation(PKA_AND, (len_id), 0, (op_a), \ 328b353a43cSLin Jinhan 1, 0x01, 1, RES_DISCARD, (tag)) 329b353a43cSLin Jinhan 330b353a43cSLin Jinhan /* Clr0: res = op_a & (-2) - clears the bit 0 of operand A. */ 331b353a43cSLin Jinhan /* Note: -2 = 0x1E for 5-bit size */ 332b353a43cSLin Jinhan #define RK_PKA_Clr0(len_id, op_a, res, tag) \ 333b353a43cSLin Jinhan rk_pka_exec_operation(PKA_AND, (len_id), 0, (op_a), \ 334b353a43cSLin Jinhan 1, 0x1E, 0, (res), (tag)) 335b353a43cSLin Jinhan 336b353a43cSLin Jinhan /* Clr: res = op_a & 0 - clears the operand A. */ 337b353a43cSLin Jinhan #define RK_PKA_Clr(len_id, op_a, tag) \ 338b353a43cSLin Jinhan rk_pka_exec_operation(PKA_AND, (len_id), 0, (op_a), \ 339b353a43cSLin Jinhan 1, 0x00, 0, (op_a), (tag)) 340b353a43cSLin Jinhan 341b353a43cSLin Jinhan /* Clear: for full clearing the actual register op_a, 342b353a43cSLin Jinhan * this macro calls Clr operation twice. 343b353a43cSLin Jinhan */ 344b353a43cSLin Jinhan #define RK_PKA_Clear(len_id, op_a, tag) \ 345b353a43cSLin Jinhan RK_PKA_Clr(len_id, op_a, tag) 346b353a43cSLin Jinhan 347b353a43cSLin Jinhan /* OR: res = op_a || op_b */ 348b353a43cSLin Jinhan #define RK_PKA_OR(len_id, op_a, op_b, res, tag) \ 349b353a43cSLin Jinhan rk_pka_exec_operation(PKA_OR, (len_id), 0, (op_a), \ 350b353a43cSLin Jinhan 0, (op_b), 0, (res), (tag)) 351b353a43cSLin Jinhan 352b353a43cSLin Jinhan /* OrIm: res = op_a || op_b */ 353b353a43cSLin Jinhan #define RK_PKA_OrIm(len_id, op_a, op_b, res, tag) \ 354b353a43cSLin Jinhan rk_pka_exec_operation(PKA_OR, (len_id), 0, (op_a), \ 355b353a43cSLin Jinhan 1, (op_b), 0, (res), (tag)) 356b353a43cSLin Jinhan 357b353a43cSLin Jinhan /* Copy: OpDest = OpSrc || 0 */ 358b353a43cSLin Jinhan #define RK_PKA_Copy(len_id, op_dest, op_src, tag) \ 359b353a43cSLin Jinhan rk_pka_exec_operation(PKA_OR, (len_id), 0, (op_src), \ 360b353a43cSLin Jinhan 1, 0x00, 0, (op_dest), (tag)) 361b353a43cSLin Jinhan 362b353a43cSLin Jinhan /* Set0: res = op_a || 1 : set bit0 = 1, other bits are not changed */ 363b353a43cSLin Jinhan #define RK_PKA_Set0(len_id, op_a, res, tag) \ 364b353a43cSLin Jinhan rk_pka_exec_operation(PKA_OR, (len_id), 0, (op_a), \ 365b353a43cSLin Jinhan 1, 0x01, 0, (res), (tag)) 366b353a43cSLin Jinhan 367b353a43cSLin Jinhan /* Xor: res = op_a ^ op_b */ 368b353a43cSLin Jinhan #define RK_PKA_Xor(len_id, op_a, op_b, res, tag) \ 369b353a43cSLin Jinhan rk_pka_exec_operation(PKA_XOR, (len_id), 0, (op_a), \ 370b353a43cSLin Jinhan 0, (op_b), 0, (res), (tag)) 371b353a43cSLin Jinhan 372b353a43cSLin Jinhan /* XorIm: res = op_a ^ op_b */ 373b353a43cSLin Jinhan #define RK_PKA_XorIm(len_id, op_a, op_b, res, tag) \ 374b353a43cSLin Jinhan rk_pka_exec_operation(PKA_XOR, (len_id), 0, (op_a), \ 375b353a43cSLin Jinhan 1, (op_b), 0, (res), (tag)) 376b353a43cSLin Jinhan 377b353a43cSLin Jinhan /* Flip0: res = op_a || 1 - inverts the bit 0 of operand A */ 378b353a43cSLin Jinhan #define RK_PKA_Flip0(len_id, op_a, res, tag) \ 379b353a43cSLin Jinhan rk_pka_exec_operation(PKA_XOR, (len_id), 0, (op_a), \ 380b353a43cSLin Jinhan 1, 0x01, 0, (res), (tag)) 381b353a43cSLin Jinhan 382b353a43cSLin Jinhan /* Invert: res = op_a ^ 0xFFF.FF : inverts all bits of op_a . */ 383b353a43cSLin Jinhan /* Note: 0xFFFFF = 0x1F for 5 bits size of second operand */ 384b353a43cSLin Jinhan #define RK_PKA_Invert(len_id, op_a, res, tag) \ 385b353a43cSLin Jinhan rk_pka_exec_operation(PKA_XOR, (len_id), 0, (op_a), \ 386b353a43cSLin Jinhan 1, 0x1F, 0, (res), (tag)) 387b353a43cSLin Jinhan 388b353a43cSLin Jinhan /* Compare: op_a ^ op_b . Rsult of compare in ZeroBitOfStatus: */ 389b353a43cSLin Jinhan /* If op_a == op_b then Z = 1 */ 390b353a43cSLin Jinhan #define RK_PKA_Compare(len_id, op_a, op_b, tag) \ 391b353a43cSLin Jinhan rk_pka_exec_operation(PKA_XOR, (len_id), 0, (op_a), \ 392b353a43cSLin Jinhan 0, (op_b), 1, (0), (tag)) 393b353a43cSLin Jinhan 394b353a43cSLin Jinhan /* CompareImmediate: op_a ^ op_b . Rsult of compare in ZeroBitOfStatus: */ 395b353a43cSLin Jinhan /* If op_a == op_b then status Z = 1 */ 396b353a43cSLin Jinhan #define RK_PKA_CompareIm(len_id, op_a, op_b, tag) \ 397b353a43cSLin Jinhan rk_pka_exec_operation(PKA_XOR, (len_id), 0, (op_a), \ 398b353a43cSLin Jinhan 1, (op_b), 1, (0), (tag)) 399b353a43cSLin Jinhan 400b353a43cSLin Jinhan /*----------------------------------------------*/ 401b353a43cSLin Jinhan /* 3. SHIFT operations */ 402b353a43cSLin Jinhan /*----------------------------------------------*/ 403b353a43cSLin Jinhan 404b353a43cSLin Jinhan /* SHR0: res = op_a >> (S+1) : 405b353a43cSLin Jinhan * shifts right operand A by S+1 bits, insert 0 to left most bits 406b353a43cSLin Jinhan */ 407b353a43cSLin Jinhan #define RK_PKA_SHR0(len_id, op_a, S, res, tag) \ 408b353a43cSLin Jinhan rk_pka_exec_operation(PKA_SHR0, (len_id), 0, (op_a), \ 409b353a43cSLin Jinhan 0, (S), 0, (res), (tag)) 410b353a43cSLin Jinhan 411b353a43cSLin Jinhan /* SHR1: res = op_a >> (S+1) : 412b353a43cSLin Jinhan * shifts right operand A by S+1 bits, insert 1 to left most bits 413b353a43cSLin Jinhan */ 414b353a43cSLin Jinhan #define RK_PKA_SHR1(len_id, op_a, S, res, tag) \ 415b353a43cSLin Jinhan rk_pka_exec_operation(PKA_SHR1, (len_id), 0, (op_a), \ 416b353a43cSLin Jinhan 0, (S), 0, (res), (tag)) 417b353a43cSLin Jinhan 418b353a43cSLin Jinhan /* SHL0: res = op_a << (S+1) : 419b353a43cSLin Jinhan * shifts left operand A by S+1 bits, insert 0 to right most bits 420b353a43cSLin Jinhan */ 421b353a43cSLin Jinhan #define RK_PKA_SHL0(len_id, op_a, S, res, tag) \ 422b353a43cSLin Jinhan rk_pka_exec_operation(PKA_SHL0, (len_id), 0, (op_a), \ 423b353a43cSLin Jinhan 0, (S), 0, (res), (tag)) 424b353a43cSLin Jinhan 425b353a43cSLin Jinhan /* SHL1: res = op_a << (S+1) : 426b353a43cSLin Jinhan * shifts left operand A by S+1 bits, insert 1 to right most bits 427b353a43cSLin Jinhan */ 428b353a43cSLin Jinhan #define RK_PKA_SHL1(len_id, op_a, S, res, tag) \ 429b353a43cSLin Jinhan rk_pka_exec_operation(PKA_SHL1, (len_id), 0, (op_a), \ 430b353a43cSLin Jinhan 0, (S), 0, (res), (tag)) 431b353a43cSLin Jinhan 432b353a43cSLin Jinhan /*--------------------------------------------------------------*/ 433b353a43cSLin Jinhan /* 2. Multiplication and other operations */ 434b353a43cSLin Jinhan /* Note: See notes to RK_PKAExecOperation */ 435b353a43cSLin Jinhan /*--------------------------------------------------------------*/ 436b353a43cSLin Jinhan 437b353a43cSLin Jinhan /* RMul: res = LowHalfOf(op_a * op_b), where size of operands and result 438b353a43cSLin Jinhan * is equaled to operation size, defined by len_id. Note: for receiving 439b353a43cSLin Jinhan * full result, the len_id must be set according to (sizeA + sizeB) and 440b353a43cSLin Jinhan * leading not significant bits of operands must be zeroed 441b353a43cSLin Jinhan */ 442b353a43cSLin Jinhan #define RK_PKA_LMul(len_id, op_a, op_b, res, tag) \ 443b353a43cSLin Jinhan rk_pka_exec_operation(PKA_LMul, (len_id), 0, (op_a), \ 444b353a43cSLin Jinhan 0, (op_b), 0, (res), (tag)) 445b353a43cSLin Jinhan 446b353a43cSLin Jinhan /* HMul: res = HighHalfOf(op_a * op_b) + one high word of low half of 447b353a43cSLin Jinhan * (op_a * op_b), where size of operands is equaled to operation size, 448b353a43cSLin Jinhan * defined by len_id. Note: Size of operation result is by one word large, 449b353a43cSLin Jinhan * than operation size 450b353a43cSLin Jinhan */ 451b353a43cSLin Jinhan #define RK_PKA_HMul(len_id, op_a, op_b, res, tag) \ 452b353a43cSLin Jinhan rk_pka_exec_operation(PKA_HMul, (len_id), 0, (op_a), \ 453b353a43cSLin Jinhan 0, (op_b), 0, (res), (tag)) 454b353a43cSLin Jinhan 455b353a43cSLin Jinhan /* ModMul: res = op_a * op_b mod N - modular multiplication */ 456b353a43cSLin Jinhan #define RK_PKA_ModMul(len_id, op_a, op_b, res, tag) \ 457b353a43cSLin Jinhan rk_pka_exec_operation(PKA_ModMul, (len_id), 0, (op_a), \ 458b353a43cSLin Jinhan 0, (op_b), 0, (res), (tag)) 459b353a43cSLin Jinhan 460b353a43cSLin Jinhan /* ModMulN: res = op_a * op_b mod N 461b353a43cSLin Jinhan * - modular multiplication (final reduction is omitted) 462b353a43cSLin Jinhan */ 463b353a43cSLin Jinhan #define RK_PKA_ModMulN(len_id, op_a, op_b, res, tag) \ 464b353a43cSLin Jinhan rk_pka_exec_operation(PKA_ModMulNR, (len_id), 0, \ 465b353a43cSLin Jinhan (op_a), 0, (op_b), 0, \ 466b353a43cSLin Jinhan (res), (tag)) 467b353a43cSLin Jinhan 468b353a43cSLin Jinhan /* ModExp: res = op_a ** op_b mod N - modular exponentiation */ 469b353a43cSLin Jinhan #define RK_PKA_ModExp(len_id, op_a, op_b, res, tag) \ 470b353a43cSLin Jinhan rk_pka_exec_operation(PKA_ModExp, (len_id), 0, (op_a), \ 471b353a43cSLin Jinhan 0, (op_b), 0, (res), (tag)) 472b353a43cSLin Jinhan 473b353a43cSLin Jinhan /* Divide: res = op_a / op_b , op_a = op_a mod op_b - division, */ 474b353a43cSLin Jinhan #define RK_PKA_Div(len_id, op_a, op_b, res, tag) \ 475b353a43cSLin Jinhan rk_pka_exec_operation(PKA_Div, (len_id), 0, (op_a), \ 476b353a43cSLin Jinhan 0, (op_b), 0, (res), (tag)) 477b353a43cSLin Jinhan 478b353a43cSLin Jinhan /* ModInv: Modular inversion: calculates res = 1/op_b mod N */ 479b353a43cSLin Jinhan #define RK_PKA_ModInv(len_id, op_b, res, tag) \ 480b353a43cSLin Jinhan rk_pka_exec_operation(PKA_ModInv, (len_id), 0, 1, \ 481b353a43cSLin Jinhan 0, (op_b), 0, (res), (tag)) 482b353a43cSLin Jinhan #define RK_PKA_ModDiv(len_id, op_a, op_b, res, tag) \ 483b353a43cSLin Jinhan rk_pka_exec_operation(PKA_ModDiv, (len_id), 0, (op_a), \ 484b353a43cSLin Jinhan 0, (op_b), 0, (res), (tag)) 485b353a43cSLin Jinhan 486b353a43cSLin Jinhan /* Terminate - special operation, which allows HOST access */ 487b353a43cSLin Jinhan /* to PKA data memory registers after end of PKA operations */ 488b353a43cSLin Jinhan #define RK_PKA_Terminate(tag) \ 489b353a43cSLin Jinhan rk_pka_exec_operation(PKA_Terminate, 0, 0, 0, 0, \ 490b353a43cSLin Jinhan 0, 0, 0, (tag)) 491b353a43cSLin Jinhan 492b353a43cSLin Jinhan struct rk_pka_regs_map { 493b353a43cSLin Jinhan u32 reges_num[RK_PKA_MAX_PHYS_MEM_REGS_COUNT]; 494b353a43cSLin Jinhan u32 regs_addr[RK_PKA_MAX_PHYS_MEM_REGS_COUNT]; 495b353a43cSLin Jinhan }; 496b353a43cSLin Jinhan 497b353a43cSLin Jinhan u32 rk_pka_set_sizes_tab(u32 regs_sizes_ptr[RK_PKA_MAX_REGS_COUNT], 498b353a43cSLin Jinhan u32 count_of_sizes, 499b353a43cSLin Jinhan u32 max_size_bits, 500b353a43cSLin Jinhan u32 is_default_map); 501b353a43cSLin Jinhan 502b353a43cSLin Jinhan #define RK_PKA_DefaultSetRegsSizesTab(max_size_bits) \ 503b353a43cSLin Jinhan rk_pka_set_sizes_tab(0, 0, (max_size_bits), 1) 504b353a43cSLin Jinhan u32 rk_pka_set_map_tab(struct rk_pka_regs_map *regs_map_ptr, u32 *count_of_regs, 505b353a43cSLin Jinhan u32 maxsize_words, u32 N_NP_T0_T1, 506b353a43cSLin Jinhan u32 is_default_map); 507b353a43cSLin Jinhan 508b353a43cSLin Jinhan #define RK_PKA_DefaultSetRegsMapTab(maxsize_words, count_of_regs) \ 509b353a43cSLin Jinhan rk_pka_set_map_tab(NULL, (count_of_regs), \ 510b353a43cSLin Jinhan (maxsize_words), 0, 1) 511b353a43cSLin Jinhan 512b353a43cSLin Jinhan u32 rk_pka_clear_block_of_regs(u8 first_reg, u8 count_of_regs, u8 len_id); 513b353a43cSLin Jinhan 514b353a43cSLin Jinhan u32 rk_pka_init(u32 regs_sizes_ptr[RK_PKA_MAX_REGS_COUNT], 515b353a43cSLin Jinhan u32 count_of_sizes, 516b353a43cSLin Jinhan struct rk_pka_regs_map *regs_map_ptr, 517b353a43cSLin Jinhan u32 count_of_regs, 518b353a43cSLin Jinhan u32 op_size_bits, 519b353a43cSLin Jinhan u32 regsize_words, 520b353a43cSLin Jinhan u32 N_NP_T0_T1, 521b353a43cSLin Jinhan u32 is_default_map); 522b353a43cSLin Jinhan #define RK_PKA_DefaultInitPKA(max_size_bits, regsize_words) \ 523b353a43cSLin Jinhan rk_pka_init(0, 0, 0, 0, (max_size_bits), \ 524b353a43cSLin Jinhan (regsize_words), 0, 1) 525b353a43cSLin Jinhan 526b353a43cSLin Jinhan void rk_pka_finish(void); 527b353a43cSLin Jinhan u32 rk_pka_calcNp_and_initmodop(u32 len_id, u32 mod_size_bits, 528b353a43cSLin Jinhan s8 r_t0, s8 r_t1, s8 r_t2); 529b353a43cSLin Jinhan 530b353a43cSLin Jinhan u32 rk_pka_div_long_num(u8 len_id, s8 op_a, u32 s, s8 op_b, 531b353a43cSLin Jinhan s8 res, s8 r_t1, s8 r_t2); 532b353a43cSLin Jinhan 533b353a43cSLin Jinhan u32 rk_calcNp_and_initmodop(u32 *N_ptr, u32 N_size_bits, 534b353a43cSLin Jinhan u32 *NP_ptr, u8 np_create_flag, 535b353a43cSLin Jinhan s8 r_t0, s8 r_t1, s8 r_t2); 536b353a43cSLin Jinhan 537b353a43cSLin Jinhan void rk_pka_copy_data_into_reg(s8 dst_reg, u8 len_id, u32 *src_ptr, 538b353a43cSLin Jinhan u32 size_words); 539b353a43cSLin Jinhan void rk_pka_copy_data_from_reg(u32 *dst_ptr, u32 size_words, 540b353a43cSLin Jinhan s8 src_reg); 541b353a43cSLin Jinhan int test_rk3326_rsa(void); 542b353a43cSLin Jinhan int rk_abs_add(void *a, void *b, void *c); 543b353a43cSLin Jinhan int rk_mod(void *a, void *b, void *c); 544b353a43cSLin Jinhan int rk_exptmod(void *a, void *b, void *c, void *d); 545b353a43cSLin Jinhan int rk_exptmod_np(void *m, void *e, void *n, void *np, void *d); 546b353a43cSLin Jinhan 547b353a43cSLin Jinhan #endif 548