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