1416d8220SZaibo Xu /* SPDX-License-Identifier: GPL-2.0 */
2416d8220SZaibo Xu /* Copyright (c) 2019 HiSilicon Limited. */
3416d8220SZaibo Xu 
4416d8220SZaibo Xu #ifndef __HISI_SEC_V2_H
5416d8220SZaibo Xu #define __HISI_SEC_V2_H
6416d8220SZaibo Xu 
7ff5812e0SShameer Kolothum #include <linux/hisi_acc_qm.h>
8416d8220SZaibo Xu #include "sec_crypto.h"
9416d8220SZaibo Xu 
10a181647cSZaibo Xu /* Algorithm resource per hardware SEC queue */
11a181647cSZaibo Xu struct sec_alg_res {
1274b58db8SLongfang Liu 	u8 *pbuf;
1374b58db8SLongfang Liu 	dma_addr_t pbuf_dma;
14416d8220SZaibo Xu 	u8 *c_ivin;
15416d8220SZaibo Xu 	dma_addr_t c_ivin_dma;
16c16a70c1SKai Ye 	u8 *a_ivin;
17c16a70c1SKai Ye 	dma_addr_t a_ivin_dma;
182f072d75SZaibo Xu 	u8 *out_mac;
192f072d75SZaibo Xu 	dma_addr_t out_mac_dma;
20129a9f34SWeili Qian 	u16 depth;
21416d8220SZaibo Xu };
22416d8220SZaibo Xu 
23416d8220SZaibo Xu /* Cipher request of SEC private */
24416d8220SZaibo Xu struct sec_cipher_req {
25416d8220SZaibo Xu 	struct hisi_acc_hw_sgl *c_out;
26416d8220SZaibo Xu 	dma_addr_t c_out_dma;
272514f559SLongfang Liu 	u8 *c_ivin;
282514f559SLongfang Liu 	dma_addr_t c_ivin_dma;
29416d8220SZaibo Xu 	struct skcipher_request *sk_req;
30416d8220SZaibo Xu 	u32 c_len;
31416d8220SZaibo Xu 	bool encrypt;
32416d8220SZaibo Xu };
33416d8220SZaibo Xu 
342f072d75SZaibo Xu struct sec_aead_req {
352f072d75SZaibo Xu 	u8 *out_mac;
362f072d75SZaibo Xu 	dma_addr_t out_mac_dma;
37c16a70c1SKai Ye 	u8 *a_ivin;
38c16a70c1SKai Ye 	dma_addr_t a_ivin_dma;
392f072d75SZaibo Xu 	struct aead_request *aead_req;
402f072d75SZaibo Xu };
412f072d75SZaibo Xu 
42416d8220SZaibo Xu /* SEC request of Crypto */
43416d8220SZaibo Xu struct sec_req {
44d5c1477bSKai Ye 	union {
45416d8220SZaibo Xu 		struct sec_sqe sec_sqe;
46d5c1477bSKai Ye 		struct sec_sqe3 sec_sqe3;
47d5c1477bSKai Ye 	};
48416d8220SZaibo Xu 	struct sec_ctx *ctx;
49416d8220SZaibo Xu 	struct sec_qp_ctx *qp_ctx;
50416d8220SZaibo Xu 
519039878aSKai Ye 	/**
529039878aSKai Ye 	 * Common parameter of the SEC request.
539039878aSKai Ye 	 */
549039878aSKai Ye 	struct hisi_acc_hw_sgl *in;
559039878aSKai Ye 	dma_addr_t in_dma;
56416d8220SZaibo Xu 	struct sec_cipher_req c_req;
572f072d75SZaibo Xu 	struct sec_aead_req aead_req;
589597efc3SKai Ye 	struct list_head backlog_head;
592f072d75SZaibo Xu 
60416d8220SZaibo Xu 	int err_type;
61416d8220SZaibo Xu 	int req_id;
62a44dce50SLongfang Liu 	u32 flag;
63416d8220SZaibo Xu 
64416d8220SZaibo Xu 	/* Status of the SEC request */
65ca0d158dSZaibo Xu 	bool fake_busy;
6674b58db8SLongfang Liu 	bool use_pbuf;
67416d8220SZaibo Xu };
68416d8220SZaibo Xu 
69416d8220SZaibo Xu /**
70416d8220SZaibo Xu  * struct sec_req_op - Operations for SEC request
71416d8220SZaibo Xu  * @buf_map: DMA map the SGL buffers of the request
72416d8220SZaibo Xu  * @buf_unmap: DMA unmap the SGL buffers of the request
73416d8220SZaibo Xu  * @bd_fill: Fill the SEC queue BD
74416d8220SZaibo Xu  * @bd_send: Send the SEC BD into the hardware queue
75416d8220SZaibo Xu  * @callback: Call back for the request
76416d8220SZaibo Xu  * @process: Main processing logic of Skcipher
77416d8220SZaibo Xu  */
78416d8220SZaibo Xu struct sec_req_op {
79416d8220SZaibo Xu 	int (*buf_map)(struct sec_ctx *ctx, struct sec_req *req);
80416d8220SZaibo Xu 	void (*buf_unmap)(struct sec_ctx *ctx, struct sec_req *req);
81416d8220SZaibo Xu 	void (*do_transfer)(struct sec_ctx *ctx, struct sec_req *req);
82416d8220SZaibo Xu 	int (*bd_fill)(struct sec_ctx *ctx, struct sec_req *req);
83416d8220SZaibo Xu 	int (*bd_send)(struct sec_ctx *ctx, struct sec_req *req);
84310ea0acSZaibo Xu 	void (*callback)(struct sec_ctx *ctx, struct sec_req *req, int err);
85416d8220SZaibo Xu 	int (*process)(struct sec_ctx *ctx, struct sec_req *req);
86416d8220SZaibo Xu };
87416d8220SZaibo Xu 
882f072d75SZaibo Xu /* SEC auth context */
892f072d75SZaibo Xu struct sec_auth_ctx {
902f072d75SZaibo Xu 	dma_addr_t a_key_dma;
912f072d75SZaibo Xu 	u8 *a_key;
922f072d75SZaibo Xu 	u8 a_key_len;
932f072d75SZaibo Xu 	u8 mac_len;
942f072d75SZaibo Xu 	u8 a_alg;
956c46a329SKai Ye 	bool fallback;
962f072d75SZaibo Xu 	struct crypto_shash *hash_tfm;
976c46a329SKai Ye 	struct crypto_aead *fallback_aead_tfm;
982f072d75SZaibo Xu };
992f072d75SZaibo Xu 
100416d8220SZaibo Xu /* SEC cipher context which cipher's relatives */
101416d8220SZaibo Xu struct sec_cipher_ctx {
102416d8220SZaibo Xu 	u8 *c_key;
103416d8220SZaibo Xu 	dma_addr_t c_key_dma;
104416d8220SZaibo Xu 	sector_t iv_offset;
105416d8220SZaibo Xu 	u32 c_gran_size;
106416d8220SZaibo Xu 	u32 ivsize;
107416d8220SZaibo Xu 	u8 c_mode;
108416d8220SZaibo Xu 	u8 c_alg;
109416d8220SZaibo Xu 	u8 c_key_len;
1105652d55aSKai Ye 
1115652d55aSKai Ye 	/* add software support */
1125652d55aSKai Ye 	bool fallback;
1135652d55aSKai Ye 	struct crypto_sync_skcipher *fbtfm;
114416d8220SZaibo Xu };
115416d8220SZaibo Xu 
116416d8220SZaibo Xu /* SEC queue context which defines queue's relatives */
117416d8220SZaibo Xu struct sec_qp_ctx {
118416d8220SZaibo Xu 	struct hisi_qp *qp;
119129a9f34SWeili Qian 	struct sec_req **req_list;
120416d8220SZaibo Xu 	struct idr req_idr;
121129a9f34SWeili Qian 	struct sec_alg_res *res;
122416d8220SZaibo Xu 	struct sec_ctx *ctx;
12302884a4fSZhengchao Shao 	spinlock_t req_lock;
1249597efc3SKai Ye 	struct list_head backlog;
125416d8220SZaibo Xu 	struct hisi_acc_sgl_pool *c_in_pool;
126416d8220SZaibo Xu 	struct hisi_acc_sgl_pool *c_out_pool;
127416d8220SZaibo Xu };
128416d8220SZaibo Xu 
1292f072d75SZaibo Xu enum sec_alg_type {
1302f072d75SZaibo Xu 	SEC_SKCIPHER,
1312f072d75SZaibo Xu 	SEC_AEAD
1322f072d75SZaibo Xu };
1332f072d75SZaibo Xu 
134416d8220SZaibo Xu /* SEC Crypto TFM context which defines queue and cipher .etc relatives */
135416d8220SZaibo Xu struct sec_ctx {
136416d8220SZaibo Xu 	struct sec_qp_ctx *qp_ctx;
137416d8220SZaibo Xu 	struct sec_dev *sec;
138416d8220SZaibo Xu 	const struct sec_req_op *req_op;
1390b5e43bcSKai Ye 	struct hisi_qp **qps;
140416d8220SZaibo Xu 
141416d8220SZaibo Xu 	/* Half queues for encipher, and half for decipher */
142416d8220SZaibo Xu 	u32 hlf_q_num;
143416d8220SZaibo Xu 
144416d8220SZaibo Xu 	/* Threshold for fake busy, trigger to return -EBUSY to user */
145416d8220SZaibo Xu 	u32 fake_req_limit;
146416d8220SZaibo Xu 
1473f3bbf22SJulia Lawall 	/* Current cyclic index to select a queue for encipher */
148416d8220SZaibo Xu 	atomic_t enc_qcyclic;
149416d8220SZaibo Xu 
1503f3bbf22SJulia Lawall 	 /* Current cyclic index to select a queue for decipher */
151416d8220SZaibo Xu 	atomic_t dec_qcyclic;
1522f072d75SZaibo Xu 
1532f072d75SZaibo Xu 	enum sec_alg_type alg_type;
15474b58db8SLongfang Liu 	bool pbuf_supported;
155416d8220SZaibo Xu 	struct sec_cipher_ctx c_ctx;
1562f072d75SZaibo Xu 	struct sec_auth_ctx a_ctx;
157adc3f65aSKai Ye 	u8 type_supported;
158a44dce50SLongfang Liu 	struct device *dev;
159416d8220SZaibo Xu };
160416d8220SZaibo Xu 
161416d8220SZaibo Xu 
1621e9bc276SZaibo Xu enum sec_debug_file_index {
1631e9bc276SZaibo Xu 	SEC_CLEAR_ENABLE,
1641e9bc276SZaibo Xu 	SEC_DEBUG_FILE_NUM,
1651e9bc276SZaibo Xu };
1661e9bc276SZaibo Xu 
1671e9bc276SZaibo Xu struct sec_debug_file {
1681e9bc276SZaibo Xu 	enum sec_debug_file_index index;
1691e9bc276SZaibo Xu 	spinlock_t lock;
1701e9bc276SZaibo Xu 	struct hisi_qm *qm;
1711e9bc276SZaibo Xu };
1721e9bc276SZaibo Xu 
1731e9bc276SZaibo Xu struct sec_dfx {
174cb1eeb75SArnd Bergmann 	atomic64_t send_cnt;
175cb1eeb75SArnd Bergmann 	atomic64_t recv_cnt;
1768213a1a6SKai Ye 	atomic64_t send_busy_cnt;
1779597efc3SKai Ye 	atomic64_t recv_busy_cnt;
1788213a1a6SKai Ye 	atomic64_t err_bd_cnt;
1798213a1a6SKai Ye 	atomic64_t invalid_req_cnt;
1808213a1a6SKai Ye 	atomic64_t done_flag_cnt;
1811e9bc276SZaibo Xu };
1821e9bc276SZaibo Xu 
1831e9bc276SZaibo Xu struct sec_debug {
1841e9bc276SZaibo Xu 	struct sec_dfx dfx;
1851e9bc276SZaibo Xu 	struct sec_debug_file files[SEC_DEBUG_FILE_NUM];
1861e9bc276SZaibo Xu };
1871e9bc276SZaibo Xu 
188416d8220SZaibo Xu struct sec_dev {
189416d8220SZaibo Xu 	struct hisi_qm qm;
1901e9bc276SZaibo Xu 	struct sec_debug debug;
191416d8220SZaibo Xu 	u32 ctx_q_num;
1928824bc5eSLongfang Liu 	bool iommu_used;
193416d8220SZaibo Xu };
194416d8220SZaibo Xu 
195d90fab0dSWeili Qian enum sec_cap_type {
196d90fab0dSWeili Qian 	SEC_QM_NFE_MASK_CAP = 0x0,
197d90fab0dSWeili Qian 	SEC_QM_RESET_MASK_CAP,
198d90fab0dSWeili Qian 	SEC_QM_OOO_SHUTDOWN_MASK_CAP,
199d90fab0dSWeili Qian 	SEC_QM_CE_MASK_CAP,
200d90fab0dSWeili Qian 	SEC_NFE_MASK_CAP,
201d90fab0dSWeili Qian 	SEC_RESET_MASK_CAP,
202d90fab0dSWeili Qian 	SEC_OOO_SHUTDOWN_MASK_CAP,
203d90fab0dSWeili Qian 	SEC_CE_MASK_CAP,
204921715b6SWenkai Lin 	SEC_CLUSTER_NUM_CAP,
205921715b6SWenkai Lin 	SEC_CORE_TYPE_NUM_CAP,
206921715b6SWenkai Lin 	SEC_CORE_NUM_CAP,
207921715b6SWenkai Lin 	SEC_CORES_PER_CLUSTER_NUM_CAP,
208921715b6SWenkai Lin 	SEC_CORE_ENABLE_BITMAP,
209921715b6SWenkai Lin 	SEC_DRV_ALG_BITMAP_LOW,
210921715b6SWenkai Lin 	SEC_DRV_ALG_BITMAP_HIGH,
211921715b6SWenkai Lin 	SEC_DEV_ALG_BITMAP_LOW,
212921715b6SWenkai Lin 	SEC_DEV_ALG_BITMAP_HIGH,
213921715b6SWenkai Lin 	SEC_CORE1_ALG_BITMAP_LOW,
214921715b6SWenkai Lin 	SEC_CORE1_ALG_BITMAP_HIGH,
215921715b6SWenkai Lin 	SEC_CORE2_ALG_BITMAP_LOW,
216921715b6SWenkai Lin 	SEC_CORE2_ALG_BITMAP_HIGH,
217921715b6SWenkai Lin 	SEC_CORE3_ALG_BITMAP_LOW,
218921715b6SWenkai Lin 	SEC_CORE3_ALG_BITMAP_HIGH,
219921715b6SWenkai Lin 	SEC_CORE4_ALG_BITMAP_LOW,
220921715b6SWenkai Lin 	SEC_CORE4_ALG_BITMAP_HIGH,
221d90fab0dSWeili Qian };
222d90fab0dSWeili Qian 
223*b06a6d5eSZhiqi Song enum sec_cap_reg_record_idx {
224*b06a6d5eSZhiqi Song 	SEC_DRV_ALG_BITMAP_LOW_IDX = 0x0,
225*b06a6d5eSZhiqi Song 	SEC_DRV_ALG_BITMAP_HIGH_IDX,
226*b06a6d5eSZhiqi Song 	SEC_DEV_ALG_BITMAP_LOW_IDX,
227*b06a6d5eSZhiqi Song 	SEC_DEV_ALG_BITMAP_HIGH_IDX,
228*b06a6d5eSZhiqi Song };
229*b06a6d5eSZhiqi Song 
2300b5e43bcSKai Ye void sec_destroy_qps(struct hisi_qp **qps, int qp_num);
2310b5e43bcSKai Ye struct hisi_qp **sec_create_qps(void);
2328123455aSMeng Yu int sec_register_to_crypto(struct hisi_qm *qm);
2338123455aSMeng Yu void sec_unregister_from_crypto(struct hisi_qm *qm);
234921715b6SWenkai Lin u64 sec_get_alg_bitmap(struct hisi_qm *qm, u32 high, u32 low);
235416d8220SZaibo Xu #endif
236