162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* Copyright (C) 2012-2019 ARM Limited (or its affiliates). */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#ifndef __CC_HW_QUEUE_DEFS_H__ 562306a36Sopenharmony_ci#define __CC_HW_QUEUE_DEFS_H__ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/types.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "cc_kernel_regs.h" 1062306a36Sopenharmony_ci#include <linux/bitfield.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/****************************************************************************** 1362306a36Sopenharmony_ci * DEFINITIONS 1462306a36Sopenharmony_ci ******************************************************************************/ 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define HW_DESC_SIZE_WORDS 6 1762306a36Sopenharmony_ci/* Define max. available slots in HW queue */ 1862306a36Sopenharmony_ci#define HW_QUEUE_SLOTS_MAX 15 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define CC_REG_LOW(name) (name ## _BIT_SHIFT) 2162306a36Sopenharmony_ci#define CC_REG_HIGH(name) (CC_REG_LOW(name) + name ## _BIT_SIZE - 1) 2262306a36Sopenharmony_ci#define CC_GENMASK(name) GENMASK(CC_REG_HIGH(name), CC_REG_LOW(name)) 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define CC_HWQ_GENMASK(word, field) \ 2562306a36Sopenharmony_ci CC_GENMASK(CC_DSCRPTR_QUEUE_WORD ## word ## _ ## field) 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#define WORD0_VALUE CC_HWQ_GENMASK(0, VALUE) 2862306a36Sopenharmony_ci#define WORD0_CPP_CIPHER_MODE CC_HWQ_GENMASK(0, CPP_CIPHER_MODE) 2962306a36Sopenharmony_ci#define WORD1_DIN_CONST_VALUE CC_HWQ_GENMASK(1, DIN_CONST_VALUE) 3062306a36Sopenharmony_ci#define WORD1_DIN_DMA_MODE CC_HWQ_GENMASK(1, DIN_DMA_MODE) 3162306a36Sopenharmony_ci#define WORD1_DIN_SIZE CC_HWQ_GENMASK(1, DIN_SIZE) 3262306a36Sopenharmony_ci#define WORD1_NOT_LAST CC_HWQ_GENMASK(1, NOT_LAST) 3362306a36Sopenharmony_ci#define WORD1_NS_BIT CC_HWQ_GENMASK(1, NS_BIT) 3462306a36Sopenharmony_ci#define WORD1_LOCK_QUEUE CC_HWQ_GENMASK(1, LOCK_QUEUE) 3562306a36Sopenharmony_ci#define WORD2_VALUE CC_HWQ_GENMASK(2, VALUE) 3662306a36Sopenharmony_ci#define WORD3_DOUT_DMA_MODE CC_HWQ_GENMASK(3, DOUT_DMA_MODE) 3762306a36Sopenharmony_ci#define WORD3_DOUT_LAST_IND CC_HWQ_GENMASK(3, DOUT_LAST_IND) 3862306a36Sopenharmony_ci#define WORD3_DOUT_SIZE CC_HWQ_GENMASK(3, DOUT_SIZE) 3962306a36Sopenharmony_ci#define WORD3_HASH_XOR_BIT CC_HWQ_GENMASK(3, HASH_XOR_BIT) 4062306a36Sopenharmony_ci#define WORD3_NS_BIT CC_HWQ_GENMASK(3, NS_BIT) 4162306a36Sopenharmony_ci#define WORD3_QUEUE_LAST_IND CC_HWQ_GENMASK(3, QUEUE_LAST_IND) 4262306a36Sopenharmony_ci#define WORD4_ACK_NEEDED CC_HWQ_GENMASK(4, ACK_NEEDED) 4362306a36Sopenharmony_ci#define WORD4_AES_SEL_N_HASH CC_HWQ_GENMASK(4, AES_SEL_N_HASH) 4462306a36Sopenharmony_ci#define WORD4_AES_XOR_CRYPTO_KEY CC_HWQ_GENMASK(4, AES_XOR_CRYPTO_KEY) 4562306a36Sopenharmony_ci#define WORD4_BYTES_SWAP CC_HWQ_GENMASK(4, BYTES_SWAP) 4662306a36Sopenharmony_ci#define WORD4_CIPHER_CONF0 CC_HWQ_GENMASK(4, CIPHER_CONF0) 4762306a36Sopenharmony_ci#define WORD4_CIPHER_CONF1 CC_HWQ_GENMASK(4, CIPHER_CONF1) 4862306a36Sopenharmony_ci#define WORD4_CIPHER_CONF2 CC_HWQ_GENMASK(4, CIPHER_CONF2) 4962306a36Sopenharmony_ci#define WORD4_CIPHER_DO CC_HWQ_GENMASK(4, CIPHER_DO) 5062306a36Sopenharmony_ci#define WORD4_CIPHER_MODE CC_HWQ_GENMASK(4, CIPHER_MODE) 5162306a36Sopenharmony_ci#define WORD4_CMAC_SIZE0 CC_HWQ_GENMASK(4, CMAC_SIZE0) 5262306a36Sopenharmony_ci#define WORD4_DATA_FLOW_MODE CC_HWQ_GENMASK(4, DATA_FLOW_MODE) 5362306a36Sopenharmony_ci#define WORD4_KEY_SIZE CC_HWQ_GENMASK(4, KEY_SIZE) 5462306a36Sopenharmony_ci#define WORD4_SETUP_OPERATION CC_HWQ_GENMASK(4, SETUP_OPERATION) 5562306a36Sopenharmony_ci#define WORD5_DIN_ADDR_HIGH CC_HWQ_GENMASK(5, DIN_ADDR_HIGH) 5662306a36Sopenharmony_ci#define WORD5_DOUT_ADDR_HIGH CC_HWQ_GENMASK(5, DOUT_ADDR_HIGH) 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci/****************************************************************************** 5962306a36Sopenharmony_ci * TYPE DEFINITIONS 6062306a36Sopenharmony_ci ******************************************************************************/ 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_cistruct cc_hw_desc { 6362306a36Sopenharmony_ci union { 6462306a36Sopenharmony_ci u32 word[HW_DESC_SIZE_WORDS]; 6562306a36Sopenharmony_ci u16 hword[HW_DESC_SIZE_WORDS * 2]; 6662306a36Sopenharmony_ci }; 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_cienum cc_axi_sec { 7062306a36Sopenharmony_ci AXI_SECURE = 0, 7162306a36Sopenharmony_ci AXI_NOT_SECURE = 1 7262306a36Sopenharmony_ci}; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cienum cc_desc_direction { 7562306a36Sopenharmony_ci DESC_DIRECTION_ILLEGAL = -1, 7662306a36Sopenharmony_ci DESC_DIRECTION_ENCRYPT_ENCRYPT = 0, 7762306a36Sopenharmony_ci DESC_DIRECTION_DECRYPT_DECRYPT = 1, 7862306a36Sopenharmony_ci DESC_DIRECTION_DECRYPT_ENCRYPT = 3, 7962306a36Sopenharmony_ci DESC_DIRECTION_END = S32_MAX, 8062306a36Sopenharmony_ci}; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cienum cc_dma_mode { 8362306a36Sopenharmony_ci DMA_MODE_NULL = -1, 8462306a36Sopenharmony_ci NO_DMA = 0, 8562306a36Sopenharmony_ci DMA_SRAM = 1, 8662306a36Sopenharmony_ci DMA_DLLI = 2, 8762306a36Sopenharmony_ci DMA_MLLI = 3, 8862306a36Sopenharmony_ci DMA_MODE_END = S32_MAX, 8962306a36Sopenharmony_ci}; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_cienum cc_flow_mode { 9262306a36Sopenharmony_ci FLOW_MODE_NULL = -1, 9362306a36Sopenharmony_ci /* data flows */ 9462306a36Sopenharmony_ci BYPASS = 0, 9562306a36Sopenharmony_ci DIN_AES_DOUT = 1, 9662306a36Sopenharmony_ci AES_to_HASH = 2, 9762306a36Sopenharmony_ci AES_and_HASH = 3, 9862306a36Sopenharmony_ci DIN_DES_DOUT = 4, 9962306a36Sopenharmony_ci DES_to_HASH = 5, 10062306a36Sopenharmony_ci DES_and_HASH = 6, 10162306a36Sopenharmony_ci DIN_HASH = 7, 10262306a36Sopenharmony_ci DIN_HASH_and_BYPASS = 8, 10362306a36Sopenharmony_ci AESMAC_and_BYPASS = 9, 10462306a36Sopenharmony_ci AES_to_HASH_and_DOUT = 10, 10562306a36Sopenharmony_ci DIN_RC4_DOUT = 11, 10662306a36Sopenharmony_ci DES_to_HASH_and_DOUT = 12, 10762306a36Sopenharmony_ci AES_to_AES_to_HASH_and_DOUT = 13, 10862306a36Sopenharmony_ci AES_to_AES_to_HASH = 14, 10962306a36Sopenharmony_ci AES_to_HASH_and_AES = 15, 11062306a36Sopenharmony_ci DIN_SM4_DOUT = 16, 11162306a36Sopenharmony_ci DIN_AES_AESMAC = 17, 11262306a36Sopenharmony_ci HASH_to_DOUT = 18, 11362306a36Sopenharmony_ci /* setup flows */ 11462306a36Sopenharmony_ci S_DIN_to_AES = 32, 11562306a36Sopenharmony_ci S_DIN_to_AES2 = 33, 11662306a36Sopenharmony_ci S_DIN_to_DES = 34, 11762306a36Sopenharmony_ci S_DIN_to_RC4 = 35, 11862306a36Sopenharmony_ci S_DIN_to_SM4 = 36, 11962306a36Sopenharmony_ci S_DIN_to_HASH = 37, 12062306a36Sopenharmony_ci S_AES_to_DOUT = 38, 12162306a36Sopenharmony_ci S_AES2_to_DOUT = 39, 12262306a36Sopenharmony_ci S_SM4_to_DOUT = 40, 12362306a36Sopenharmony_ci S_RC4_to_DOUT = 41, 12462306a36Sopenharmony_ci S_DES_to_DOUT = 42, 12562306a36Sopenharmony_ci S_HASH_to_DOUT = 43, 12662306a36Sopenharmony_ci SET_FLOW_ID = 44, 12762306a36Sopenharmony_ci FLOW_MODE_END = S32_MAX, 12862306a36Sopenharmony_ci}; 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_cienum cc_setup_op { 13162306a36Sopenharmony_ci SETUP_LOAD_NOP = 0, 13262306a36Sopenharmony_ci SETUP_LOAD_STATE0 = 1, 13362306a36Sopenharmony_ci SETUP_LOAD_STATE1 = 2, 13462306a36Sopenharmony_ci SETUP_LOAD_STATE2 = 3, 13562306a36Sopenharmony_ci SETUP_LOAD_KEY0 = 4, 13662306a36Sopenharmony_ci SETUP_LOAD_XEX_KEY = 5, 13762306a36Sopenharmony_ci SETUP_WRITE_STATE0 = 8, 13862306a36Sopenharmony_ci SETUP_WRITE_STATE1 = 9, 13962306a36Sopenharmony_ci SETUP_WRITE_STATE2 = 10, 14062306a36Sopenharmony_ci SETUP_WRITE_STATE3 = 11, 14162306a36Sopenharmony_ci SETUP_OP_END = S32_MAX, 14262306a36Sopenharmony_ci}; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_cienum cc_hash_conf_pad { 14562306a36Sopenharmony_ci HASH_PADDING_DISABLED = 0, 14662306a36Sopenharmony_ci HASH_PADDING_ENABLED = 1, 14762306a36Sopenharmony_ci HASH_DIGEST_RESULT_LITTLE_ENDIAN = 2, 14862306a36Sopenharmony_ci HASH_CONFIG1_PADDING_RESERVE32 = S32_MAX, 14962306a36Sopenharmony_ci}; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_cienum cc_aes_mac_selector { 15262306a36Sopenharmony_ci AES_SK = 1, 15362306a36Sopenharmony_ci AES_CMAC_INIT = 2, 15462306a36Sopenharmony_ci AES_CMAC_SIZE0 = 3, 15562306a36Sopenharmony_ci AES_MAC_END = S32_MAX, 15662306a36Sopenharmony_ci}; 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci#define HW_KEY_MASK_CIPHER_DO 0x3 15962306a36Sopenharmony_ci#define HW_KEY_SHIFT_CIPHER_CFG2 2 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci/* HwCryptoKey[1:0] is mapped to cipher_do[1:0] */ 16262306a36Sopenharmony_ci/* HwCryptoKey[2:3] is mapped to cipher_config2[1:0] */ 16362306a36Sopenharmony_cienum cc_hw_crypto_key { 16462306a36Sopenharmony_ci USER_KEY = 0, /* 0x0000 */ 16562306a36Sopenharmony_ci ROOT_KEY = 1, /* 0x0001 */ 16662306a36Sopenharmony_ci PROVISIONING_KEY = 2, /* 0x0010 */ /* ==KCP */ 16762306a36Sopenharmony_ci SESSION_KEY = 3, /* 0x0011 */ 16862306a36Sopenharmony_ci RESERVED_KEY = 4, /* NA */ 16962306a36Sopenharmony_ci PLATFORM_KEY = 5, /* 0x0101 */ 17062306a36Sopenharmony_ci CUSTOMER_KEY = 6, /* 0x0110 */ 17162306a36Sopenharmony_ci KFDE0_KEY = 7, /* 0x0111 */ 17262306a36Sopenharmony_ci KFDE1_KEY = 9, /* 0x1001 */ 17362306a36Sopenharmony_ci KFDE2_KEY = 10, /* 0x1010 */ 17462306a36Sopenharmony_ci KFDE3_KEY = 11, /* 0x1011 */ 17562306a36Sopenharmony_ci END_OF_KEYS = S32_MAX, 17662306a36Sopenharmony_ci}; 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci#define CC_NUM_HW_KEY_SLOTS 4 17962306a36Sopenharmony_ci#define CC_FIRST_HW_KEY_SLOT 0 18062306a36Sopenharmony_ci#define CC_LAST_HW_KEY_SLOT (CC_FIRST_HW_KEY_SLOT + CC_NUM_HW_KEY_SLOTS - 1) 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci#define CC_NUM_CPP_KEY_SLOTS 8 18362306a36Sopenharmony_ci#define CC_FIRST_CPP_KEY_SLOT 16 18462306a36Sopenharmony_ci#define CC_LAST_CPP_KEY_SLOT (CC_FIRST_CPP_KEY_SLOT + \ 18562306a36Sopenharmony_ci CC_NUM_CPP_KEY_SLOTS - 1) 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_cienum cc_hw_aes_key_size { 18862306a36Sopenharmony_ci AES_128_KEY = 0, 18962306a36Sopenharmony_ci AES_192_KEY = 1, 19062306a36Sopenharmony_ci AES_256_KEY = 2, 19162306a36Sopenharmony_ci END_OF_AES_KEYS = S32_MAX, 19262306a36Sopenharmony_ci}; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_cienum cc_hash_cipher_pad { 19562306a36Sopenharmony_ci DO_NOT_PAD = 0, 19662306a36Sopenharmony_ci DO_PAD = 1, 19762306a36Sopenharmony_ci HASH_CIPHER_DO_PADDING_RESERVE32 = S32_MAX, 19862306a36Sopenharmony_ci}; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci#define CC_CPP_DIN_ADDR 0xFF00FF00UL 20162306a36Sopenharmony_ci#define CC_CPP_DIN_SIZE 0xFF00FFUL 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci/*****************************/ 20462306a36Sopenharmony_ci/* Descriptor packing macros */ 20562306a36Sopenharmony_ci/*****************************/ 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci/** 20862306a36Sopenharmony_ci * hw_desc_init() - Init a HW descriptor struct 20962306a36Sopenharmony_ci * @pdesc: pointer to HW descriptor struct 21062306a36Sopenharmony_ci */ 21162306a36Sopenharmony_cistatic inline void hw_desc_init(struct cc_hw_desc *pdesc) 21262306a36Sopenharmony_ci{ 21362306a36Sopenharmony_ci memset(pdesc, 0, sizeof(struct cc_hw_desc)); 21462306a36Sopenharmony_ci} 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci/** 21762306a36Sopenharmony_ci * set_queue_last_ind_bit() - Indicate the end of current HW descriptors flow 21862306a36Sopenharmony_ci * and release the HW engines. 21962306a36Sopenharmony_ci * 22062306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 22162306a36Sopenharmony_ci */ 22262306a36Sopenharmony_cistatic inline void set_queue_last_ind_bit(struct cc_hw_desc *pdesc) 22362306a36Sopenharmony_ci{ 22462306a36Sopenharmony_ci pdesc->word[3] |= FIELD_PREP(WORD3_QUEUE_LAST_IND, 1); 22562306a36Sopenharmony_ci} 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci/** 22862306a36Sopenharmony_ci * set_din_type() - Set the DIN field of a HW descriptor 22962306a36Sopenharmony_ci * 23062306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 23162306a36Sopenharmony_ci * @dma_mode: The DMA mode: NO_DMA, SRAM, DLLI, MLLI, CONSTANT 23262306a36Sopenharmony_ci * @addr: DIN address 23362306a36Sopenharmony_ci * @size: Data size in bytes 23462306a36Sopenharmony_ci * @axi_sec: AXI secure bit 23562306a36Sopenharmony_ci */ 23662306a36Sopenharmony_cistatic inline void set_din_type(struct cc_hw_desc *pdesc, 23762306a36Sopenharmony_ci enum cc_dma_mode dma_mode, dma_addr_t addr, 23862306a36Sopenharmony_ci u32 size, enum cc_axi_sec axi_sec) 23962306a36Sopenharmony_ci{ 24062306a36Sopenharmony_ci pdesc->word[0] = lower_32_bits(addr); 24162306a36Sopenharmony_ci#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT 24262306a36Sopenharmony_ci pdesc->word[5] |= FIELD_PREP(WORD5_DIN_ADDR_HIGH, upper_32_bits(addr)); 24362306a36Sopenharmony_ci#endif 24462306a36Sopenharmony_ci pdesc->word[1] |= FIELD_PREP(WORD1_DIN_DMA_MODE, dma_mode) | 24562306a36Sopenharmony_ci FIELD_PREP(WORD1_DIN_SIZE, size) | 24662306a36Sopenharmony_ci FIELD_PREP(WORD1_NS_BIT, axi_sec); 24762306a36Sopenharmony_ci} 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_ci/** 25062306a36Sopenharmony_ci * set_din_no_dma() - Set the DIN field of a HW descriptor to NO DMA mode. 25162306a36Sopenharmony_ci * Used for NOP descriptor, register patches and other special modes. 25262306a36Sopenharmony_ci * 25362306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 25462306a36Sopenharmony_ci * @addr: DIN address 25562306a36Sopenharmony_ci * @size: Data size in bytes 25662306a36Sopenharmony_ci */ 25762306a36Sopenharmony_cistatic inline void set_din_no_dma(struct cc_hw_desc *pdesc, u32 addr, u32 size) 25862306a36Sopenharmony_ci{ 25962306a36Sopenharmony_ci pdesc->word[0] = addr; 26062306a36Sopenharmony_ci pdesc->word[1] |= FIELD_PREP(WORD1_DIN_SIZE, size); 26162306a36Sopenharmony_ci} 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci/** 26462306a36Sopenharmony_ci * set_cpp_crypto_key() - Setup the special CPP descriptor 26562306a36Sopenharmony_ci * 26662306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 26762306a36Sopenharmony_ci * @slot: Slot number 26862306a36Sopenharmony_ci */ 26962306a36Sopenharmony_cistatic inline void set_cpp_crypto_key(struct cc_hw_desc *pdesc, u8 slot) 27062306a36Sopenharmony_ci{ 27162306a36Sopenharmony_ci pdesc->word[0] |= CC_CPP_DIN_ADDR; 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci pdesc->word[1] |= FIELD_PREP(WORD1_DIN_SIZE, CC_CPP_DIN_SIZE); 27462306a36Sopenharmony_ci pdesc->word[1] |= FIELD_PREP(WORD1_LOCK_QUEUE, 1); 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci pdesc->word[4] |= FIELD_PREP(WORD4_SETUP_OPERATION, slot); 27762306a36Sopenharmony_ci} 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci/** 28062306a36Sopenharmony_ci * set_din_sram() - Set the DIN field of a HW descriptor to SRAM mode. 28162306a36Sopenharmony_ci * Note: No need to check SRAM alignment since host requests do not use SRAM and 28262306a36Sopenharmony_ci * the adaptor will enforce alignment checks. 28362306a36Sopenharmony_ci * 28462306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 28562306a36Sopenharmony_ci * @addr: DIN address 28662306a36Sopenharmony_ci * @size: Data size in bytes 28762306a36Sopenharmony_ci */ 28862306a36Sopenharmony_cistatic inline void set_din_sram(struct cc_hw_desc *pdesc, u32 addr, u32 size) 28962306a36Sopenharmony_ci{ 29062306a36Sopenharmony_ci pdesc->word[0] = addr; 29162306a36Sopenharmony_ci pdesc->word[1] |= FIELD_PREP(WORD1_DIN_SIZE, size) | 29262306a36Sopenharmony_ci FIELD_PREP(WORD1_DIN_DMA_MODE, DMA_SRAM); 29362306a36Sopenharmony_ci} 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci/** 29662306a36Sopenharmony_ci * set_din_const() - Set the DIN field of a HW descriptor to CONST mode 29762306a36Sopenharmony_ci * 29862306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 29962306a36Sopenharmony_ci * @val: DIN const value 30062306a36Sopenharmony_ci * @size: Data size in bytes 30162306a36Sopenharmony_ci */ 30262306a36Sopenharmony_cistatic inline void set_din_const(struct cc_hw_desc *pdesc, u32 val, u32 size) 30362306a36Sopenharmony_ci{ 30462306a36Sopenharmony_ci pdesc->word[0] = val; 30562306a36Sopenharmony_ci pdesc->word[1] |= FIELD_PREP(WORD1_DIN_CONST_VALUE, 1) | 30662306a36Sopenharmony_ci FIELD_PREP(WORD1_DIN_DMA_MODE, DMA_SRAM) | 30762306a36Sopenharmony_ci FIELD_PREP(WORD1_DIN_SIZE, size); 30862306a36Sopenharmony_ci} 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci/** 31162306a36Sopenharmony_ci * set_din_not_last_indication() - Set the DIN not last input data indicator 31262306a36Sopenharmony_ci * 31362306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 31462306a36Sopenharmony_ci */ 31562306a36Sopenharmony_cistatic inline void set_din_not_last_indication(struct cc_hw_desc *pdesc) 31662306a36Sopenharmony_ci{ 31762306a36Sopenharmony_ci pdesc->word[1] |= FIELD_PREP(WORD1_NOT_LAST, 1); 31862306a36Sopenharmony_ci} 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ci/** 32162306a36Sopenharmony_ci * set_dout_type() - Set the DOUT field of a HW descriptor 32262306a36Sopenharmony_ci * 32362306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 32462306a36Sopenharmony_ci * @dma_mode: The DMA mode: NO_DMA, SRAM, DLLI, MLLI, CONSTANT 32562306a36Sopenharmony_ci * @addr: DOUT address 32662306a36Sopenharmony_ci * @size: Data size in bytes 32762306a36Sopenharmony_ci * @axi_sec: AXI secure bit 32862306a36Sopenharmony_ci */ 32962306a36Sopenharmony_cistatic inline void set_dout_type(struct cc_hw_desc *pdesc, 33062306a36Sopenharmony_ci enum cc_dma_mode dma_mode, dma_addr_t addr, 33162306a36Sopenharmony_ci u32 size, enum cc_axi_sec axi_sec) 33262306a36Sopenharmony_ci{ 33362306a36Sopenharmony_ci pdesc->word[2] = lower_32_bits(addr); 33462306a36Sopenharmony_ci#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT 33562306a36Sopenharmony_ci pdesc->word[5] |= FIELD_PREP(WORD5_DOUT_ADDR_HIGH, upper_32_bits(addr)); 33662306a36Sopenharmony_ci#endif 33762306a36Sopenharmony_ci pdesc->word[3] |= FIELD_PREP(WORD3_DOUT_DMA_MODE, dma_mode) | 33862306a36Sopenharmony_ci FIELD_PREP(WORD3_DOUT_SIZE, size) | 33962306a36Sopenharmony_ci FIELD_PREP(WORD3_NS_BIT, axi_sec); 34062306a36Sopenharmony_ci} 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci/** 34362306a36Sopenharmony_ci * set_dout_dlli() - Set the DOUT field of a HW descriptor to DLLI type 34462306a36Sopenharmony_ci * The LAST INDICATION is provided by the user 34562306a36Sopenharmony_ci * 34662306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 34762306a36Sopenharmony_ci * @addr: DOUT address 34862306a36Sopenharmony_ci * @size: Data size in bytes 34962306a36Sopenharmony_ci * @axi_sec: AXI secure bit 35062306a36Sopenharmony_ci * @last_ind: The last indication bit 35162306a36Sopenharmony_ci */ 35262306a36Sopenharmony_cistatic inline void set_dout_dlli(struct cc_hw_desc *pdesc, dma_addr_t addr, 35362306a36Sopenharmony_ci u32 size, enum cc_axi_sec axi_sec, 35462306a36Sopenharmony_ci u32 last_ind) 35562306a36Sopenharmony_ci{ 35662306a36Sopenharmony_ci set_dout_type(pdesc, DMA_DLLI, addr, size, axi_sec); 35762306a36Sopenharmony_ci pdesc->word[3] |= FIELD_PREP(WORD3_DOUT_LAST_IND, last_ind); 35862306a36Sopenharmony_ci} 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci/** 36162306a36Sopenharmony_ci * set_dout_mlli() - Set the DOUT field of a HW descriptor to MLLI type 36262306a36Sopenharmony_ci * The LAST INDICATION is provided by the user 36362306a36Sopenharmony_ci * 36462306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 36562306a36Sopenharmony_ci * @addr: DOUT address 36662306a36Sopenharmony_ci * @size: Data size in bytes 36762306a36Sopenharmony_ci * @axi_sec: AXI secure bit 36862306a36Sopenharmony_ci * @last_ind: The last indication bit 36962306a36Sopenharmony_ci */ 37062306a36Sopenharmony_cistatic inline void set_dout_mlli(struct cc_hw_desc *pdesc, u32 addr, u32 size, 37162306a36Sopenharmony_ci enum cc_axi_sec axi_sec, bool last_ind) 37262306a36Sopenharmony_ci{ 37362306a36Sopenharmony_ci set_dout_type(pdesc, DMA_MLLI, addr, size, axi_sec); 37462306a36Sopenharmony_ci pdesc->word[3] |= FIELD_PREP(WORD3_DOUT_LAST_IND, last_ind); 37562306a36Sopenharmony_ci} 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci/** 37862306a36Sopenharmony_ci * set_dout_no_dma() - Set the DOUT field of a HW descriptor to NO DMA mode. 37962306a36Sopenharmony_ci * Used for NOP descriptor, register patches and other special modes. 38062306a36Sopenharmony_ci * 38162306a36Sopenharmony_ci * @pdesc: pointer to HW descriptor struct 38262306a36Sopenharmony_ci * @addr: DOUT address 38362306a36Sopenharmony_ci * @size: Data size in bytes 38462306a36Sopenharmony_ci * @write_enable: Enables a write operation to a register 38562306a36Sopenharmony_ci */ 38662306a36Sopenharmony_cistatic inline void set_dout_no_dma(struct cc_hw_desc *pdesc, u32 addr, 38762306a36Sopenharmony_ci u32 size, bool write_enable) 38862306a36Sopenharmony_ci{ 38962306a36Sopenharmony_ci pdesc->word[2] = addr; 39062306a36Sopenharmony_ci pdesc->word[3] |= FIELD_PREP(WORD3_DOUT_SIZE, size) | 39162306a36Sopenharmony_ci FIELD_PREP(WORD3_DOUT_LAST_IND, write_enable); 39262306a36Sopenharmony_ci} 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci/** 39562306a36Sopenharmony_ci * set_xor_val() - Set the word for the XOR operation. 39662306a36Sopenharmony_ci * 39762306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 39862306a36Sopenharmony_ci * @val: XOR data value 39962306a36Sopenharmony_ci */ 40062306a36Sopenharmony_cistatic inline void set_xor_val(struct cc_hw_desc *pdesc, u32 val) 40162306a36Sopenharmony_ci{ 40262306a36Sopenharmony_ci pdesc->word[2] = val; 40362306a36Sopenharmony_ci} 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_ci/** 40662306a36Sopenharmony_ci * set_xor_active() - Set the XOR indicator bit in the descriptor 40762306a36Sopenharmony_ci * 40862306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 40962306a36Sopenharmony_ci */ 41062306a36Sopenharmony_cistatic inline void set_xor_active(struct cc_hw_desc *pdesc) 41162306a36Sopenharmony_ci{ 41262306a36Sopenharmony_ci pdesc->word[3] |= FIELD_PREP(WORD3_HASH_XOR_BIT, 1); 41362306a36Sopenharmony_ci} 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci/** 41662306a36Sopenharmony_ci * set_aes_not_hash_mode() - Select the AES engine instead of HASH engine when 41762306a36Sopenharmony_ci * setting up combined mode with AES XCBC MAC 41862306a36Sopenharmony_ci * 41962306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 42062306a36Sopenharmony_ci */ 42162306a36Sopenharmony_cistatic inline void set_aes_not_hash_mode(struct cc_hw_desc *pdesc) 42262306a36Sopenharmony_ci{ 42362306a36Sopenharmony_ci pdesc->word[4] |= FIELD_PREP(WORD4_AES_SEL_N_HASH, 1); 42462306a36Sopenharmony_ci} 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci/** 42762306a36Sopenharmony_ci * set_aes_xor_crypto_key() - Set aes xor crypto key, which in some scenarios 42862306a36Sopenharmony_ci * selects the SM3 engine 42962306a36Sopenharmony_ci * 43062306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 43162306a36Sopenharmony_ci */ 43262306a36Sopenharmony_cistatic inline void set_aes_xor_crypto_key(struct cc_hw_desc *pdesc) 43362306a36Sopenharmony_ci{ 43462306a36Sopenharmony_ci pdesc->word[4] |= FIELD_PREP(WORD4_AES_XOR_CRYPTO_KEY, 1); 43562306a36Sopenharmony_ci} 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ci/** 43862306a36Sopenharmony_ci * set_dout_sram() - Set the DOUT field of a HW descriptor to SRAM mode 43962306a36Sopenharmony_ci * Note: No need to check SRAM alignment since host requests do not use SRAM and 44062306a36Sopenharmony_ci * the adaptor will enforce alignment checks. 44162306a36Sopenharmony_ci * 44262306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 44362306a36Sopenharmony_ci * @addr: DOUT address 44462306a36Sopenharmony_ci * @size: Data size in bytes 44562306a36Sopenharmony_ci */ 44662306a36Sopenharmony_cistatic inline void set_dout_sram(struct cc_hw_desc *pdesc, u32 addr, u32 size) 44762306a36Sopenharmony_ci{ 44862306a36Sopenharmony_ci pdesc->word[2] = addr; 44962306a36Sopenharmony_ci pdesc->word[3] |= FIELD_PREP(WORD3_DOUT_DMA_MODE, DMA_SRAM) | 45062306a36Sopenharmony_ci FIELD_PREP(WORD3_DOUT_SIZE, size); 45162306a36Sopenharmony_ci} 45262306a36Sopenharmony_ci 45362306a36Sopenharmony_ci/** 45462306a36Sopenharmony_ci * set_xex_data_unit_size() - Set the data unit size for XEX mode in 45562306a36Sopenharmony_ci * data_out_addr[15:0] 45662306a36Sopenharmony_ci * 45762306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 45862306a36Sopenharmony_ci * @size: Data unit size for XEX mode 45962306a36Sopenharmony_ci */ 46062306a36Sopenharmony_cistatic inline void set_xex_data_unit_size(struct cc_hw_desc *pdesc, u32 size) 46162306a36Sopenharmony_ci{ 46262306a36Sopenharmony_ci pdesc->word[2] = size; 46362306a36Sopenharmony_ci} 46462306a36Sopenharmony_ci 46562306a36Sopenharmony_ci/** 46662306a36Sopenharmony_ci * set_multi2_num_rounds() - Set the number of rounds for Multi2 in 46762306a36Sopenharmony_ci * data_out_addr[15:0] 46862306a36Sopenharmony_ci * 46962306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 47062306a36Sopenharmony_ci * @num: Number of rounds for Multi2 47162306a36Sopenharmony_ci */ 47262306a36Sopenharmony_cistatic inline void set_multi2_num_rounds(struct cc_hw_desc *pdesc, u32 num) 47362306a36Sopenharmony_ci{ 47462306a36Sopenharmony_ci pdesc->word[2] = num; 47562306a36Sopenharmony_ci} 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_ci/** 47862306a36Sopenharmony_ci * set_flow_mode() - Set the flow mode. 47962306a36Sopenharmony_ci * 48062306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 48162306a36Sopenharmony_ci * @mode: Any one of the modes defined in [CC7x-DESC] 48262306a36Sopenharmony_ci */ 48362306a36Sopenharmony_cistatic inline void set_flow_mode(struct cc_hw_desc *pdesc, 48462306a36Sopenharmony_ci enum cc_flow_mode mode) 48562306a36Sopenharmony_ci{ 48662306a36Sopenharmony_ci pdesc->word[4] |= FIELD_PREP(WORD4_DATA_FLOW_MODE, mode); 48762306a36Sopenharmony_ci} 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_ci/** 49062306a36Sopenharmony_ci * set_cipher_mode() - Set the cipher mode. 49162306a36Sopenharmony_ci * 49262306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 49362306a36Sopenharmony_ci * @mode: Any one of the modes defined in [CC7x-DESC] 49462306a36Sopenharmony_ci */ 49562306a36Sopenharmony_cistatic inline void set_cipher_mode(struct cc_hw_desc *pdesc, int mode) 49662306a36Sopenharmony_ci{ 49762306a36Sopenharmony_ci pdesc->word[4] |= FIELD_PREP(WORD4_CIPHER_MODE, mode); 49862306a36Sopenharmony_ci} 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_ci/** 50162306a36Sopenharmony_ci * set_hash_cipher_mode() - Set the cipher mode for hash algorithms. 50262306a36Sopenharmony_ci * 50362306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 50462306a36Sopenharmony_ci * @cipher_mode: Any one of the modes defined in [CC7x-DESC] 50562306a36Sopenharmony_ci * @hash_mode: specifies which hash is being handled 50662306a36Sopenharmony_ci */ 50762306a36Sopenharmony_cistatic inline void set_hash_cipher_mode(struct cc_hw_desc *pdesc, 50862306a36Sopenharmony_ci enum drv_cipher_mode cipher_mode, 50962306a36Sopenharmony_ci enum drv_hash_mode hash_mode) 51062306a36Sopenharmony_ci{ 51162306a36Sopenharmony_ci set_cipher_mode(pdesc, cipher_mode); 51262306a36Sopenharmony_ci if (hash_mode == DRV_HASH_SM3) 51362306a36Sopenharmony_ci set_aes_xor_crypto_key(pdesc); 51462306a36Sopenharmony_ci} 51562306a36Sopenharmony_ci 51662306a36Sopenharmony_ci/** 51762306a36Sopenharmony_ci * set_cipher_config0() - Set the cipher configuration fields. 51862306a36Sopenharmony_ci * 51962306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 52062306a36Sopenharmony_ci * @mode: Any one of the modes defined in [CC7x-DESC] 52162306a36Sopenharmony_ci */ 52262306a36Sopenharmony_cistatic inline void set_cipher_config0(struct cc_hw_desc *pdesc, int mode) 52362306a36Sopenharmony_ci{ 52462306a36Sopenharmony_ci pdesc->word[4] |= FIELD_PREP(WORD4_CIPHER_CONF0, mode); 52562306a36Sopenharmony_ci} 52662306a36Sopenharmony_ci 52762306a36Sopenharmony_ci/** 52862306a36Sopenharmony_ci * set_cipher_config1() - Set the cipher configuration fields. 52962306a36Sopenharmony_ci * 53062306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 53162306a36Sopenharmony_ci * @config: Padding mode 53262306a36Sopenharmony_ci */ 53362306a36Sopenharmony_cistatic inline void set_cipher_config1(struct cc_hw_desc *pdesc, 53462306a36Sopenharmony_ci enum cc_hash_conf_pad config) 53562306a36Sopenharmony_ci{ 53662306a36Sopenharmony_ci pdesc->word[4] |= FIELD_PREP(WORD4_CIPHER_CONF1, config); 53762306a36Sopenharmony_ci} 53862306a36Sopenharmony_ci 53962306a36Sopenharmony_ci/** 54062306a36Sopenharmony_ci * set_hw_crypto_key() - Set HW key configuration fields. 54162306a36Sopenharmony_ci * 54262306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 54362306a36Sopenharmony_ci * @hw_key: The HW key slot asdefined in enum cc_hw_crypto_key 54462306a36Sopenharmony_ci */ 54562306a36Sopenharmony_cistatic inline void set_hw_crypto_key(struct cc_hw_desc *pdesc, 54662306a36Sopenharmony_ci enum cc_hw_crypto_key hw_key) 54762306a36Sopenharmony_ci{ 54862306a36Sopenharmony_ci pdesc->word[4] |= FIELD_PREP(WORD4_CIPHER_DO, 54962306a36Sopenharmony_ci (hw_key & HW_KEY_MASK_CIPHER_DO)) | 55062306a36Sopenharmony_ci FIELD_PREP(WORD4_CIPHER_CONF2, 55162306a36Sopenharmony_ci (hw_key >> HW_KEY_SHIFT_CIPHER_CFG2)); 55262306a36Sopenharmony_ci} 55362306a36Sopenharmony_ci 55462306a36Sopenharmony_ci/** 55562306a36Sopenharmony_ci * set_bytes_swap() - Set byte order of all setup-finalize descriptors. 55662306a36Sopenharmony_ci * 55762306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 55862306a36Sopenharmony_ci * @config: True to enable byte swapping 55962306a36Sopenharmony_ci */ 56062306a36Sopenharmony_cistatic inline void set_bytes_swap(struct cc_hw_desc *pdesc, bool config) 56162306a36Sopenharmony_ci{ 56262306a36Sopenharmony_ci pdesc->word[4] |= FIELD_PREP(WORD4_BYTES_SWAP, config); 56362306a36Sopenharmony_ci} 56462306a36Sopenharmony_ci 56562306a36Sopenharmony_ci/** 56662306a36Sopenharmony_ci * set_cmac_size0_mode() - Set CMAC_SIZE0 mode. 56762306a36Sopenharmony_ci * 56862306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 56962306a36Sopenharmony_ci */ 57062306a36Sopenharmony_cistatic inline void set_cmac_size0_mode(struct cc_hw_desc *pdesc) 57162306a36Sopenharmony_ci{ 57262306a36Sopenharmony_ci pdesc->word[4] |= FIELD_PREP(WORD4_CMAC_SIZE0, 1); 57362306a36Sopenharmony_ci} 57462306a36Sopenharmony_ci 57562306a36Sopenharmony_ci/** 57662306a36Sopenharmony_ci * set_key_size() - Set key size descriptor field. 57762306a36Sopenharmony_ci * 57862306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 57962306a36Sopenharmony_ci * @size: Key size in bytes (NOT size code) 58062306a36Sopenharmony_ci */ 58162306a36Sopenharmony_cistatic inline void set_key_size(struct cc_hw_desc *pdesc, u32 size) 58262306a36Sopenharmony_ci{ 58362306a36Sopenharmony_ci pdesc->word[4] |= FIELD_PREP(WORD4_KEY_SIZE, size); 58462306a36Sopenharmony_ci} 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_ci/** 58762306a36Sopenharmony_ci * set_key_size_aes() - Set AES key size. 58862306a36Sopenharmony_ci * 58962306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 59062306a36Sopenharmony_ci * @size: Key size in bytes (NOT size code) 59162306a36Sopenharmony_ci */ 59262306a36Sopenharmony_cistatic inline void set_key_size_aes(struct cc_hw_desc *pdesc, u32 size) 59362306a36Sopenharmony_ci{ 59462306a36Sopenharmony_ci set_key_size(pdesc, ((size >> 3) - 2)); 59562306a36Sopenharmony_ci} 59662306a36Sopenharmony_ci 59762306a36Sopenharmony_ci/** 59862306a36Sopenharmony_ci * set_key_size_des() - Set DES key size. 59962306a36Sopenharmony_ci * 60062306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 60162306a36Sopenharmony_ci * @size: Key size in bytes (NOT size code) 60262306a36Sopenharmony_ci */ 60362306a36Sopenharmony_cistatic inline void set_key_size_des(struct cc_hw_desc *pdesc, u32 size) 60462306a36Sopenharmony_ci{ 60562306a36Sopenharmony_ci set_key_size(pdesc, ((size >> 3) - 1)); 60662306a36Sopenharmony_ci} 60762306a36Sopenharmony_ci 60862306a36Sopenharmony_ci/** 60962306a36Sopenharmony_ci * set_setup_mode() - Set the descriptor setup mode 61062306a36Sopenharmony_ci * 61162306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 61262306a36Sopenharmony_ci * @mode: Any one of the setup modes defined in [CC7x-DESC] 61362306a36Sopenharmony_ci */ 61462306a36Sopenharmony_cistatic inline void set_setup_mode(struct cc_hw_desc *pdesc, 61562306a36Sopenharmony_ci enum cc_setup_op mode) 61662306a36Sopenharmony_ci{ 61762306a36Sopenharmony_ci pdesc->word[4] |= FIELD_PREP(WORD4_SETUP_OPERATION, mode); 61862306a36Sopenharmony_ci} 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci/** 62162306a36Sopenharmony_ci * set_cipher_do() - Set the descriptor cipher DO 62262306a36Sopenharmony_ci * 62362306a36Sopenharmony_ci * @pdesc: Pointer to HW descriptor struct 62462306a36Sopenharmony_ci * @config: Any one of the cipher do defined in [CC7x-DESC] 62562306a36Sopenharmony_ci */ 62662306a36Sopenharmony_cistatic inline void set_cipher_do(struct cc_hw_desc *pdesc, 62762306a36Sopenharmony_ci enum cc_hash_cipher_pad config) 62862306a36Sopenharmony_ci{ 62962306a36Sopenharmony_ci pdesc->word[4] |= FIELD_PREP(WORD4_CIPHER_DO, 63062306a36Sopenharmony_ci (config & HW_KEY_MASK_CIPHER_DO)); 63162306a36Sopenharmony_ci} 63262306a36Sopenharmony_ci 63362306a36Sopenharmony_ci#endif /*__CC_HW_QUEUE_DEFS_H__*/ 634