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 {
14416d8220SZaibo Xu 	u8 *c_ivin;
15416d8220SZaibo Xu 	dma_addr_t c_ivin_dma;
162f072d75SZaibo Xu 	u8 *out_mac;
172f072d75SZaibo Xu 	dma_addr_t out_mac_dma;
18416d8220SZaibo Xu };
19416d8220SZaibo Xu 
20416d8220SZaibo Xu /* Cipher request of SEC private */
21416d8220SZaibo Xu struct sec_cipher_req {
22416d8220SZaibo Xu 	struct hisi_acc_hw_sgl *c_in;
23416d8220SZaibo Xu 	dma_addr_t c_in_dma;
24416d8220SZaibo Xu 	struct hisi_acc_hw_sgl *c_out;
25416d8220SZaibo Xu 	dma_addr_t c_out_dma;
26416d8220SZaibo Xu 	struct skcipher_request *sk_req;
27416d8220SZaibo Xu 	u32 c_len;
28416d8220SZaibo Xu 	bool encrypt;
29416d8220SZaibo Xu };
30416d8220SZaibo Xu 
312f072d75SZaibo Xu struct sec_aead_req {
322f072d75SZaibo Xu 	u8 *out_mac;
332f072d75SZaibo Xu 	dma_addr_t out_mac_dma;
342f072d75SZaibo Xu 	struct aead_request *aead_req;
352f072d75SZaibo Xu };
362f072d75SZaibo Xu 
37416d8220SZaibo Xu /* SEC request of Crypto */
38416d8220SZaibo Xu struct sec_req {
39416d8220SZaibo Xu 	struct sec_sqe sec_sqe;
40416d8220SZaibo Xu 	struct sec_ctx *ctx;
41416d8220SZaibo Xu 	struct sec_qp_ctx *qp_ctx;
42416d8220SZaibo Xu 
43416d8220SZaibo Xu 	struct sec_cipher_req c_req;
442f072d75SZaibo Xu 	struct sec_aead_req aead_req;
452f072d75SZaibo Xu 
46416d8220SZaibo Xu 	int err_type;
47416d8220SZaibo Xu 	int req_id;
48416d8220SZaibo Xu 
49416d8220SZaibo Xu 	/* Status of the SEC request */
50ca0d158dSZaibo Xu 	bool fake_busy;
51416d8220SZaibo Xu };
52416d8220SZaibo Xu 
53416d8220SZaibo Xu /**
54416d8220SZaibo Xu  * struct sec_req_op - Operations for SEC request
55416d8220SZaibo Xu  * @buf_map: DMA map the SGL buffers of the request
56416d8220SZaibo Xu  * @buf_unmap: DMA unmap the SGL buffers of the request
57416d8220SZaibo Xu  * @bd_fill: Fill the SEC queue BD
58416d8220SZaibo Xu  * @bd_send: Send the SEC BD into the hardware queue
59416d8220SZaibo Xu  * @callback: Call back for the request
60416d8220SZaibo Xu  * @process: Main processing logic of Skcipher
61416d8220SZaibo Xu  */
62416d8220SZaibo Xu struct sec_req_op {
63416d8220SZaibo Xu 	int (*buf_map)(struct sec_ctx *ctx, struct sec_req *req);
64416d8220SZaibo Xu 	void (*buf_unmap)(struct sec_ctx *ctx, struct sec_req *req);
65416d8220SZaibo Xu 	void (*do_transfer)(struct sec_ctx *ctx, struct sec_req *req);
66416d8220SZaibo Xu 	int (*bd_fill)(struct sec_ctx *ctx, struct sec_req *req);
67416d8220SZaibo Xu 	int (*bd_send)(struct sec_ctx *ctx, struct sec_req *req);
68310ea0acSZaibo Xu 	void (*callback)(struct sec_ctx *ctx, struct sec_req *req, int err);
69416d8220SZaibo Xu 	int (*process)(struct sec_ctx *ctx, struct sec_req *req);
70416d8220SZaibo Xu };
71416d8220SZaibo Xu 
722f072d75SZaibo Xu /* SEC auth context */
732f072d75SZaibo Xu struct sec_auth_ctx {
742f072d75SZaibo Xu 	dma_addr_t a_key_dma;
752f072d75SZaibo Xu 	u8 *a_key;
762f072d75SZaibo Xu 	u8 a_key_len;
772f072d75SZaibo Xu 	u8 mac_len;
782f072d75SZaibo Xu 	u8 a_alg;
792f072d75SZaibo Xu 	struct crypto_shash *hash_tfm;
802f072d75SZaibo Xu };
812f072d75SZaibo Xu 
82416d8220SZaibo Xu /* SEC cipher context which cipher's relatives */
83416d8220SZaibo Xu struct sec_cipher_ctx {
84416d8220SZaibo Xu 	u8 *c_key;
85416d8220SZaibo Xu 	dma_addr_t c_key_dma;
86416d8220SZaibo Xu 	sector_t iv_offset;
87416d8220SZaibo Xu 	u32 c_gran_size;
88416d8220SZaibo Xu 	u32 ivsize;
89416d8220SZaibo Xu 	u8 c_mode;
90416d8220SZaibo Xu 	u8 c_alg;
91416d8220SZaibo Xu 	u8 c_key_len;
92416d8220SZaibo Xu };
93416d8220SZaibo Xu 
94416d8220SZaibo Xu /* SEC queue context which defines queue's relatives */
95416d8220SZaibo Xu struct sec_qp_ctx {
96416d8220SZaibo Xu 	struct hisi_qp *qp;
977c7d902aSZaibo Xu 	struct sec_req *req_list[QM_Q_DEPTH];
98416d8220SZaibo Xu 	struct idr req_idr;
997c7d902aSZaibo Xu 	struct sec_alg_res res[QM_Q_DEPTH];
100416d8220SZaibo Xu 	struct sec_ctx *ctx;
101416d8220SZaibo Xu 	struct mutex req_lock;
102416d8220SZaibo Xu 	struct hisi_acc_sgl_pool *c_in_pool;
103416d8220SZaibo Xu 	struct hisi_acc_sgl_pool *c_out_pool;
104416d8220SZaibo Xu 	atomic_t pending_reqs;
105416d8220SZaibo Xu };
106416d8220SZaibo Xu 
1072f072d75SZaibo Xu enum sec_alg_type {
1082f072d75SZaibo Xu 	SEC_SKCIPHER,
1092f072d75SZaibo Xu 	SEC_AEAD
1102f072d75SZaibo Xu };
1112f072d75SZaibo Xu 
112416d8220SZaibo Xu /* SEC Crypto TFM context which defines queue and cipher .etc relatives */
113416d8220SZaibo Xu struct sec_ctx {
114416d8220SZaibo Xu 	struct sec_qp_ctx *qp_ctx;
115416d8220SZaibo Xu 	struct sec_dev *sec;
116416d8220SZaibo Xu 	const struct sec_req_op *req_op;
117416d8220SZaibo Xu 
118416d8220SZaibo Xu 	/* Half queues for encipher, and half for decipher */
119416d8220SZaibo Xu 	u32 hlf_q_num;
120416d8220SZaibo Xu 
121416d8220SZaibo Xu 	/* Threshold for fake busy, trigger to return -EBUSY to user */
122416d8220SZaibo Xu 	u32 fake_req_limit;
123416d8220SZaibo Xu 
124416d8220SZaibo Xu 	/* Currrent cyclic index to select a queue for encipher */
125416d8220SZaibo Xu 	atomic_t enc_qcyclic;
126416d8220SZaibo Xu 
127416d8220SZaibo Xu 	 /* Currrent cyclic index to select a queue for decipher */
128416d8220SZaibo Xu 	atomic_t dec_qcyclic;
1292f072d75SZaibo Xu 
1302f072d75SZaibo Xu 	enum sec_alg_type alg_type;
131416d8220SZaibo Xu 	struct sec_cipher_ctx c_ctx;
1322f072d75SZaibo Xu 	struct sec_auth_ctx a_ctx;
133416d8220SZaibo Xu };
134416d8220SZaibo Xu 
135416d8220SZaibo Xu enum sec_endian {
136416d8220SZaibo Xu 	SEC_LE = 0,
137416d8220SZaibo Xu 	SEC_32BE,
138416d8220SZaibo Xu 	SEC_64BE
139416d8220SZaibo Xu };
140416d8220SZaibo Xu 
1411e9bc276SZaibo Xu enum sec_debug_file_index {
1421e9bc276SZaibo Xu 	SEC_CURRENT_QM,
1431e9bc276SZaibo Xu 	SEC_CLEAR_ENABLE,
1441e9bc276SZaibo Xu 	SEC_DEBUG_FILE_NUM,
1451e9bc276SZaibo Xu };
1461e9bc276SZaibo Xu 
1471e9bc276SZaibo Xu struct sec_debug_file {
1481e9bc276SZaibo Xu 	enum sec_debug_file_index index;
1491e9bc276SZaibo Xu 	spinlock_t lock;
1501e9bc276SZaibo Xu 	struct hisi_qm *qm;
1511e9bc276SZaibo Xu };
1521e9bc276SZaibo Xu 
1531e9bc276SZaibo Xu struct sec_dfx {
154cb1eeb75SArnd Bergmann 	atomic64_t send_cnt;
155cb1eeb75SArnd Bergmann 	atomic64_t recv_cnt;
1561e9bc276SZaibo Xu };
1571e9bc276SZaibo Xu 
1581e9bc276SZaibo Xu struct sec_debug {
1591e9bc276SZaibo Xu 	struct sec_dfx dfx;
1601e9bc276SZaibo Xu 	struct sec_debug_file files[SEC_DEBUG_FILE_NUM];
1611e9bc276SZaibo Xu };
1621e9bc276SZaibo Xu 
163416d8220SZaibo Xu struct sec_dev {
164416d8220SZaibo Xu 	struct hisi_qm qm;
165416d8220SZaibo Xu 	struct list_head list;
1661e9bc276SZaibo Xu 	struct sec_debug debug;
167416d8220SZaibo Xu 	u32 ctx_q_num;
1688824bc5eSLongfang Liu 	bool iommu_used;
16973bcb049SZaibo Xu 	u32 num_vfs;
170416d8220SZaibo Xu 	unsigned long status;
171416d8220SZaibo Xu };
172416d8220SZaibo Xu 
173416d8220SZaibo Xu struct sec_dev *sec_find_device(int node);
174416d8220SZaibo Xu int sec_register_to_crypto(void);
175416d8220SZaibo Xu void sec_unregister_from_crypto(void);
176416d8220SZaibo Xu #endif
177