162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* Copyright (c) 2016-2017 HiSilicon Limited. */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#ifndef _SEC_DRV_H_ 562306a36Sopenharmony_ci#define _SEC_DRV_H_ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <crypto/algapi.h> 862306a36Sopenharmony_ci#include <linux/kfifo.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#define SEC_MAX_SGE_NUM 64 1162306a36Sopenharmony_ci#define SEC_HW_RING_NUM 3 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define SEC_CMD_RING 0 1462306a36Sopenharmony_ci#define SEC_OUTORDER_RING 1 1562306a36Sopenharmony_ci#define SEC_DBG_RING 2 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/* A reasonable length to balance memory use against flexibility */ 1862306a36Sopenharmony_ci#define SEC_QUEUE_LEN 512 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define SEC_MAX_SGE_NUM 64 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cistruct sec_bd_info { 2362306a36Sopenharmony_ci#define SEC_BD_W0_T_LEN_M GENMASK(4, 0) 2462306a36Sopenharmony_ci#define SEC_BD_W0_T_LEN_S 0 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define SEC_BD_W0_C_WIDTH_M GENMASK(6, 5) 2762306a36Sopenharmony_ci#define SEC_BD_W0_C_WIDTH_S 5 2862306a36Sopenharmony_ci#define SEC_C_WIDTH_AES_128BIT 0 2962306a36Sopenharmony_ci#define SEC_C_WIDTH_AES_8BIT 1 3062306a36Sopenharmony_ci#define SEC_C_WIDTH_AES_1BIT 2 3162306a36Sopenharmony_ci#define SEC_C_WIDTH_DES_64BIT 0 3262306a36Sopenharmony_ci#define SEC_C_WIDTH_DES_8BIT 1 3362306a36Sopenharmony_ci#define SEC_C_WIDTH_DES_1BIT 2 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#define SEC_BD_W0_C_MODE_M GENMASK(9, 7) 3662306a36Sopenharmony_ci#define SEC_BD_W0_C_MODE_S 7 3762306a36Sopenharmony_ci#define SEC_C_MODE_ECB 0 3862306a36Sopenharmony_ci#define SEC_C_MODE_CBC 1 3962306a36Sopenharmony_ci#define SEC_C_MODE_CTR 4 4062306a36Sopenharmony_ci#define SEC_C_MODE_CCM 5 4162306a36Sopenharmony_ci#define SEC_C_MODE_GCM 6 4262306a36Sopenharmony_ci#define SEC_C_MODE_XTS 7 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#define SEC_BD_W0_SEQ BIT(10) 4562306a36Sopenharmony_ci#define SEC_BD_W0_DE BIT(11) 4662306a36Sopenharmony_ci#define SEC_BD_W0_DAT_SKIP_M GENMASK(13, 12) 4762306a36Sopenharmony_ci#define SEC_BD_W0_DAT_SKIP_S 12 4862306a36Sopenharmony_ci#define SEC_BD_W0_C_GRAN_SIZE_19_16_M GENMASK(17, 14) 4962306a36Sopenharmony_ci#define SEC_BD_W0_C_GRAN_SIZE_19_16_S 14 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci#define SEC_BD_W0_CIPHER_M GENMASK(19, 18) 5262306a36Sopenharmony_ci#define SEC_BD_W0_CIPHER_S 18 5362306a36Sopenharmony_ci#define SEC_CIPHER_NULL 0 5462306a36Sopenharmony_ci#define SEC_CIPHER_ENCRYPT 1 5562306a36Sopenharmony_ci#define SEC_CIPHER_DECRYPT 2 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci#define SEC_BD_W0_AUTH_M GENMASK(21, 20) 5862306a36Sopenharmony_ci#define SEC_BD_W0_AUTH_S 20 5962306a36Sopenharmony_ci#define SEC_AUTH_NULL 0 6062306a36Sopenharmony_ci#define SEC_AUTH_MAC 1 6162306a36Sopenharmony_ci#define SEC_AUTH_VERIF 2 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci#define SEC_BD_W0_AI_GEN BIT(22) 6462306a36Sopenharmony_ci#define SEC_BD_W0_CI_GEN BIT(23) 6562306a36Sopenharmony_ci#define SEC_BD_W0_NO_HPAD BIT(24) 6662306a36Sopenharmony_ci#define SEC_BD_W0_HM_M GENMASK(26, 25) 6762306a36Sopenharmony_ci#define SEC_BD_W0_HM_S 25 6862306a36Sopenharmony_ci#define SEC_BD_W0_ICV_OR_SKEY_EN_M GENMASK(28, 27) 6962306a36Sopenharmony_ci#define SEC_BD_W0_ICV_OR_SKEY_EN_S 27 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/* Multi purpose field - gran size bits for send, flag for recv */ 7262306a36Sopenharmony_ci#define SEC_BD_W0_FLAG_M GENMASK(30, 29) 7362306a36Sopenharmony_ci#define SEC_BD_W0_C_GRAN_SIZE_21_20_M GENMASK(30, 29) 7462306a36Sopenharmony_ci#define SEC_BD_W0_FLAG_S 29 7562306a36Sopenharmony_ci#define SEC_BD_W0_C_GRAN_SIZE_21_20_S 29 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci#define SEC_BD_W0_DONE BIT(31) 7862306a36Sopenharmony_ci u32 w0; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci#define SEC_BD_W1_AUTH_GRAN_SIZE_M GENMASK(21, 0) 8162306a36Sopenharmony_ci#define SEC_BD_W1_AUTH_GRAN_SIZE_S 0 8262306a36Sopenharmony_ci#define SEC_BD_W1_M_KEY_EN BIT(22) 8362306a36Sopenharmony_ci#define SEC_BD_W1_BD_INVALID BIT(23) 8462306a36Sopenharmony_ci#define SEC_BD_W1_ADDR_TYPE BIT(24) 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci#define SEC_BD_W1_A_ALG_M GENMASK(28, 25) 8762306a36Sopenharmony_ci#define SEC_BD_W1_A_ALG_S 25 8862306a36Sopenharmony_ci#define SEC_A_ALG_SHA1 0 8962306a36Sopenharmony_ci#define SEC_A_ALG_SHA256 1 9062306a36Sopenharmony_ci#define SEC_A_ALG_MD5 2 9162306a36Sopenharmony_ci#define SEC_A_ALG_SHA224 3 9262306a36Sopenharmony_ci#define SEC_A_ALG_HMAC_SHA1 8 9362306a36Sopenharmony_ci#define SEC_A_ALG_HMAC_SHA224 10 9462306a36Sopenharmony_ci#define SEC_A_ALG_HMAC_SHA256 11 9562306a36Sopenharmony_ci#define SEC_A_ALG_HMAC_MD5 12 9662306a36Sopenharmony_ci#define SEC_A_ALG_AES_XCBC 13 9762306a36Sopenharmony_ci#define SEC_A_ALG_AES_CMAC 14 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci#define SEC_BD_W1_C_ALG_M GENMASK(31, 29) 10062306a36Sopenharmony_ci#define SEC_BD_W1_C_ALG_S 29 10162306a36Sopenharmony_ci#define SEC_C_ALG_DES 0 10262306a36Sopenharmony_ci#define SEC_C_ALG_3DES 1 10362306a36Sopenharmony_ci#define SEC_C_ALG_AES 2 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci u32 w1; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci#define SEC_BD_W2_C_GRAN_SIZE_15_0_M GENMASK(15, 0) 10862306a36Sopenharmony_ci#define SEC_BD_W2_C_GRAN_SIZE_15_0_S 0 10962306a36Sopenharmony_ci#define SEC_BD_W2_GRAN_NUM_M GENMASK(31, 16) 11062306a36Sopenharmony_ci#define SEC_BD_W2_GRAN_NUM_S 16 11162306a36Sopenharmony_ci u32 w2; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci#define SEC_BD_W3_AUTH_LEN_OFFSET_M GENMASK(9, 0) 11462306a36Sopenharmony_ci#define SEC_BD_W3_AUTH_LEN_OFFSET_S 0 11562306a36Sopenharmony_ci#define SEC_BD_W3_CIPHER_LEN_OFFSET_M GENMASK(19, 10) 11662306a36Sopenharmony_ci#define SEC_BD_W3_CIPHER_LEN_OFFSET_S 10 11762306a36Sopenharmony_ci#define SEC_BD_W3_MAC_LEN_M GENMASK(24, 20) 11862306a36Sopenharmony_ci#define SEC_BD_W3_MAC_LEN_S 20 11962306a36Sopenharmony_ci#define SEC_BD_W3_A_KEY_LEN_M GENMASK(29, 25) 12062306a36Sopenharmony_ci#define SEC_BD_W3_A_KEY_LEN_S 25 12162306a36Sopenharmony_ci#define SEC_BD_W3_C_KEY_LEN_M GENMASK(31, 30) 12262306a36Sopenharmony_ci#define SEC_BD_W3_C_KEY_LEN_S 30 12362306a36Sopenharmony_ci#define SEC_KEY_LEN_AES_128 0 12462306a36Sopenharmony_ci#define SEC_KEY_LEN_AES_192 1 12562306a36Sopenharmony_ci#define SEC_KEY_LEN_AES_256 2 12662306a36Sopenharmony_ci#define SEC_KEY_LEN_DES 1 12762306a36Sopenharmony_ci#define SEC_KEY_LEN_3DES_3_KEY 1 12862306a36Sopenharmony_ci#define SEC_KEY_LEN_3DES_2_KEY 3 12962306a36Sopenharmony_ci u32 w3; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci /* W4,5 */ 13262306a36Sopenharmony_ci union { 13362306a36Sopenharmony_ci u32 authkey_addr_lo; 13462306a36Sopenharmony_ci u32 authiv_addr_lo; 13562306a36Sopenharmony_ci }; 13662306a36Sopenharmony_ci union { 13762306a36Sopenharmony_ci u32 authkey_addr_hi; 13862306a36Sopenharmony_ci u32 authiv_addr_hi; 13962306a36Sopenharmony_ci }; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci /* W6,7 */ 14262306a36Sopenharmony_ci u32 cipher_key_addr_lo; 14362306a36Sopenharmony_ci u32 cipher_key_addr_hi; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci /* W8,9 */ 14662306a36Sopenharmony_ci u32 cipher_iv_addr_lo; 14762306a36Sopenharmony_ci u32 cipher_iv_addr_hi; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci /* W10,11 */ 15062306a36Sopenharmony_ci u32 data_addr_lo; 15162306a36Sopenharmony_ci u32 data_addr_hi; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci /* W12,13 */ 15462306a36Sopenharmony_ci u32 mac_addr_lo; 15562306a36Sopenharmony_ci u32 mac_addr_hi; 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci /* W14,15 */ 15862306a36Sopenharmony_ci u32 cipher_destin_addr_lo; 15962306a36Sopenharmony_ci u32 cipher_destin_addr_hi; 16062306a36Sopenharmony_ci}; 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_cienum sec_mem_region { 16362306a36Sopenharmony_ci SEC_COMMON = 0, 16462306a36Sopenharmony_ci SEC_SAA, 16562306a36Sopenharmony_ci SEC_NUM_ADDR_REGIONS 16662306a36Sopenharmony_ci}; 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci#define SEC_NAME_SIZE 64 16962306a36Sopenharmony_ci#define SEC_Q_NUM 16 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci/** 17362306a36Sopenharmony_ci * struct sec_queue_ring_cmd - store information about a SEC HW cmd ring 17462306a36Sopenharmony_ci * @used: Local counter used to cheaply establish if the ring is empty. 17562306a36Sopenharmony_ci * @lock: Protect against simultaneous adjusting of the read and write pointers. 17662306a36Sopenharmony_ci * @vaddr: Virtual address for the ram pages used for the ring. 17762306a36Sopenharmony_ci * @paddr: Physical address of the dma mapped region of ram used for the ring. 17862306a36Sopenharmony_ci * @callback: Callback function called on a ring element completing. 17962306a36Sopenharmony_ci */ 18062306a36Sopenharmony_cistruct sec_queue_ring_cmd { 18162306a36Sopenharmony_ci atomic_t used; 18262306a36Sopenharmony_ci struct mutex lock; 18362306a36Sopenharmony_ci struct sec_bd_info *vaddr; 18462306a36Sopenharmony_ci dma_addr_t paddr; 18562306a36Sopenharmony_ci void (*callback)(struct sec_bd_info *resp, void *ctx); 18662306a36Sopenharmony_ci}; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_cistruct sec_debug_bd_info; 18962306a36Sopenharmony_cistruct sec_queue_ring_db { 19062306a36Sopenharmony_ci struct sec_debug_bd_info *vaddr; 19162306a36Sopenharmony_ci dma_addr_t paddr; 19262306a36Sopenharmony_ci}; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_cistruct sec_out_bd_info; 19562306a36Sopenharmony_cistruct sec_queue_ring_cq { 19662306a36Sopenharmony_ci struct sec_out_bd_info *vaddr; 19762306a36Sopenharmony_ci dma_addr_t paddr; 19862306a36Sopenharmony_ci}; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_cistruct sec_dev_info; 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_cienum sec_cipher_alg { 20362306a36Sopenharmony_ci SEC_C_DES_ECB_64, 20462306a36Sopenharmony_ci SEC_C_DES_CBC_64, 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci SEC_C_3DES_ECB_192_3KEY, 20762306a36Sopenharmony_ci SEC_C_3DES_ECB_192_2KEY, 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci SEC_C_3DES_CBC_192_3KEY, 21062306a36Sopenharmony_ci SEC_C_3DES_CBC_192_2KEY, 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci SEC_C_AES_ECB_128, 21362306a36Sopenharmony_ci SEC_C_AES_ECB_192, 21462306a36Sopenharmony_ci SEC_C_AES_ECB_256, 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci SEC_C_AES_CBC_128, 21762306a36Sopenharmony_ci SEC_C_AES_CBC_192, 21862306a36Sopenharmony_ci SEC_C_AES_CBC_256, 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci SEC_C_AES_CTR_128, 22162306a36Sopenharmony_ci SEC_C_AES_CTR_192, 22262306a36Sopenharmony_ci SEC_C_AES_CTR_256, 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci SEC_C_AES_XTS_128, 22562306a36Sopenharmony_ci SEC_C_AES_XTS_256, 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci SEC_C_NULL, 22862306a36Sopenharmony_ci}; 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci/** 23162306a36Sopenharmony_ci * struct sec_alg_tfm_ctx - hardware specific tranformation context 23262306a36Sopenharmony_ci * @cipher_alg: Cipher algorithm enabled include encryption mode. 23362306a36Sopenharmony_ci * @key: Key storage if required. 23462306a36Sopenharmony_ci * @pkey: DMA address for the key storage. 23562306a36Sopenharmony_ci * @req_template: Request template to save time on setup. 23662306a36Sopenharmony_ci * @queue: The hardware queue associated with this tfm context. 23762306a36Sopenharmony_ci * @lock: Protect key and pkey to ensure they are consistent 23862306a36Sopenharmony_ci * @auth_buf: Current context buffer for auth operations. 23962306a36Sopenharmony_ci * @backlog: The backlog queue used for cases where our buffers aren't 24062306a36Sopenharmony_ci * large enough. 24162306a36Sopenharmony_ci */ 24262306a36Sopenharmony_cistruct sec_alg_tfm_ctx { 24362306a36Sopenharmony_ci enum sec_cipher_alg cipher_alg; 24462306a36Sopenharmony_ci u8 *key; 24562306a36Sopenharmony_ci dma_addr_t pkey; 24662306a36Sopenharmony_ci struct sec_bd_info req_template; 24762306a36Sopenharmony_ci struct sec_queue *queue; 24862306a36Sopenharmony_ci struct mutex lock; 24962306a36Sopenharmony_ci u8 *auth_buf; 25062306a36Sopenharmony_ci struct list_head backlog; 25162306a36Sopenharmony_ci}; 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci/** 25462306a36Sopenharmony_ci * struct sec_request - data associate with a single crypto request 25562306a36Sopenharmony_ci * @elements: List of subparts of this request (hardware size restriction) 25662306a36Sopenharmony_ci * @num_elements: The number of subparts (used as an optimization) 25762306a36Sopenharmony_ci * @lock: Protect elements of this structure against concurrent change. 25862306a36Sopenharmony_ci * @tfm_ctx: hardware specific context. 25962306a36Sopenharmony_ci * @len_in: length of in sgl from upper layers 26062306a36Sopenharmony_ci * @len_out: length of out sgl from upper layers 26162306a36Sopenharmony_ci * @dma_iv: initialization vector - phsyical address 26262306a36Sopenharmony_ci * @err: store used to track errors across subelements of this request. 26362306a36Sopenharmony_ci * @req_base: pointer to base element of associate crypto context. 26462306a36Sopenharmony_ci * This is needed to allow shared handling skcipher, ahash etc. 26562306a36Sopenharmony_ci * @cb: completion callback. 26662306a36Sopenharmony_ci * @backlog_head: list head to allow backlog maintenance. 26762306a36Sopenharmony_ci * 26862306a36Sopenharmony_ci * The hardware is limited in the maximum size of data that it can 26962306a36Sopenharmony_ci * process from a single BD. Typically this is fairly large (32MB) 27062306a36Sopenharmony_ci * but still requires the complexity of splitting the incoming 27162306a36Sopenharmony_ci * skreq up into a number of elements complete with appropriate 27262306a36Sopenharmony_ci * iv chaining. 27362306a36Sopenharmony_ci */ 27462306a36Sopenharmony_cistruct sec_request { 27562306a36Sopenharmony_ci struct list_head elements; 27662306a36Sopenharmony_ci int num_elements; 27762306a36Sopenharmony_ci struct mutex lock; 27862306a36Sopenharmony_ci struct sec_alg_tfm_ctx *tfm_ctx; 27962306a36Sopenharmony_ci int len_in; 28062306a36Sopenharmony_ci int len_out; 28162306a36Sopenharmony_ci dma_addr_t dma_iv; 28262306a36Sopenharmony_ci int err; 28362306a36Sopenharmony_ci struct crypto_async_request *req_base; 28462306a36Sopenharmony_ci void (*cb)(struct sec_bd_info *resp, struct crypto_async_request *req); 28562306a36Sopenharmony_ci struct list_head backlog_head; 28662306a36Sopenharmony_ci}; 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci/** 28962306a36Sopenharmony_ci * struct sec_request_el - A subpart of a request. 29062306a36Sopenharmony_ci * @head: allow us to attach this to the list in the sec_request 29162306a36Sopenharmony_ci * @req: hardware block descriptor corresponding to this request subpart 29262306a36Sopenharmony_ci * @in: hardware sgl for input - virtual address 29362306a36Sopenharmony_ci * @dma_in: hardware sgl for input - physical address 29462306a36Sopenharmony_ci * @sgl_in: scatterlist for this request subpart 29562306a36Sopenharmony_ci * @out: hardware sgl for output - virtual address 29662306a36Sopenharmony_ci * @dma_out: hardware sgl for output - physical address 29762306a36Sopenharmony_ci * @sgl_out: scatterlist for this request subpart 29862306a36Sopenharmony_ci * @sec_req: The request which this subpart forms a part of 29962306a36Sopenharmony_ci * @el_length: Number of bytes in this subpart. Needed to locate 30062306a36Sopenharmony_ci * last ivsize chunk for iv chaining. 30162306a36Sopenharmony_ci */ 30262306a36Sopenharmony_cistruct sec_request_el { 30362306a36Sopenharmony_ci struct list_head head; 30462306a36Sopenharmony_ci struct sec_bd_info req; 30562306a36Sopenharmony_ci struct sec_hw_sgl *in; 30662306a36Sopenharmony_ci dma_addr_t dma_in; 30762306a36Sopenharmony_ci struct scatterlist *sgl_in; 30862306a36Sopenharmony_ci struct sec_hw_sgl *out; 30962306a36Sopenharmony_ci dma_addr_t dma_out; 31062306a36Sopenharmony_ci struct scatterlist *sgl_out; 31162306a36Sopenharmony_ci struct sec_request *sec_req; 31262306a36Sopenharmony_ci size_t el_length; 31362306a36Sopenharmony_ci}; 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_ci/** 31662306a36Sopenharmony_ci * struct sec_queue - All the information about a HW queue 31762306a36Sopenharmony_ci * @dev_info: The parent SEC device to which this queue belongs. 31862306a36Sopenharmony_ci * @task_irq: Completion interrupt for the queue. 31962306a36Sopenharmony_ci * @name: Human readable queue description also used as irq name. 32062306a36Sopenharmony_ci * @ring: The several HW rings associated with one queue. 32162306a36Sopenharmony_ci * @regs: The iomapped device registers 32262306a36Sopenharmony_ci * @queue_id: Index of the queue used for naming and resource selection. 32362306a36Sopenharmony_ci * @in_use: Flag to say if the queue is in use. 32462306a36Sopenharmony_ci * @expected: The next expected element to finish assuming we were in order. 32562306a36Sopenharmony_ci * @uprocessed: A bitmap to track which OoO elements are done but not handled. 32662306a36Sopenharmony_ci * @softqueue: A software queue used when chaining requirements prevent direct 32762306a36Sopenharmony_ci * use of the hardware queues. 32862306a36Sopenharmony_ci * @havesoftqueue: A flag to say we have a queues - as we may need one for the 32962306a36Sopenharmony_ci * current mode. 33062306a36Sopenharmony_ci * @queuelock: Protect the soft queue from concurrent changes to avoid some 33162306a36Sopenharmony_ci * potential loss of data races. 33262306a36Sopenharmony_ci * @shadow: Pointers back to the shadow copy of the hardware ring element 33362306a36Sopenharmony_ci * need because we can't store any context reference in the bd element. 33462306a36Sopenharmony_ci */ 33562306a36Sopenharmony_cistruct sec_queue { 33662306a36Sopenharmony_ci struct sec_dev_info *dev_info; 33762306a36Sopenharmony_ci int task_irq; 33862306a36Sopenharmony_ci char name[SEC_NAME_SIZE]; 33962306a36Sopenharmony_ci struct sec_queue_ring_cmd ring_cmd; 34062306a36Sopenharmony_ci struct sec_queue_ring_cq ring_cq; 34162306a36Sopenharmony_ci struct sec_queue_ring_db ring_db; 34262306a36Sopenharmony_ci void __iomem *regs; 34362306a36Sopenharmony_ci u32 queue_id; 34462306a36Sopenharmony_ci bool in_use; 34562306a36Sopenharmony_ci int expected; 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci DECLARE_BITMAP(unprocessed, SEC_QUEUE_LEN); 34862306a36Sopenharmony_ci DECLARE_KFIFO_PTR(softqueue, typeof(struct sec_request_el *)); 34962306a36Sopenharmony_ci bool havesoftqueue; 35062306a36Sopenharmony_ci spinlock_t queuelock; 35162306a36Sopenharmony_ci void *shadow[SEC_QUEUE_LEN]; 35262306a36Sopenharmony_ci}; 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci/** 35562306a36Sopenharmony_ci * struct sec_hw_sge: Track each of the 64 element SEC HW SGL entries 35662306a36Sopenharmony_ci * @buf: The IOV dma address for this entry. 35762306a36Sopenharmony_ci * @len: Length of this IOV. 35862306a36Sopenharmony_ci * @pad: Reserved space. 35962306a36Sopenharmony_ci */ 36062306a36Sopenharmony_cistruct sec_hw_sge { 36162306a36Sopenharmony_ci dma_addr_t buf; 36262306a36Sopenharmony_ci unsigned int len; 36362306a36Sopenharmony_ci unsigned int pad; 36462306a36Sopenharmony_ci}; 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci/** 36762306a36Sopenharmony_ci * struct sec_hw_sgl: One hardware SGL entry. 36862306a36Sopenharmony_ci * @next_sgl: The next entry if we need to chain dma address. Null if last. 36962306a36Sopenharmony_ci * @entry_sum_in_chain: The full count of SGEs - only matters for first SGL. 37062306a36Sopenharmony_ci * @entry_sum_in_sgl: The number of SGEs in this SGL element. 37162306a36Sopenharmony_ci * @flag: Unused in skciphers. 37262306a36Sopenharmony_ci * @serial_num: Unsued in skciphers. 37362306a36Sopenharmony_ci * @cpuid: Currently unused. 37462306a36Sopenharmony_ci * @data_bytes_in_sgl: Count of bytes from all SGEs in this SGL. 37562306a36Sopenharmony_ci * @next: Virtual address used to stash the next sgl - useful in completion. 37662306a36Sopenharmony_ci * @reserved: A reserved field not currently used. 37762306a36Sopenharmony_ci * @sge_entries: The (up to) 64 Scatter Gather Entries, representing IOVs. 37862306a36Sopenharmony_ci * @node: Currently unused. 37962306a36Sopenharmony_ci */ 38062306a36Sopenharmony_cistruct sec_hw_sgl { 38162306a36Sopenharmony_ci dma_addr_t next_sgl; 38262306a36Sopenharmony_ci u16 entry_sum_in_chain; 38362306a36Sopenharmony_ci u16 entry_sum_in_sgl; 38462306a36Sopenharmony_ci u32 flag; 38562306a36Sopenharmony_ci u64 serial_num; 38662306a36Sopenharmony_ci u32 cpuid; 38762306a36Sopenharmony_ci u32 data_bytes_in_sgl; 38862306a36Sopenharmony_ci struct sec_hw_sgl *next; 38962306a36Sopenharmony_ci u64 reserved; 39062306a36Sopenharmony_ci struct sec_hw_sge sge_entries[SEC_MAX_SGE_NUM]; 39162306a36Sopenharmony_ci u8 node[16]; 39262306a36Sopenharmony_ci}; 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_cistruct dma_pool; 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci/** 39762306a36Sopenharmony_ci * struct sec_dev_info: The full SEC unit comprising queues and processors. 39862306a36Sopenharmony_ci * @sec_id: Index used to track which SEC this is when more than one is present. 39962306a36Sopenharmony_ci * @num_saas: The number of backed processors enabled. 40062306a36Sopenharmony_ci * @regs: iomapped register regions shared by whole SEC unit. 40162306a36Sopenharmony_ci * @dev_lock: Protects concurrent queue allocation / freeing for the SEC. 40262306a36Sopenharmony_ci * @queues: The 16 queues that this SEC instance provides. 40362306a36Sopenharmony_ci * @dev: Device pointer. 40462306a36Sopenharmony_ci * @hw_sgl_pool: DMA pool used to mimise mapping for the scatter gather lists. 40562306a36Sopenharmony_ci */ 40662306a36Sopenharmony_cistruct sec_dev_info { 40762306a36Sopenharmony_ci int sec_id; 40862306a36Sopenharmony_ci int num_saas; 40962306a36Sopenharmony_ci void __iomem *regs[SEC_NUM_ADDR_REGIONS]; 41062306a36Sopenharmony_ci struct mutex dev_lock; 41162306a36Sopenharmony_ci int queues_in_use; 41262306a36Sopenharmony_ci struct sec_queue queues[SEC_Q_NUM]; 41362306a36Sopenharmony_ci struct device *dev; 41462306a36Sopenharmony_ci struct dma_pool *hw_sgl_pool; 41562306a36Sopenharmony_ci}; 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ciint sec_queue_send(struct sec_queue *queue, struct sec_bd_info *msg, void *ctx); 41862306a36Sopenharmony_cibool sec_queue_can_enqueue(struct sec_queue *queue, int num); 41962306a36Sopenharmony_ciint sec_queue_stop_release(struct sec_queue *queue); 42062306a36Sopenharmony_cistruct sec_queue *sec_queue_alloc_start_safe(void); 42162306a36Sopenharmony_cibool sec_queue_empty(struct sec_queue *queue); 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_ci/* Algorithm specific elements from sec_algs.c */ 42462306a36Sopenharmony_civoid sec_alg_callback(struct sec_bd_info *resp, void *ctx); 42562306a36Sopenharmony_ciint sec_algs_register(void); 42662306a36Sopenharmony_civoid sec_algs_unregister(void); 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci#endif /* _SEC_DRV_H_ */ 429