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