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 
7416d8220SZaibo Xu #include <linux/list.h>
8416d8220SZaibo Xu 
9416d8220SZaibo Xu #include "../qm.h"
10416d8220SZaibo Xu #include "sec_crypto.h"
11416d8220SZaibo Xu 
12a181647cSZaibo Xu /* Algorithm resource per hardware SEC queue */
13a181647cSZaibo Xu struct sec_alg_res {
1474b58db8SLongfang Liu 	u8 *pbuf;
1574b58db8SLongfang Liu 	dma_addr_t pbuf_dma;
16416d8220SZaibo Xu 	u8 *c_ivin;
17416d8220SZaibo Xu 	dma_addr_t c_ivin_dma;
182f072d75SZaibo Xu 	u8 *out_mac;
192f072d75SZaibo Xu 	dma_addr_t out_mac_dma;
20416d8220SZaibo Xu };
21416d8220SZaibo Xu 
22416d8220SZaibo Xu /* Cipher request of SEC private */
23416d8220SZaibo Xu struct sec_cipher_req {
24416d8220SZaibo Xu 	struct hisi_acc_hw_sgl *c_in;
25416d8220SZaibo Xu 	dma_addr_t c_in_dma;
26416d8220SZaibo Xu 	struct hisi_acc_hw_sgl *c_out;
27416d8220SZaibo Xu 	dma_addr_t c_out_dma;
282514f559SLongfang Liu 	u8 *c_ivin;
292514f559SLongfang Liu 	dma_addr_t c_ivin_dma;
30416d8220SZaibo Xu 	struct skcipher_request *sk_req;
31416d8220SZaibo Xu 	u32 c_len;
32416d8220SZaibo Xu 	bool encrypt;
33416d8220SZaibo Xu };
34416d8220SZaibo Xu 
352f072d75SZaibo Xu struct sec_aead_req {
362f072d75SZaibo Xu 	u8 *out_mac;
372f072d75SZaibo Xu 	dma_addr_t out_mac_dma;
382f072d75SZaibo Xu 	struct aead_request *aead_req;
392f072d75SZaibo Xu };
402f072d75SZaibo Xu 
41416d8220SZaibo Xu /* SEC request of Crypto */
42416d8220SZaibo Xu struct sec_req {
43416d8220SZaibo Xu 	struct sec_sqe sec_sqe;
44416d8220SZaibo Xu 	struct sec_ctx *ctx;
45416d8220SZaibo Xu 	struct sec_qp_ctx *qp_ctx;
46416d8220SZaibo Xu 
47416d8220SZaibo Xu 	struct sec_cipher_req c_req;
482f072d75SZaibo Xu 	struct sec_aead_req aead_req;
492f072d75SZaibo Xu 
50416d8220SZaibo Xu 	int err_type;
51416d8220SZaibo Xu 	int req_id;
52416d8220SZaibo Xu 
53416d8220SZaibo Xu 	/* Status of the SEC request */
54ca0d158dSZaibo Xu 	bool fake_busy;
5574b58db8SLongfang Liu 	bool use_pbuf;
56416d8220SZaibo Xu };
57416d8220SZaibo Xu 
58416d8220SZaibo Xu /**
59416d8220SZaibo Xu  * struct sec_req_op - Operations for SEC request
60416d8220SZaibo Xu  * @buf_map: DMA map the SGL buffers of the request
61416d8220SZaibo Xu  * @buf_unmap: DMA unmap the SGL buffers of the request
62416d8220SZaibo Xu  * @bd_fill: Fill the SEC queue BD
63416d8220SZaibo Xu  * @bd_send: Send the SEC BD into the hardware queue
64416d8220SZaibo Xu  * @callback: Call back for the request
65416d8220SZaibo Xu  * @process: Main processing logic of Skcipher
66416d8220SZaibo Xu  */
67416d8220SZaibo Xu struct sec_req_op {
68416d8220SZaibo Xu 	int (*buf_map)(struct sec_ctx *ctx, struct sec_req *req);
69416d8220SZaibo Xu 	void (*buf_unmap)(struct sec_ctx *ctx, struct sec_req *req);
70416d8220SZaibo Xu 	void (*do_transfer)(struct sec_ctx *ctx, struct sec_req *req);
71416d8220SZaibo Xu 	int (*bd_fill)(struct sec_ctx *ctx, struct sec_req *req);
72416d8220SZaibo Xu 	int (*bd_send)(struct sec_ctx *ctx, struct sec_req *req);
73310ea0acSZaibo Xu 	void (*callback)(struct sec_ctx *ctx, struct sec_req *req, int err);
74416d8220SZaibo Xu 	int (*process)(struct sec_ctx *ctx, struct sec_req *req);
75416d8220SZaibo Xu };
76416d8220SZaibo Xu 
772f072d75SZaibo Xu /* SEC auth context */
782f072d75SZaibo Xu struct sec_auth_ctx {
792f072d75SZaibo Xu 	dma_addr_t a_key_dma;
802f072d75SZaibo Xu 	u8 *a_key;
812f072d75SZaibo Xu 	u8 a_key_len;
822f072d75SZaibo Xu 	u8 mac_len;
832f072d75SZaibo Xu 	u8 a_alg;
842f072d75SZaibo Xu 	struct crypto_shash *hash_tfm;
852f072d75SZaibo Xu };
862f072d75SZaibo Xu 
87416d8220SZaibo Xu /* SEC cipher context which cipher's relatives */
88416d8220SZaibo Xu struct sec_cipher_ctx {
89416d8220SZaibo Xu 	u8 *c_key;
90416d8220SZaibo Xu 	dma_addr_t c_key_dma;
91416d8220SZaibo Xu 	sector_t iv_offset;
92416d8220SZaibo Xu 	u32 c_gran_size;
93416d8220SZaibo Xu 	u32 ivsize;
94416d8220SZaibo Xu 	u8 c_mode;
95416d8220SZaibo Xu 	u8 c_alg;
96416d8220SZaibo Xu 	u8 c_key_len;
97416d8220SZaibo Xu };
98416d8220SZaibo Xu 
99416d8220SZaibo Xu /* SEC queue context which defines queue's relatives */
100416d8220SZaibo Xu struct sec_qp_ctx {
101416d8220SZaibo Xu 	struct hisi_qp *qp;
1027c7d902aSZaibo Xu 	struct sec_req *req_list[QM_Q_DEPTH];
103416d8220SZaibo Xu 	struct idr req_idr;
1047c7d902aSZaibo Xu 	struct sec_alg_res res[QM_Q_DEPTH];
105416d8220SZaibo Xu 	struct sec_ctx *ctx;
106416d8220SZaibo Xu 	struct mutex req_lock;
107416d8220SZaibo Xu 	struct hisi_acc_sgl_pool *c_in_pool;
108416d8220SZaibo Xu 	struct hisi_acc_sgl_pool *c_out_pool;
109416d8220SZaibo Xu 	atomic_t pending_reqs;
110416d8220SZaibo Xu };
111416d8220SZaibo Xu 
1122f072d75SZaibo Xu enum sec_alg_type {
1132f072d75SZaibo Xu 	SEC_SKCIPHER,
1142f072d75SZaibo Xu 	SEC_AEAD
1152f072d75SZaibo Xu };
1162f072d75SZaibo Xu 
117416d8220SZaibo Xu /* SEC Crypto TFM context which defines queue and cipher .etc relatives */
118416d8220SZaibo Xu struct sec_ctx {
119416d8220SZaibo Xu 	struct sec_qp_ctx *qp_ctx;
120416d8220SZaibo Xu 	struct sec_dev *sec;
121416d8220SZaibo Xu 	const struct sec_req_op *req_op;
1220b5e43bcSKai Ye 	struct hisi_qp **qps;
123416d8220SZaibo Xu 
124416d8220SZaibo Xu 	/* Half queues for encipher, and half for decipher */
125416d8220SZaibo Xu 	u32 hlf_q_num;
126416d8220SZaibo Xu 
127416d8220SZaibo Xu 	/* Threshold for fake busy, trigger to return -EBUSY to user */
128416d8220SZaibo Xu 	u32 fake_req_limit;
129416d8220SZaibo Xu 
130416d8220SZaibo Xu 	/* Currrent cyclic index to select a queue for encipher */
131416d8220SZaibo Xu 	atomic_t enc_qcyclic;
132416d8220SZaibo Xu 
133416d8220SZaibo Xu 	 /* Currrent cyclic index to select a queue for decipher */
134416d8220SZaibo Xu 	atomic_t dec_qcyclic;
1352f072d75SZaibo Xu 
1362f072d75SZaibo Xu 	enum sec_alg_type alg_type;
13774b58db8SLongfang Liu 	bool pbuf_supported;
138416d8220SZaibo Xu 	struct sec_cipher_ctx c_ctx;
1392f072d75SZaibo Xu 	struct sec_auth_ctx a_ctx;
140416d8220SZaibo Xu };
141416d8220SZaibo Xu 
142416d8220SZaibo Xu enum sec_endian {
143416d8220SZaibo Xu 	SEC_LE = 0,
144416d8220SZaibo Xu 	SEC_32BE,
145416d8220SZaibo Xu 	SEC_64BE
146416d8220SZaibo Xu };
147416d8220SZaibo Xu 
1481e9bc276SZaibo Xu enum sec_debug_file_index {
1491e9bc276SZaibo Xu 	SEC_CURRENT_QM,
1501e9bc276SZaibo Xu 	SEC_CLEAR_ENABLE,
1511e9bc276SZaibo Xu 	SEC_DEBUG_FILE_NUM,
1521e9bc276SZaibo Xu };
1531e9bc276SZaibo Xu 
1541e9bc276SZaibo Xu struct sec_debug_file {
1551e9bc276SZaibo Xu 	enum sec_debug_file_index index;
1561e9bc276SZaibo Xu 	spinlock_t lock;
1571e9bc276SZaibo Xu 	struct hisi_qm *qm;
1581e9bc276SZaibo Xu };
1591e9bc276SZaibo Xu 
1601e9bc276SZaibo Xu struct sec_dfx {
161cb1eeb75SArnd Bergmann 	atomic64_t send_cnt;
162cb1eeb75SArnd Bergmann 	atomic64_t recv_cnt;
1631e9bc276SZaibo Xu };
1641e9bc276SZaibo Xu 
1651e9bc276SZaibo Xu struct sec_debug {
1661e9bc276SZaibo Xu 	struct sec_dfx dfx;
1671e9bc276SZaibo Xu 	struct sec_debug_file files[SEC_DEBUG_FILE_NUM];
1681e9bc276SZaibo Xu };
1691e9bc276SZaibo Xu 
170416d8220SZaibo Xu struct sec_dev {
171416d8220SZaibo Xu 	struct hisi_qm qm;
1721e9bc276SZaibo Xu 	struct sec_debug debug;
173416d8220SZaibo Xu 	u32 ctx_q_num;
1748824bc5eSLongfang Liu 	bool iommu_used;
17573bcb049SZaibo Xu 	u32 num_vfs;
176416d8220SZaibo Xu 	unsigned long status;
177416d8220SZaibo Xu };
178416d8220SZaibo Xu 
1790b5e43bcSKai Ye void sec_destroy_qps(struct hisi_qp **qps, int qp_num);
1800b5e43bcSKai Ye struct hisi_qp **sec_create_qps(void);
181416d8220SZaibo Xu int sec_register_to_crypto(void);
182416d8220SZaibo Xu void sec_unregister_from_crypto(void);
183416d8220SZaibo Xu #endif
184