1 /* 2 * Copyright (c) 2001-2019, Arm Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 8 #ifndef RSA_HWDEFS_H 9 #define RSA_HWDEFS_H 10 11 /* 12 * All the includes that are needed for code using this module to 13 * compile correctly should be #included here. 14 */ 15 #include "secureboot_general_hwdefs.h" 16 #include "cc_pka_hw_plat_defs.h" 17 18 #ifdef __cplusplus 19 extern "C" 20 { 21 #endif 22 23 24 /************************ Defines ******************************/ 25 26 /* PKA big word size in bits */ 27 #define RSA_PKA_BIG_WORD_SIZE_IN_BITS CC_PKA_WORD_SIZE_IN_BITS 28 #define RSA_PKA_BIG_WORD_SIZE_IN_BYTES (RSA_PKA_BIG_WORD_SIZE_IN_BITS/8) 29 #define RSA_PKA_BIG_WORD_SIZE_IN_32_BIT_WORDS (RSA_PKA_BIG_WORD_SIZE_IN_BITS/32) 30 31 #define RSA_PKA_EXTRA_BITS PKA_EXTRA_BITS 32 33 /* PKA max count of SRAM registers: */ 34 #define RSA_HW_PKI_PKA_MAX_COUNT_OF_PHYS_MEM_REGS PKA_MAX_COUNT_OF_PHYS_MEM_REGS 35 36 /* The maximal size of allowed PKA physical registers memory including tables */ 37 #define RSA_PKA_MAX_REGS_MEM_SIZE_BYTES (6 * 1024) 38 39 /* SRAM definitions */ 40 #define RSA_HW_PKI_PKA_DATA_REGS_MEMORY_OFFSET_ADDR g_SramPkaAddr 41 42 /* The maximal count of allowed sizes of PKA operands or register-variables */ 43 #define RSA_PKA_MAX_COUNT_OF_REGS_SIZES 8 /*PKA_MAX_COUNT_OF_REGS_SIZES */ 44 #define RSA_PKA_MAX_COUNT_OF_ADDITIONAL_REGS 10 45 #define RSA_PKA_SRAM_REGS_MEM_OFFSET_WORDS RSA_HW_PKI_PKA_DATA_REGS_MEMORY_OFFSET_ADDR 46 47 48 /* PKA OPCODE register fields positions (low bit position) */ 49 #define RSA_HW_PKI_PKA_OPCODE_TAG_POS 0 50 #define RSA_HW_PKI_PKA_OPCODE_RESULT_POS 6 51 #define RSA_HW_PKI_PKA_OPCODE_R_DISCARD_POS 11 52 #define RSA_HW_PKI_PKA_OPCODE_OPERAND_2_POS 12 53 #define RSA_HW_PKI_PKA_OPCODE_OPERAND_2_IMMED_POS 17 54 #define RSA_HW_PKI_PKA_OPCODE_OPERAND_1_POS 18 55 #define RSA_HW_PKI_PKA_OPCODE_OPERAND_1_IMMED_POS 23 56 #define RSA_HW_PKI_PKA_OPCODE_LEN_POS 24 57 #define RSA_HW_PKI_PKA_OPCODE_OPERATION_ID_POS 27 58 59 60 /* PKA N_NP_T0_T1 register fields positions (low bit position) */ 61 #define RSA_HW_PKI_PKA_N_NP_T0_T1_REG_N_POS DX_N_NP_T0_T1_ADDR_N_VIRTUAL_ADDR_BIT_SHIFT 62 #define RSA_HW_PKI_PKA_N_NP_T0_T1_REG_NP_POS DX_N_NP_T0_T1_ADDR_NP_VIRTUAL_ADDR_BIT_SHIFT 63 #define RSA_HW_PKI_PKA_N_NP_T0_T1_REG_T0_POS DX_N_NP_T0_T1_ADDR_T0_VIRTUAL_ADDR_BIT_SHIFT 64 #define RSA_HW_PKI_PKA_N_NP_T0_T1_REG_T1_POS DX_N_NP_T0_T1_ADDR_T1_VIRTUAL_ADDR_BIT_SHIFT 65 66 /* PKA N_NP_T0_T1 register default (reset) value: N=0, NP=1, T0=30, T1=31 */ 67 #define PKA_N 0UL 68 #define PKA_NP 1UL 69 #define PKA_T0 30UL 70 #define PKA_T1 31UL 71 #define RSA_HW_PKI_PKA_N_NP_T0_T1_REG_DEFAULT_VAL ( PKA_N << RSA_HW_PKI_PKA_N_NP_T0_T1_REG_N_POS | \ 72 PKA_NP << RSA_HW_PKI_PKA_N_NP_T0_T1_REG_NP_POS | \ 73 PKA_T0 << RSA_HW_PKI_PKA_N_NP_T0_T1_REG_T0_POS | \ 74 PKA_T1 << RSA_HW_PKI_PKA_N_NP_T0_T1_REG_T1_POS ) 75 76 /* PKA control values */ 77 #define RSA_PKA_PIPE_READY 1 78 #define RSA_PKA_OP_DONE 1 79 #define RSA_PKA_SW_REST 1 80 81 /* Machine Opcodes definitions (according to HW CRS ) */ 82 #define PkaSepDone 0x00 83 #define PkaAdd 0x04 84 #define PkaAddIm 0x04 85 #define PkaSub 0x05 86 #define PkaSubIm 0x05 87 #define PkaNeg 0x05 88 #define PkaModAdd 0x06 89 #define PkaModAddIm 0x06 90 #define PkaModSub 0x07 91 #define PkaModSubIm 0x07 92 #define PkaModNeg 0x07 93 #define PkaAND 0x08 94 #define PkaTest0 0x08 95 #define PkaClr0 0x08 96 #define PkaClr 0x08 97 #define PkaOR 0x09 98 #define PkaCopy 0x09 99 #define PkaSetBit0 0x09 100 #define PkaXOR 0x0A 101 #define PkaFlip0 0x0A 102 #define PkaInvertBits 0x0A 103 #define PkaCompare 0x0A 104 #define PkaSHR0 0x0C 105 #define PkaSHR1 0x0D 106 #define PkaSHL0 0x0E 107 #define PkaSHL1 0x0F 108 #define PkaLMul 0x10 109 #define PkaModMul 0x11 110 #define PkaModMulNR 0x12 111 #define PkaModExp 0x13 112 #define PkaDiv 0x14 113 #define PkaModInv 0x15 114 #define PkaHMul 0x17 115 #define PkaModMulAcc 0x18 116 #define PkaModMulAccN 0x19 117 #define PkaSepInt 0x1A 118 #define PkaReduce 0x1B 119 120 #define PKA_MAX_OPCODE 0x1B 121 122 123 /* ********************** MACROS ******************************* */ 124 125 126 /* Full register (operation) size including extra bits + one PKA-word (64 or * 127 * 128 bits), rounded up to PKA words. */ 128 #define GET_FULL_OP_SIZE_PKA_WORDS(opSizeInBits) (((opSizeInBits)/RSA_PKA_BIG_WORD_SIZE_IN_BITS + (((opSizeInBits) & (RSA_PKA_BIG_WORD_SIZE_IN_BITS-1)) > 0)) + 1) 129 130 /*************************************************************/ 131 /* Macros for waiting PKA machine ready states */ 132 /*************************************************************/ 133 134 /* defining a macro for waiting to the PKA_PIPE_READY */ 135 #define RSA_PKA_WAIT_ON_PKA_PIPE_READY(VirtualHwBaseAddr) \ 136 do \ 137 { \ 138 volatile uint32_t output_reg_val; \ 139 do \ 140 { \ 141 SB_HAL_READ_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_PIPE_RDY), output_reg_val ); \ 142 }while( (output_reg_val & 0x01) != RSA_PKA_PIPE_READY ); \ 143 }while(0) 144 145 /* defining a macro for waiting to the PKA_OP_DONE */ 146 #define RSA_PKA_WAIT_ON_PKA_DONE(VirtualHwBaseAddr) \ 147 do \ 148 { \ 149 volatile uint32_t output_reg_val; \ 150 do \ 151 { \ 152 SB_HAL_READ_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_DONE), output_reg_val); \ 153 }while( (output_reg_val & 0x01) != RSA_PKA_OP_DONE ); \ 154 }while(0) 155 156 /******************************************************************/ 157 /* Macros for setting and reading sizes from PKA regsSizesTable */ 158 /******************************************************************/ 159 160 161 /* ReadRegSizeInTable: Readss the size from regsSizesTable entry */ 162 #define RSA_PKA_ReadRegSize(SizeBits, EntryNum, VirtualHwBaseAddr) \ 163 RSA_PKA_WAIT_ON_PKA_DONE( VirtualHwBaseAddr ); \ 164 SB_HAL_READ_REGISTER( (SB_REG_ADDR(VirtualHwBaseAddr,PKA_L0) + 4*(EntryNum)), \ 165 (SizeBits) ) 166 167 /******************************************************************/ 168 /* Macros for setting and reading addresses of PKA data registers */ 169 /******************************************************************/ 170 171 /*The following macros are used for setting and reading the data registers addresses in mapping table.*/ 172 173 /* GetRegAddress: Returns the physical address of register VirtReg from mapping table */ 174 #define RSA_PKA_GetRegAddress(VirtReg, VirtualHwBaseAddr) \ 175 ( *((volatile uint32_t*)(SB_REG_ADDR(VirtualHwBaseAddr,MEMORY_MAP0) + 4*(VirtReg))) ) 176 177 /******************************************************************/ 178 /* Macros for setting Full PKI opcode */ 179 /******************************************************************/ 180 181 #define RSA_PKA_FullOpCode( Opcode,LenID,IsAImmed,OpA,IsBImmed,OpB,ResDiscard,Res,Tag ) \ 182 ( ((Opcode)) << RSA_HW_PKI_PKA_OPCODE_OPERATION_ID_POS | \ 183 ((LenID)) << RSA_HW_PKI_PKA_OPCODE_LEN_POS | \ 184 ((IsAImmed)) << RSA_HW_PKI_PKA_OPCODE_OPERAND_1_IMMED_POS | \ 185 ((OpA)) << RSA_HW_PKI_PKA_OPCODE_OPERAND_1_POS | \ 186 ((IsBImmed)) << RSA_HW_PKI_PKA_OPCODE_OPERAND_2_IMMED_POS | \ 187 ((OpB)) << RSA_HW_PKI_PKA_OPCODE_OPERAND_2_POS | \ 188 ((ResDiscard)) << RSA_HW_PKI_PKA_OPCODE_R_DISCARD_POS | \ 189 ((Res)) << RSA_HW_PKI_PKA_OPCODE_RESULT_POS | \ 190 ((Tag)) << RSA_HW_PKI_PKA_OPCODE_TAG_POS ) 191 192 /******************************************************************/ 193 /* Macros for reading and loading PKA memory data */ 194 /******************************************************************/ 195 196 /* MACRO DEFINITIONS FOR WORKING WITH INDIRECT ACCESS TO SRAM PKA DATA REGISTERS */ 197 198 /*These registers not included in the HW_CC definitions because they are HOST registers */ 199 #ifdef CC_SB_INDIRECT_SRAM_ACCESS 200 /* MACRO DEFINITIONS FOR WORKING WITH INDIRECT ACCESS TO SRAM PKA DATA REGISTERS */ 201 202 #define RSA_PKA_SRAM_WRITE_CLR(VirtualHwBaseAddr, SizeWords) \ 203 for(; ii < 4*(((SizeWords)+3)/4) ; ii++) { \ 204 SB_HAL_WRITE_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_SRAM_WDATA), 0); \ 205 } 206 207 #ifndef BIG__ENDIAN 208 /* macro to load a value to SRAM with 32-bit access */ 209 #define RSA_HW_PKI_HW_LOAD_VALUE_TO_PKA_MEM(VirtualHwBaseAddr, Addr, Val) \ 210 do \ 211 { \ 212 SB_HAL_WRITE_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_SRAM_ADDR), ((Addr)+ RSA_HW_PKI_PKA_DATA_REGS_MEMORY_OFFSET_ADDR)); \ 213 SB_HAL_WRITE_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_SRAM_WDATA), (Val)); \ 214 }while(0) 215 #else 216 #define RSA_HW_PKI_HW_LOAD_VALUE_TO_PKA_MEM(VirtualHwBaseAddr, Addr, Val) \ 217 do \ 218 { \ 219 uint32_t tempVal; \ 220 UTIL_ReverseMemCopy((uint8_t*)&tempVal , (uint8_t*)&Val , sizeof(uint32_t) ); \ 221 SB_HAL_WRITE_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_SRAM_ADDR), ((Addr)+ RSA_HW_PKI_PKA_DATA_REGS_MEMORY_OFFSET_ADDR)); \ 222 SB_HAL_WRITE_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_SRAM_WDATA), (tempVal)); \ 223 }while(0) 224 #endif 225 226 #ifndef BIG__ENDIAN 227 /* macro to load block to SRAM memory */ 228 #define RSA_HW_PKI_HW_LOAD_BLOCK_TO_PKA_MEM(VirtualHwBaseAddr, Addr, ptr, SizeWords) \ 229 do \ 230 { \ 231 uint32_t ii; \ 232 SB_HAL_WRITE_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_SRAM_ADDR), ((Addr)+RSA_HW_PKI_PKA_DATA_REGS_MEMORY_OFFSET_ADDR)); \ 233 for(ii = 0; ii < (SizeWords); ii++) \ 234 { \ 235 SB_HAL_WRITE_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_SRAM_WDATA), ((uint32_t*)(ptr))[ii]); \ 236 } \ 237 RSA_PKA_SRAM_WRITE_CLR(VirtualHwBaseAddr, SizeWords) \ 238 }while(0) 239 /* defining a macro to load a block to the PKA data memory */ 240 241 #else 242 #define RSA_HW_PKI_HW_LOAD_BLOCK_TO_PKA_MEM(VirtualHwBaseAddr, Addr, ptr, SizeWords) \ 243 do \ 244 { \ 245 uint32_t ii; \ 246 uint32_t tempWord; \ 247 SB_HAL_WRITE_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_SRAM_ADDR), ((Addr)+RSA_HW_PKI_PKA_DATA_REGS_MEMORY_OFFSET_ADDR)); \ 248 for(ii = 0; ii < (SizeWords); ii++) \ 249 { \ 250 UTIL_ReverseMemCopy((uint8_t*)&tempWord , (uint8_t*)&(ptr)[ii] , sizeof(uint32_t) ); \ 251 SB_HAL_WRITE_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_SRAM_WDATA), tempWord); \ 252 } \ 253 RSA_PKA_SRAM_WRITE_CLR(VirtualHwBaseAddr, SizeWords) \ 254 }while(0) 255 #endif 256 257 /* macro to clear PKA memory: Addr must be alighned to PKA_WORD size */ 258 #define RSA_HW_PKI_HW_CLEAR_PKA_MEM(VirtualHwBaseAddr, Addr, SizeWords) \ 259 do \ 260 { \ 261 uint32_t ii; \ 262 SB_HAL_WRITE_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_SRAM_ADDR), (Addr)); \ 263 for( ii = 0; ii < (uint32_t)(SizeWords); ii++ ) \ 264 { \ 265 SB_HAL_WRITE_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_SRAM_WDATA), 0x0UL ); \ 266 }\ 267 RSA_PKA_SRAM_WRITE_CLR(VirtualHwBaseAddr, (SizeWords)); \ 268 }while(0) 269 270 #ifndef BIG__ENDIAN 271 /* macro to read a value from the PKA data memory */ 272 #define RSA_HW_PKI_HW_READ_VALUE_FROM_PKA_MEM(VirtualHwBaseAddr, Addr, Val) \ 273 do \ 274 { \ 275 volatile uint32_t dummy; \ 276 SB_HAL_WRITE_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_SRAM_RADDR), ((Addr)+ RSA_HW_PKI_PKA_DATA_REGS_MEMORY_OFFSET_ADDR)); \ 277 SB_HAL_READ_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_SRAM_RDATA), (dummy)); \ 278 (Val) = dummy; \ 279 }while(0) 280 #else 281 #define RSA_HW_PKI_HW_READ_VALUE_FROM_PKA_MEM(VirtualHwBaseAddr, Addr, Val) \ 282 do \ 283 { \ 284 volatile uint32_t dummy; \ 285 SB_HAL_WRITE_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_SRAM_RADDR), ((Addr)+ RSA_HW_PKI_PKA_DATA_REGS_MEMORY_OFFSET_ADDR)); \ 286 SB_HAL_READ_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_SRAM_RDATA), (dummy)); \ 287 (Val) = dummy; \ 288 UTIL_ReverseBuff((uint8_t*)&Val , sizeof(uint32_t) ); \ 289 }while(0) 290 #endif 291 292 #ifndef BIG__ENDIAN 293 /* defining a macro to read a block from the PKA data memory */ 294 #define RSA_HW_PKI_HW_READ_BLOCK_FROM_PKA_MEM(VirtualHwBaseAddr, Addr, ptr, SizeWords) \ 295 do \ 296 { \ 297 uint32_t ii; \ 298 volatile uint32_t dummy; \ 299 SB_HAL_WRITE_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_SRAM_RADDR), (Addr)); \ 300 for(ii = 0; ii < (SizeWords); ii++) \ 301 { \ 302 SB_HAL_READ_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_SRAM_RDATA), (dummy));\ 303 ((uint32_t*)(ptr))[ii] = (dummy); \ 304 } \ 305 }while(0) 306 #else 307 #define RSA_HW_PKI_HW_READ_BLOCK_FROM_PKA_MEM(VirtualHwBaseAddr, Addr, ptr, SizeWords) \ 308 do \ 309 { \ 310 uint32_t ii; \ 311 volatile uint32_t dummy; \ 312 SB_HAL_WRITE_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_SRAM_RADDR), (Addr)); \ 313 for(ii = 0; ii < (SizeWords); ii++) \ 314 { \ 315 SB_HAL_READ_REGISTER( SB_REG_ADDR(VirtualHwBaseAddr, PKA_SRAM_RDATA), (dummy));\ 316 ((uint32_t*)(ptr))[ii] = (dummy); \ 317 UTIL_ReverseBuff((uint8_t*)&(ptr)[ii] , sizeof(uint32_t) ); \ 318 } \ 319 }while(0) 320 #endif 321 322 #else //CC_SB_INDIRECT_SRAM_ACCESS=0 => direct access 323 /* MACRO DEFINITIONS FOR WORKING WITH INDIRECT ACCESS TO SRAM PKA DATA REGISTERS */ 324 325 /*These registers not included in the HW_CC definitions because they are HOST registers */ 326 327 /* defining a macro to load a value to the PKA data memory */ 328 #define RSA_HW_PKI_HW_LOAD_VALUE_TO_PKA_MEM( VirtualHwBaseAddr , Addr , Val ) \ 329 do \ 330 { \ 331 *(uint32_t*)(((Addr) + RSA_HW_PKI_PKA_DATA_REGS_MEMORY_OFFSET_ADDR)) = (uint32_t)Val; \ 332 }while(0) 333 334 335 /* defining a macro to load a block to the PKA data memory */ 336 #define RSA_HW_PKI_HW_LOAD_BLOCK_TO_PKA_MEM( VirtualHwBaseAddr , Addr , ptr , SizeWords ) \ 337 do \ 338 { \ 339 UTIL_MemCopy((uint8_t*)((Addr) + RSA_HW_PKI_PKA_DATA_REGS_MEMORY_OFFSET_ADDR),(uint8_t*)(ptr),(SizeWords)*sizeof(uint32_t)); \ 340 }while(0) 341 342 343 /* defining a macro to clear PKA data memory */ 344 #define RSA_HW_PKI_HW_CLEAR_PKA_MEM( VirtualHwBaseAddr , Addr , SizeWords ) \ 345 do \ 346 { \ 347 UTIL_MemSet((uint8_t*)((Addr) + RSA_HW_PKI_PKA_DATA_REGS_MEMORY_OFFSET_ADDR),0x0,(SizeWords)*sizeof(uint32_t)); \ 348 }while(0) 349 350 351 /* defining a macro to read a value from the PKA data memory */ 352 #define RSA_HW_PKI_HW_READ_VALUE_FROM_PKA_MEM( VirtualHwBaseAddr , Addr , Val ) \ 353 do \ 354 { \ 355 Val = *(uint32_t*)((Addr) + RSA_HW_PKI_PKA_DATA_REGS_MEMORY_OFFSET_ADDR); \ 356 }while(0) 357 358 359 /* defining a macro to read a block from the PKA data memory */ 360 #define RSA_HW_PKI_HW_READ_BLOCK_FROM_PKA_MEM( VirtualHwBaseAddr , Addr , ptr , SizeWords ) \ 361 do \ 362 { \ 363 UTIL_MemCopy((uint8_t*)(ptr),(uint8_t*)((Addr) + RSA_HW_PKI_PKA_DATA_REGS_MEMORY_OFFSET_ADDR),(SizeWords)*sizeof(uint32_t)); \ 364 }while(0) 365 366 #endif //CC_SB_INDIRECT_SRAM_ACCESS 367 368 369 /************************ Defines ******************************/ 370 371 /* ********************** Macros ******************************* */ 372 373 /************************ Enums ********************************/ 374 375 #ifdef __cplusplus 376 } 377 #endif 378 379 #endif 380 381 382