cc_hw_queue_defs.h (17795B)
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* Copyright (C) 2012-2019 ARM Limited (or its affiliates). */ 3 4#ifndef __CC_HW_QUEUE_DEFS_H__ 5#define __CC_HW_QUEUE_DEFS_H__ 6 7#include <linux/types.h> 8 9#include "cc_kernel_regs.h" 10#include <linux/bitfield.h> 11 12/****************************************************************************** 13 * DEFINITIONS 14 ******************************************************************************/ 15 16#define HW_DESC_SIZE_WORDS 6 17/* Define max. available slots in HW queue */ 18#define HW_QUEUE_SLOTS_MAX 15 19 20#define CC_REG_LOW(name) (name ## _BIT_SHIFT) 21#define CC_REG_HIGH(name) (CC_REG_LOW(name) + name ## _BIT_SIZE - 1) 22#define CC_GENMASK(name) GENMASK(CC_REG_HIGH(name), CC_REG_LOW(name)) 23 24#define CC_HWQ_GENMASK(word, field) \ 25 CC_GENMASK(CC_DSCRPTR_QUEUE_WORD ## word ## _ ## field) 26 27#define WORD0_VALUE CC_HWQ_GENMASK(0, VALUE) 28#define WORD0_CPP_CIPHER_MODE CC_HWQ_GENMASK(0, CPP_CIPHER_MODE) 29#define WORD1_DIN_CONST_VALUE CC_HWQ_GENMASK(1, DIN_CONST_VALUE) 30#define WORD1_DIN_DMA_MODE CC_HWQ_GENMASK(1, DIN_DMA_MODE) 31#define WORD1_DIN_SIZE CC_HWQ_GENMASK(1, DIN_SIZE) 32#define WORD1_NOT_LAST CC_HWQ_GENMASK(1, NOT_LAST) 33#define WORD1_NS_BIT CC_HWQ_GENMASK(1, NS_BIT) 34#define WORD1_LOCK_QUEUE CC_HWQ_GENMASK(1, LOCK_QUEUE) 35#define WORD2_VALUE CC_HWQ_GENMASK(2, VALUE) 36#define WORD3_DOUT_DMA_MODE CC_HWQ_GENMASK(3, DOUT_DMA_MODE) 37#define WORD3_DOUT_LAST_IND CC_HWQ_GENMASK(3, DOUT_LAST_IND) 38#define WORD3_DOUT_SIZE CC_HWQ_GENMASK(3, DOUT_SIZE) 39#define WORD3_HASH_XOR_BIT CC_HWQ_GENMASK(3, HASH_XOR_BIT) 40#define WORD3_NS_BIT CC_HWQ_GENMASK(3, NS_BIT) 41#define WORD3_QUEUE_LAST_IND CC_HWQ_GENMASK(3, QUEUE_LAST_IND) 42#define WORD4_ACK_NEEDED CC_HWQ_GENMASK(4, ACK_NEEDED) 43#define WORD4_AES_SEL_N_HASH CC_HWQ_GENMASK(4, AES_SEL_N_HASH) 44#define WORD4_AES_XOR_CRYPTO_KEY CC_HWQ_GENMASK(4, AES_XOR_CRYPTO_KEY) 45#define WORD4_BYTES_SWAP CC_HWQ_GENMASK(4, BYTES_SWAP) 46#define WORD4_CIPHER_CONF0 CC_HWQ_GENMASK(4, CIPHER_CONF0) 47#define WORD4_CIPHER_CONF1 CC_HWQ_GENMASK(4, CIPHER_CONF1) 48#define WORD4_CIPHER_CONF2 CC_HWQ_GENMASK(4, CIPHER_CONF2) 49#define WORD4_CIPHER_DO CC_HWQ_GENMASK(4, CIPHER_DO) 50#define WORD4_CIPHER_MODE CC_HWQ_GENMASK(4, CIPHER_MODE) 51#define WORD4_CMAC_SIZE0 CC_HWQ_GENMASK(4, CMAC_SIZE0) 52#define WORD4_DATA_FLOW_MODE CC_HWQ_GENMASK(4, DATA_FLOW_MODE) 53#define WORD4_KEY_SIZE CC_HWQ_GENMASK(4, KEY_SIZE) 54#define WORD4_SETUP_OPERATION CC_HWQ_GENMASK(4, SETUP_OPERATION) 55#define WORD5_DIN_ADDR_HIGH CC_HWQ_GENMASK(5, DIN_ADDR_HIGH) 56#define WORD5_DOUT_ADDR_HIGH CC_HWQ_GENMASK(5, DOUT_ADDR_HIGH) 57 58/****************************************************************************** 59 * TYPE DEFINITIONS 60 ******************************************************************************/ 61 62struct cc_hw_desc { 63 union { 64 u32 word[HW_DESC_SIZE_WORDS]; 65 u16 hword[HW_DESC_SIZE_WORDS * 2]; 66 }; 67}; 68 69enum cc_axi_sec { 70 AXI_SECURE = 0, 71 AXI_NOT_SECURE = 1 72}; 73 74enum cc_desc_direction { 75 DESC_DIRECTION_ILLEGAL = -1, 76 DESC_DIRECTION_ENCRYPT_ENCRYPT = 0, 77 DESC_DIRECTION_DECRYPT_DECRYPT = 1, 78 DESC_DIRECTION_DECRYPT_ENCRYPT = 3, 79 DESC_DIRECTION_END = S32_MAX, 80}; 81 82enum cc_dma_mode { 83 DMA_MODE_NULL = -1, 84 NO_DMA = 0, 85 DMA_SRAM = 1, 86 DMA_DLLI = 2, 87 DMA_MLLI = 3, 88 DMA_MODE_END = S32_MAX, 89}; 90 91enum cc_flow_mode { 92 FLOW_MODE_NULL = -1, 93 /* data flows */ 94 BYPASS = 0, 95 DIN_AES_DOUT = 1, 96 AES_to_HASH = 2, 97 AES_and_HASH = 3, 98 DIN_DES_DOUT = 4, 99 DES_to_HASH = 5, 100 DES_and_HASH = 6, 101 DIN_HASH = 7, 102 DIN_HASH_and_BYPASS = 8, 103 AESMAC_and_BYPASS = 9, 104 AES_to_HASH_and_DOUT = 10, 105 DIN_RC4_DOUT = 11, 106 DES_to_HASH_and_DOUT = 12, 107 AES_to_AES_to_HASH_and_DOUT = 13, 108 AES_to_AES_to_HASH = 14, 109 AES_to_HASH_and_AES = 15, 110 DIN_SM4_DOUT = 16, 111 DIN_AES_AESMAC = 17, 112 HASH_to_DOUT = 18, 113 /* setup flows */ 114 S_DIN_to_AES = 32, 115 S_DIN_to_AES2 = 33, 116 S_DIN_to_DES = 34, 117 S_DIN_to_RC4 = 35, 118 S_DIN_to_SM4 = 36, 119 S_DIN_to_HASH = 37, 120 S_AES_to_DOUT = 38, 121 S_AES2_to_DOUT = 39, 122 S_SM4_to_DOUT = 40, 123 S_RC4_to_DOUT = 41, 124 S_DES_to_DOUT = 42, 125 S_HASH_to_DOUT = 43, 126 SET_FLOW_ID = 44, 127 FLOW_MODE_END = S32_MAX, 128}; 129 130enum cc_setup_op { 131 SETUP_LOAD_NOP = 0, 132 SETUP_LOAD_STATE0 = 1, 133 SETUP_LOAD_STATE1 = 2, 134 SETUP_LOAD_STATE2 = 3, 135 SETUP_LOAD_KEY0 = 4, 136 SETUP_LOAD_XEX_KEY = 5, 137 SETUP_WRITE_STATE0 = 8, 138 SETUP_WRITE_STATE1 = 9, 139 SETUP_WRITE_STATE2 = 10, 140 SETUP_WRITE_STATE3 = 11, 141 SETUP_OP_END = S32_MAX, 142}; 143 144enum cc_hash_conf_pad { 145 HASH_PADDING_DISABLED = 0, 146 HASH_PADDING_ENABLED = 1, 147 HASH_DIGEST_RESULT_LITTLE_ENDIAN = 2, 148 HASH_CONFIG1_PADDING_RESERVE32 = S32_MAX, 149}; 150 151enum cc_aes_mac_selector { 152 AES_SK = 1, 153 AES_CMAC_INIT = 2, 154 AES_CMAC_SIZE0 = 3, 155 AES_MAC_END = S32_MAX, 156}; 157 158#define HW_KEY_MASK_CIPHER_DO 0x3 159#define HW_KEY_SHIFT_CIPHER_CFG2 2 160 161/* HwCryptoKey[1:0] is mapped to cipher_do[1:0] */ 162/* HwCryptoKey[2:3] is mapped to cipher_config2[1:0] */ 163enum cc_hw_crypto_key { 164 USER_KEY = 0, /* 0x0000 */ 165 ROOT_KEY = 1, /* 0x0001 */ 166 PROVISIONING_KEY = 2, /* 0x0010 */ /* ==KCP */ 167 SESSION_KEY = 3, /* 0x0011 */ 168 RESERVED_KEY = 4, /* NA */ 169 PLATFORM_KEY = 5, /* 0x0101 */ 170 CUSTOMER_KEY = 6, /* 0x0110 */ 171 KFDE0_KEY = 7, /* 0x0111 */ 172 KFDE1_KEY = 9, /* 0x1001 */ 173 KFDE2_KEY = 10, /* 0x1010 */ 174 KFDE3_KEY = 11, /* 0x1011 */ 175 END_OF_KEYS = S32_MAX, 176}; 177 178#define CC_NUM_HW_KEY_SLOTS 4 179#define CC_FIRST_HW_KEY_SLOT 0 180#define CC_LAST_HW_KEY_SLOT (CC_FIRST_HW_KEY_SLOT + CC_NUM_HW_KEY_SLOTS - 1) 181 182#define CC_NUM_CPP_KEY_SLOTS 8 183#define CC_FIRST_CPP_KEY_SLOT 16 184#define CC_LAST_CPP_KEY_SLOT (CC_FIRST_CPP_KEY_SLOT + \ 185 CC_NUM_CPP_KEY_SLOTS - 1) 186 187enum cc_hw_aes_key_size { 188 AES_128_KEY = 0, 189 AES_192_KEY = 1, 190 AES_256_KEY = 2, 191 END_OF_AES_KEYS = S32_MAX, 192}; 193 194enum cc_hash_cipher_pad { 195 DO_NOT_PAD = 0, 196 DO_PAD = 1, 197 HASH_CIPHER_DO_PADDING_RESERVE32 = S32_MAX, 198}; 199 200#define CC_CPP_DIN_ADDR 0xFF00FF00UL 201#define CC_CPP_DIN_SIZE 0xFF00FFUL 202 203/*****************************/ 204/* Descriptor packing macros */ 205/*****************************/ 206 207/** 208 * hw_desc_init() - Init a HW descriptor struct 209 * @pdesc: pointer to HW descriptor struct 210 */ 211static inline void hw_desc_init(struct cc_hw_desc *pdesc) 212{ 213 memset(pdesc, 0, sizeof(struct cc_hw_desc)); 214} 215 216/** 217 * set_queue_last_ind_bit() - Indicate the end of current HW descriptors flow 218 * and release the HW engines. 219 * 220 * @pdesc: Pointer to HW descriptor struct 221 */ 222static inline void set_queue_last_ind_bit(struct cc_hw_desc *pdesc) 223{ 224 pdesc->word[3] |= FIELD_PREP(WORD3_QUEUE_LAST_IND, 1); 225} 226 227/** 228 * set_din_type() - Set the DIN field of a HW descriptor 229 * 230 * @pdesc: Pointer to HW descriptor struct 231 * @dma_mode: The DMA mode: NO_DMA, SRAM, DLLI, MLLI, CONSTANT 232 * @addr: DIN address 233 * @size: Data size in bytes 234 * @axi_sec: AXI secure bit 235 */ 236static inline void set_din_type(struct cc_hw_desc *pdesc, 237 enum cc_dma_mode dma_mode, dma_addr_t addr, 238 u32 size, enum cc_axi_sec axi_sec) 239{ 240 pdesc->word[0] = lower_32_bits(addr); 241#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT 242 pdesc->word[5] |= FIELD_PREP(WORD5_DIN_ADDR_HIGH, upper_32_bits(addr)); 243#endif 244 pdesc->word[1] |= FIELD_PREP(WORD1_DIN_DMA_MODE, dma_mode) | 245 FIELD_PREP(WORD1_DIN_SIZE, size) | 246 FIELD_PREP(WORD1_NS_BIT, axi_sec); 247} 248 249/** 250 * set_din_no_dma() - Set the DIN field of a HW descriptor to NO DMA mode. 251 * Used for NOP descriptor, register patches and other special modes. 252 * 253 * @pdesc: Pointer to HW descriptor struct 254 * @addr: DIN address 255 * @size: Data size in bytes 256 */ 257static inline void set_din_no_dma(struct cc_hw_desc *pdesc, u32 addr, u32 size) 258{ 259 pdesc->word[0] = addr; 260 pdesc->word[1] |= FIELD_PREP(WORD1_DIN_SIZE, size); 261} 262 263/** 264 * set_cpp_crypto_key() - Setup the special CPP descriptor 265 * 266 * @pdesc: Pointer to HW descriptor struct 267 * @slot: Slot number 268 */ 269static inline void set_cpp_crypto_key(struct cc_hw_desc *pdesc, u8 slot) 270{ 271 pdesc->word[0] |= CC_CPP_DIN_ADDR; 272 273 pdesc->word[1] |= FIELD_PREP(WORD1_DIN_SIZE, CC_CPP_DIN_SIZE); 274 pdesc->word[1] |= FIELD_PREP(WORD1_LOCK_QUEUE, 1); 275 276 pdesc->word[4] |= FIELD_PREP(WORD4_SETUP_OPERATION, slot); 277} 278 279/** 280 * set_din_sram() - Set the DIN field of a HW descriptor to SRAM mode. 281 * Note: No need to check SRAM alignment since host requests do not use SRAM and 282 * the adaptor will enforce alignment checks. 283 * 284 * @pdesc: Pointer to HW descriptor struct 285 * @addr: DIN address 286 * @size: Data size in bytes 287 */ 288static inline void set_din_sram(struct cc_hw_desc *pdesc, u32 addr, u32 size) 289{ 290 pdesc->word[0] = addr; 291 pdesc->word[1] |= FIELD_PREP(WORD1_DIN_SIZE, size) | 292 FIELD_PREP(WORD1_DIN_DMA_MODE, DMA_SRAM); 293} 294 295/** 296 * set_din_const() - Set the DIN field of a HW descriptor to CONST mode 297 * 298 * @pdesc: Pointer to HW descriptor struct 299 * @val: DIN const value 300 * @size: Data size in bytes 301 */ 302static inline void set_din_const(struct cc_hw_desc *pdesc, u32 val, u32 size) 303{ 304 pdesc->word[0] = val; 305 pdesc->word[1] |= FIELD_PREP(WORD1_DIN_CONST_VALUE, 1) | 306 FIELD_PREP(WORD1_DIN_DMA_MODE, DMA_SRAM) | 307 FIELD_PREP(WORD1_DIN_SIZE, size); 308} 309 310/** 311 * set_din_not_last_indication() - Set the DIN not last input data indicator 312 * 313 * @pdesc: Pointer to HW descriptor struct 314 */ 315static inline void set_din_not_last_indication(struct cc_hw_desc *pdesc) 316{ 317 pdesc->word[1] |= FIELD_PREP(WORD1_NOT_LAST, 1); 318} 319 320/** 321 * set_dout_type() - Set the DOUT field of a HW descriptor 322 * 323 * @pdesc: Pointer to HW descriptor struct 324 * @dma_mode: The DMA mode: NO_DMA, SRAM, DLLI, MLLI, CONSTANT 325 * @addr: DOUT address 326 * @size: Data size in bytes 327 * @axi_sec: AXI secure bit 328 */ 329static inline void set_dout_type(struct cc_hw_desc *pdesc, 330 enum cc_dma_mode dma_mode, dma_addr_t addr, 331 u32 size, enum cc_axi_sec axi_sec) 332{ 333 pdesc->word[2] = lower_32_bits(addr); 334#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT 335 pdesc->word[5] |= FIELD_PREP(WORD5_DOUT_ADDR_HIGH, upper_32_bits(addr)); 336#endif 337 pdesc->word[3] |= FIELD_PREP(WORD3_DOUT_DMA_MODE, dma_mode) | 338 FIELD_PREP(WORD3_DOUT_SIZE, size) | 339 FIELD_PREP(WORD3_NS_BIT, axi_sec); 340} 341 342/** 343 * set_dout_dlli() - Set the DOUT field of a HW descriptor to DLLI type 344 * The LAST INDICATION is provided by the user 345 * 346 * @pdesc: Pointer to HW descriptor struct 347 * @addr: DOUT address 348 * @size: Data size in bytes 349 * @axi_sec: AXI secure bit 350 * @last_ind: The last indication bit 351 */ 352static inline void set_dout_dlli(struct cc_hw_desc *pdesc, dma_addr_t addr, 353 u32 size, enum cc_axi_sec axi_sec, 354 u32 last_ind) 355{ 356 set_dout_type(pdesc, DMA_DLLI, addr, size, axi_sec); 357 pdesc->word[3] |= FIELD_PREP(WORD3_DOUT_LAST_IND, last_ind); 358} 359 360/** 361 * set_dout_mlli() - Set the DOUT field of a HW descriptor to MLLI type 362 * The LAST INDICATION is provided by the user 363 * 364 * @pdesc: Pointer to HW descriptor struct 365 * @addr: DOUT address 366 * @size: Data size in bytes 367 * @axi_sec: AXI secure bit 368 * @last_ind: The last indication bit 369 */ 370static inline void set_dout_mlli(struct cc_hw_desc *pdesc, u32 addr, u32 size, 371 enum cc_axi_sec axi_sec, bool last_ind) 372{ 373 set_dout_type(pdesc, DMA_MLLI, addr, size, axi_sec); 374 pdesc->word[3] |= FIELD_PREP(WORD3_DOUT_LAST_IND, last_ind); 375} 376 377/** 378 * set_dout_no_dma() - Set the DOUT field of a HW descriptor to NO DMA mode. 379 * Used for NOP descriptor, register patches and other special modes. 380 * 381 * @pdesc: pointer to HW descriptor struct 382 * @addr: DOUT address 383 * @size: Data size in bytes 384 * @write_enable: Enables a write operation to a register 385 */ 386static inline void set_dout_no_dma(struct cc_hw_desc *pdesc, u32 addr, 387 u32 size, bool write_enable) 388{ 389 pdesc->word[2] = addr; 390 pdesc->word[3] |= FIELD_PREP(WORD3_DOUT_SIZE, size) | 391 FIELD_PREP(WORD3_DOUT_LAST_IND, write_enable); 392} 393 394/** 395 * set_xor_val() - Set the word for the XOR operation. 396 * 397 * @pdesc: Pointer to HW descriptor struct 398 * @val: XOR data value 399 */ 400static inline void set_xor_val(struct cc_hw_desc *pdesc, u32 val) 401{ 402 pdesc->word[2] = val; 403} 404 405/** 406 * set_xor_active() - Set the XOR indicator bit in the descriptor 407 * 408 * @pdesc: Pointer to HW descriptor struct 409 */ 410static inline void set_xor_active(struct cc_hw_desc *pdesc) 411{ 412 pdesc->word[3] |= FIELD_PREP(WORD3_HASH_XOR_BIT, 1); 413} 414 415/** 416 * set_aes_not_hash_mode() - Select the AES engine instead of HASH engine when 417 * setting up combined mode with AES XCBC MAC 418 * 419 * @pdesc: Pointer to HW descriptor struct 420 */ 421static inline void set_aes_not_hash_mode(struct cc_hw_desc *pdesc) 422{ 423 pdesc->word[4] |= FIELD_PREP(WORD4_AES_SEL_N_HASH, 1); 424} 425 426/** 427 * set_aes_xor_crypto_key() - Set aes xor crypto key, which in some scenarios 428 * selects the SM3 engine 429 * 430 * @pdesc: Pointer to HW descriptor struct 431 */ 432static inline void set_aes_xor_crypto_key(struct cc_hw_desc *pdesc) 433{ 434 pdesc->word[4] |= FIELD_PREP(WORD4_AES_XOR_CRYPTO_KEY, 1); 435} 436 437/** 438 * set_dout_sram() - Set the DOUT field of a HW descriptor to SRAM mode 439 * Note: No need to check SRAM alignment since host requests do not use SRAM and 440 * the adaptor will enforce alignment checks. 441 * 442 * @pdesc: Pointer to HW descriptor struct 443 * @addr: DOUT address 444 * @size: Data size in bytes 445 */ 446static inline void set_dout_sram(struct cc_hw_desc *pdesc, u32 addr, u32 size) 447{ 448 pdesc->word[2] = addr; 449 pdesc->word[3] |= FIELD_PREP(WORD3_DOUT_DMA_MODE, DMA_SRAM) | 450 FIELD_PREP(WORD3_DOUT_SIZE, size); 451} 452 453/** 454 * set_xex_data_unit_size() - Set the data unit size for XEX mode in 455 * data_out_addr[15:0] 456 * 457 * @pdesc: Pointer to HW descriptor struct 458 * @size: Data unit size for XEX mode 459 */ 460static inline void set_xex_data_unit_size(struct cc_hw_desc *pdesc, u32 size) 461{ 462 pdesc->word[2] = size; 463} 464 465/** 466 * set_multi2_num_rounds() - Set the number of rounds for Multi2 in 467 * data_out_addr[15:0] 468 * 469 * @pdesc: Pointer to HW descriptor struct 470 * @num: Number of rounds for Multi2 471 */ 472static inline void set_multi2_num_rounds(struct cc_hw_desc *pdesc, u32 num) 473{ 474 pdesc->word[2] = num; 475} 476 477/** 478 * set_flow_mode() - Set the flow mode. 479 * 480 * @pdesc: Pointer to HW descriptor struct 481 * @mode: Any one of the modes defined in [CC7x-DESC] 482 */ 483static inline void set_flow_mode(struct cc_hw_desc *pdesc, 484 enum cc_flow_mode mode) 485{ 486 pdesc->word[4] |= FIELD_PREP(WORD4_DATA_FLOW_MODE, mode); 487} 488 489/** 490 * set_cipher_mode() - Set the cipher mode. 491 * 492 * @pdesc: Pointer to HW descriptor struct 493 * @mode: Any one of the modes defined in [CC7x-DESC] 494 */ 495static inline void set_cipher_mode(struct cc_hw_desc *pdesc, int mode) 496{ 497 pdesc->word[4] |= FIELD_PREP(WORD4_CIPHER_MODE, mode); 498} 499 500/** 501 * set_hash_cipher_mode() - Set the cipher mode for hash algorithms. 502 * 503 * @pdesc: Pointer to HW descriptor struct 504 * @cipher_mode: Any one of the modes defined in [CC7x-DESC] 505 * @hash_mode: specifies which hash is being handled 506 */ 507static inline void set_hash_cipher_mode(struct cc_hw_desc *pdesc, 508 enum drv_cipher_mode cipher_mode, 509 enum drv_hash_mode hash_mode) 510{ 511 set_cipher_mode(pdesc, cipher_mode); 512 if (hash_mode == DRV_HASH_SM3) 513 set_aes_xor_crypto_key(pdesc); 514} 515 516/** 517 * set_cipher_config0() - Set the cipher configuration fields. 518 * 519 * @pdesc: Pointer to HW descriptor struct 520 * @mode: Any one of the modes defined in [CC7x-DESC] 521 */ 522static inline void set_cipher_config0(struct cc_hw_desc *pdesc, int mode) 523{ 524 pdesc->word[4] |= FIELD_PREP(WORD4_CIPHER_CONF0, mode); 525} 526 527/** 528 * set_cipher_config1() - Set the cipher configuration fields. 529 * 530 * @pdesc: Pointer to HW descriptor struct 531 * @config: Padding mode 532 */ 533static inline void set_cipher_config1(struct cc_hw_desc *pdesc, 534 enum cc_hash_conf_pad config) 535{ 536 pdesc->word[4] |= FIELD_PREP(WORD4_CIPHER_CONF1, config); 537} 538 539/** 540 * set_hw_crypto_key() - Set HW key configuration fields. 541 * 542 * @pdesc: Pointer to HW descriptor struct 543 * @hw_key: The HW key slot asdefined in enum cc_hw_crypto_key 544 */ 545static inline void set_hw_crypto_key(struct cc_hw_desc *pdesc, 546 enum cc_hw_crypto_key hw_key) 547{ 548 pdesc->word[4] |= FIELD_PREP(WORD4_CIPHER_DO, 549 (hw_key & HW_KEY_MASK_CIPHER_DO)) | 550 FIELD_PREP(WORD4_CIPHER_CONF2, 551 (hw_key >> HW_KEY_SHIFT_CIPHER_CFG2)); 552} 553 554/** 555 * set_bytes_swap() - Set byte order of all setup-finalize descriptors. 556 * 557 * @pdesc: Pointer to HW descriptor struct 558 * @config: True to enable byte swapping 559 */ 560static inline void set_bytes_swap(struct cc_hw_desc *pdesc, bool config) 561{ 562 pdesc->word[4] |= FIELD_PREP(WORD4_BYTES_SWAP, config); 563} 564 565/** 566 * set_cmac_size0_mode() - Set CMAC_SIZE0 mode. 567 * 568 * @pdesc: Pointer to HW descriptor struct 569 */ 570static inline void set_cmac_size0_mode(struct cc_hw_desc *pdesc) 571{ 572 pdesc->word[4] |= FIELD_PREP(WORD4_CMAC_SIZE0, 1); 573} 574 575/** 576 * set_key_size() - Set key size descriptor field. 577 * 578 * @pdesc: Pointer to HW descriptor struct 579 * @size: Key size in bytes (NOT size code) 580 */ 581static inline void set_key_size(struct cc_hw_desc *pdesc, u32 size) 582{ 583 pdesc->word[4] |= FIELD_PREP(WORD4_KEY_SIZE, size); 584} 585 586/** 587 * set_key_size_aes() - Set AES key size. 588 * 589 * @pdesc: Pointer to HW descriptor struct 590 * @size: Key size in bytes (NOT size code) 591 */ 592static inline void set_key_size_aes(struct cc_hw_desc *pdesc, u32 size) 593{ 594 set_key_size(pdesc, ((size >> 3) - 2)); 595} 596 597/** 598 * set_key_size_des() - Set DES key size. 599 * 600 * @pdesc: Pointer to HW descriptor struct 601 * @size: Key size in bytes (NOT size code) 602 */ 603static inline void set_key_size_des(struct cc_hw_desc *pdesc, u32 size) 604{ 605 set_key_size(pdesc, ((size >> 3) - 1)); 606} 607 608/** 609 * set_setup_mode() - Set the descriptor setup mode 610 * 611 * @pdesc: Pointer to HW descriptor struct 612 * @mode: Any one of the setup modes defined in [CC7x-DESC] 613 */ 614static inline void set_setup_mode(struct cc_hw_desc *pdesc, 615 enum cc_setup_op mode) 616{ 617 pdesc->word[4] |= FIELD_PREP(WORD4_SETUP_OPERATION, mode); 618} 619 620/** 621 * set_cipher_do() - Set the descriptor cipher DO 622 * 623 * @pdesc: Pointer to HW descriptor struct 624 * @config: Any one of the cipher do defined in [CC7x-DESC] 625 */ 626static inline void set_cipher_do(struct cc_hw_desc *pdesc, 627 enum cc_hash_cipher_pad config) 628{ 629 pdesc->word[4] |= FIELD_PREP(WORD4_CIPHER_DO, 630 (config & HW_KEY_MASK_CIPHER_DO)); 631} 632 633#endif /*__CC_HW_QUEUE_DEFS_H__*/