18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/* Copyright (c) 2019 HiSilicon Limited. */
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#ifndef __HISI_SEC_V2_H
58c2ecf20Sopenharmony_ci#define __HISI_SEC_V2_H
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#include "../qm.h"
88c2ecf20Sopenharmony_ci#include "sec_crypto.h"
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci/* Algorithm resource per hardware SEC queue */
118c2ecf20Sopenharmony_cistruct sec_alg_res {
128c2ecf20Sopenharmony_ci	u8 *pbuf;
138c2ecf20Sopenharmony_ci	dma_addr_t pbuf_dma;
148c2ecf20Sopenharmony_ci	u8 *c_ivin;
158c2ecf20Sopenharmony_ci	dma_addr_t c_ivin_dma;
168c2ecf20Sopenharmony_ci	u8 *out_mac;
178c2ecf20Sopenharmony_ci	dma_addr_t out_mac_dma;
188c2ecf20Sopenharmony_ci};
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci/* Cipher request of SEC private */
218c2ecf20Sopenharmony_cistruct sec_cipher_req {
228c2ecf20Sopenharmony_ci	struct hisi_acc_hw_sgl *c_in;
238c2ecf20Sopenharmony_ci	dma_addr_t c_in_dma;
248c2ecf20Sopenharmony_ci	struct hisi_acc_hw_sgl *c_out;
258c2ecf20Sopenharmony_ci	dma_addr_t c_out_dma;
268c2ecf20Sopenharmony_ci	u8 *c_ivin;
278c2ecf20Sopenharmony_ci	dma_addr_t c_ivin_dma;
288c2ecf20Sopenharmony_ci	struct skcipher_request *sk_req;
298c2ecf20Sopenharmony_ci	u32 c_len;
308c2ecf20Sopenharmony_ci	bool encrypt;
318c2ecf20Sopenharmony_ci};
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_cistruct sec_aead_req {
348c2ecf20Sopenharmony_ci	u8 *out_mac;
358c2ecf20Sopenharmony_ci	dma_addr_t out_mac_dma;
368c2ecf20Sopenharmony_ci	struct aead_request *aead_req;
378c2ecf20Sopenharmony_ci};
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci/* SEC request of Crypto */
408c2ecf20Sopenharmony_cistruct sec_req {
418c2ecf20Sopenharmony_ci	struct sec_sqe sec_sqe;
428c2ecf20Sopenharmony_ci	struct sec_ctx *ctx;
438c2ecf20Sopenharmony_ci	struct sec_qp_ctx *qp_ctx;
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	struct sec_cipher_req c_req;
468c2ecf20Sopenharmony_ci	struct sec_aead_req aead_req;
478c2ecf20Sopenharmony_ci	struct list_head backlog_head;
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	int err_type;
508c2ecf20Sopenharmony_ci	int req_id;
518c2ecf20Sopenharmony_ci	u32 flag;
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci	/* Status of the SEC request */
548c2ecf20Sopenharmony_ci	bool fake_busy;
558c2ecf20Sopenharmony_ci	bool use_pbuf;
568c2ecf20Sopenharmony_ci};
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci/**
598c2ecf20Sopenharmony_ci * struct sec_req_op - Operations for SEC request
608c2ecf20Sopenharmony_ci * @buf_map: DMA map the SGL buffers of the request
618c2ecf20Sopenharmony_ci * @buf_unmap: DMA unmap the SGL buffers of the request
628c2ecf20Sopenharmony_ci * @bd_fill: Fill the SEC queue BD
638c2ecf20Sopenharmony_ci * @bd_send: Send the SEC BD into the hardware queue
648c2ecf20Sopenharmony_ci * @callback: Call back for the request
658c2ecf20Sopenharmony_ci * @process: Main processing logic of Skcipher
668c2ecf20Sopenharmony_ci */
678c2ecf20Sopenharmony_cistruct sec_req_op {
688c2ecf20Sopenharmony_ci	int (*buf_map)(struct sec_ctx *ctx, struct sec_req *req);
698c2ecf20Sopenharmony_ci	void (*buf_unmap)(struct sec_ctx *ctx, struct sec_req *req);
708c2ecf20Sopenharmony_ci	void (*do_transfer)(struct sec_ctx *ctx, struct sec_req *req);
718c2ecf20Sopenharmony_ci	int (*bd_fill)(struct sec_ctx *ctx, struct sec_req *req);
728c2ecf20Sopenharmony_ci	int (*bd_send)(struct sec_ctx *ctx, struct sec_req *req);
738c2ecf20Sopenharmony_ci	void (*callback)(struct sec_ctx *ctx, struct sec_req *req, int err);
748c2ecf20Sopenharmony_ci	int (*process)(struct sec_ctx *ctx, struct sec_req *req);
758c2ecf20Sopenharmony_ci};
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci/* SEC auth context */
788c2ecf20Sopenharmony_cistruct sec_auth_ctx {
798c2ecf20Sopenharmony_ci	dma_addr_t a_key_dma;
808c2ecf20Sopenharmony_ci	u8 *a_key;
818c2ecf20Sopenharmony_ci	u8 a_key_len;
828c2ecf20Sopenharmony_ci	u8 mac_len;
838c2ecf20Sopenharmony_ci	u8 a_alg;
848c2ecf20Sopenharmony_ci	struct crypto_shash *hash_tfm;
858c2ecf20Sopenharmony_ci};
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci/* SEC cipher context which cipher's relatives */
888c2ecf20Sopenharmony_cistruct sec_cipher_ctx {
898c2ecf20Sopenharmony_ci	u8 *c_key;
908c2ecf20Sopenharmony_ci	dma_addr_t c_key_dma;
918c2ecf20Sopenharmony_ci	sector_t iv_offset;
928c2ecf20Sopenharmony_ci	u32 c_gran_size;
938c2ecf20Sopenharmony_ci	u32 ivsize;
948c2ecf20Sopenharmony_ci	u8 c_mode;
958c2ecf20Sopenharmony_ci	u8 c_alg;
968c2ecf20Sopenharmony_ci	u8 c_key_len;
978c2ecf20Sopenharmony_ci};
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_ci/* SEC queue context which defines queue's relatives */
1008c2ecf20Sopenharmony_cistruct sec_qp_ctx {
1018c2ecf20Sopenharmony_ci	struct hisi_qp *qp;
1028c2ecf20Sopenharmony_ci	struct sec_req *req_list[QM_Q_DEPTH];
1038c2ecf20Sopenharmony_ci	struct idr req_idr;
1048c2ecf20Sopenharmony_ci	struct sec_alg_res res[QM_Q_DEPTH];
1058c2ecf20Sopenharmony_ci	struct sec_ctx *ctx;
1068c2ecf20Sopenharmony_ci	spinlock_t req_lock;
1078c2ecf20Sopenharmony_ci	struct list_head backlog;
1088c2ecf20Sopenharmony_ci	struct hisi_acc_sgl_pool *c_in_pool;
1098c2ecf20Sopenharmony_ci	struct hisi_acc_sgl_pool *c_out_pool;
1108c2ecf20Sopenharmony_ci	atomic_t pending_reqs;
1118c2ecf20Sopenharmony_ci};
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_cienum sec_alg_type {
1148c2ecf20Sopenharmony_ci	SEC_SKCIPHER,
1158c2ecf20Sopenharmony_ci	SEC_AEAD
1168c2ecf20Sopenharmony_ci};
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ci/* SEC Crypto TFM context which defines queue and cipher .etc relatives */
1198c2ecf20Sopenharmony_cistruct sec_ctx {
1208c2ecf20Sopenharmony_ci	struct sec_qp_ctx *qp_ctx;
1218c2ecf20Sopenharmony_ci	struct sec_dev *sec;
1228c2ecf20Sopenharmony_ci	const struct sec_req_op *req_op;
1238c2ecf20Sopenharmony_ci	struct hisi_qp **qps;
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_ci	/* Half queues for encipher, and half for decipher */
1268c2ecf20Sopenharmony_ci	u32 hlf_q_num;
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_ci	/* Threshold for fake busy, trigger to return -EBUSY to user */
1298c2ecf20Sopenharmony_ci	u32 fake_req_limit;
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ci	/* Currrent cyclic index to select a queue for encipher */
1328c2ecf20Sopenharmony_ci	atomic_t enc_qcyclic;
1338c2ecf20Sopenharmony_ci
1348c2ecf20Sopenharmony_ci	 /* Currrent cyclic index to select a queue for decipher */
1358c2ecf20Sopenharmony_ci	atomic_t dec_qcyclic;
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ci	enum sec_alg_type alg_type;
1388c2ecf20Sopenharmony_ci	bool pbuf_supported;
1398c2ecf20Sopenharmony_ci	struct sec_cipher_ctx c_ctx;
1408c2ecf20Sopenharmony_ci	struct sec_auth_ctx a_ctx;
1418c2ecf20Sopenharmony_ci	struct device *dev;
1428c2ecf20Sopenharmony_ci};
1438c2ecf20Sopenharmony_ci
1448c2ecf20Sopenharmony_cienum sec_endian {
1458c2ecf20Sopenharmony_ci	SEC_LE = 0,
1468c2ecf20Sopenharmony_ci	SEC_32BE,
1478c2ecf20Sopenharmony_ci	SEC_64BE
1488c2ecf20Sopenharmony_ci};
1498c2ecf20Sopenharmony_ci
1508c2ecf20Sopenharmony_cienum sec_debug_file_index {
1518c2ecf20Sopenharmony_ci	SEC_CURRENT_QM,
1528c2ecf20Sopenharmony_ci	SEC_CLEAR_ENABLE,
1538c2ecf20Sopenharmony_ci	SEC_DEBUG_FILE_NUM,
1548c2ecf20Sopenharmony_ci};
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_cistruct sec_debug_file {
1578c2ecf20Sopenharmony_ci	enum sec_debug_file_index index;
1588c2ecf20Sopenharmony_ci	spinlock_t lock;
1598c2ecf20Sopenharmony_ci	struct hisi_qm *qm;
1608c2ecf20Sopenharmony_ci};
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_cistruct sec_dfx {
1638c2ecf20Sopenharmony_ci	atomic64_t send_cnt;
1648c2ecf20Sopenharmony_ci	atomic64_t recv_cnt;
1658c2ecf20Sopenharmony_ci	atomic64_t send_busy_cnt;
1668c2ecf20Sopenharmony_ci	atomic64_t recv_busy_cnt;
1678c2ecf20Sopenharmony_ci	atomic64_t err_bd_cnt;
1688c2ecf20Sopenharmony_ci	atomic64_t invalid_req_cnt;
1698c2ecf20Sopenharmony_ci	atomic64_t done_flag_cnt;
1708c2ecf20Sopenharmony_ci};
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_cistruct sec_debug {
1738c2ecf20Sopenharmony_ci	struct sec_dfx dfx;
1748c2ecf20Sopenharmony_ci	struct sec_debug_file files[SEC_DEBUG_FILE_NUM];
1758c2ecf20Sopenharmony_ci};
1768c2ecf20Sopenharmony_ci
1778c2ecf20Sopenharmony_cistruct sec_dev {
1788c2ecf20Sopenharmony_ci	struct hisi_qm qm;
1798c2ecf20Sopenharmony_ci	struct sec_debug debug;
1808c2ecf20Sopenharmony_ci	u32 ctx_q_num;
1818c2ecf20Sopenharmony_ci	bool iommu_used;
1828c2ecf20Sopenharmony_ci	unsigned long status;
1838c2ecf20Sopenharmony_ci};
1848c2ecf20Sopenharmony_ci
1858c2ecf20Sopenharmony_civoid sec_destroy_qps(struct hisi_qp **qps, int qp_num);
1868c2ecf20Sopenharmony_cistruct hisi_qp **sec_create_qps(void);
1878c2ecf20Sopenharmony_ciint sec_register_to_crypto(void);
1888c2ecf20Sopenharmony_civoid sec_unregister_from_crypto(void);
1898c2ecf20Sopenharmony_ci#endif
190