162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* Copyright (c) 2019 HiSilicon Limited. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef __HISI_SEC_V2_H
562306a36Sopenharmony_ci#define __HISI_SEC_V2_H
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/hisi_acc_qm.h>
862306a36Sopenharmony_ci#include "sec_crypto.h"
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci/* Algorithm resource per hardware SEC queue */
1162306a36Sopenharmony_cistruct sec_alg_res {
1262306a36Sopenharmony_ci	u8 *pbuf;
1362306a36Sopenharmony_ci	dma_addr_t pbuf_dma;
1462306a36Sopenharmony_ci	u8 *c_ivin;
1562306a36Sopenharmony_ci	dma_addr_t c_ivin_dma;
1662306a36Sopenharmony_ci	u8 *a_ivin;
1762306a36Sopenharmony_ci	dma_addr_t a_ivin_dma;
1862306a36Sopenharmony_ci	u8 *out_mac;
1962306a36Sopenharmony_ci	dma_addr_t out_mac_dma;
2062306a36Sopenharmony_ci	u16 depth;
2162306a36Sopenharmony_ci};
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci/* Cipher request of SEC private */
2462306a36Sopenharmony_cistruct sec_cipher_req {
2562306a36Sopenharmony_ci	struct hisi_acc_hw_sgl *c_out;
2662306a36Sopenharmony_ci	dma_addr_t c_out_dma;
2762306a36Sopenharmony_ci	u8 *c_ivin;
2862306a36Sopenharmony_ci	dma_addr_t c_ivin_dma;
2962306a36Sopenharmony_ci	struct skcipher_request *sk_req;
3062306a36Sopenharmony_ci	u32 c_len;
3162306a36Sopenharmony_ci	bool encrypt;
3262306a36Sopenharmony_ci};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistruct sec_aead_req {
3562306a36Sopenharmony_ci	u8 *out_mac;
3662306a36Sopenharmony_ci	dma_addr_t out_mac_dma;
3762306a36Sopenharmony_ci	u8 *a_ivin;
3862306a36Sopenharmony_ci	dma_addr_t a_ivin_dma;
3962306a36Sopenharmony_ci	struct aead_request *aead_req;
4062306a36Sopenharmony_ci};
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci/* SEC request of Crypto */
4362306a36Sopenharmony_cistruct sec_req {
4462306a36Sopenharmony_ci	union {
4562306a36Sopenharmony_ci		struct sec_sqe sec_sqe;
4662306a36Sopenharmony_ci		struct sec_sqe3 sec_sqe3;
4762306a36Sopenharmony_ci	};
4862306a36Sopenharmony_ci	struct sec_ctx *ctx;
4962306a36Sopenharmony_ci	struct sec_qp_ctx *qp_ctx;
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	/**
5262306a36Sopenharmony_ci	 * Common parameter of the SEC request.
5362306a36Sopenharmony_ci	 */
5462306a36Sopenharmony_ci	struct hisi_acc_hw_sgl *in;
5562306a36Sopenharmony_ci	dma_addr_t in_dma;
5662306a36Sopenharmony_ci	struct sec_cipher_req c_req;
5762306a36Sopenharmony_ci	struct sec_aead_req aead_req;
5862306a36Sopenharmony_ci	struct list_head backlog_head;
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	int err_type;
6162306a36Sopenharmony_ci	int req_id;
6262306a36Sopenharmony_ci	u32 flag;
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	/* Status of the SEC request */
6562306a36Sopenharmony_ci	bool fake_busy;
6662306a36Sopenharmony_ci	bool use_pbuf;
6762306a36Sopenharmony_ci};
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci/**
7062306a36Sopenharmony_ci * struct sec_req_op - Operations for SEC request
7162306a36Sopenharmony_ci * @buf_map: DMA map the SGL buffers of the request
7262306a36Sopenharmony_ci * @buf_unmap: DMA unmap the SGL buffers of the request
7362306a36Sopenharmony_ci * @bd_fill: Fill the SEC queue BD
7462306a36Sopenharmony_ci * @bd_send: Send the SEC BD into the hardware queue
7562306a36Sopenharmony_ci * @callback: Call back for the request
7662306a36Sopenharmony_ci * @process: Main processing logic of Skcipher
7762306a36Sopenharmony_ci */
7862306a36Sopenharmony_cistruct sec_req_op {
7962306a36Sopenharmony_ci	int (*buf_map)(struct sec_ctx *ctx, struct sec_req *req);
8062306a36Sopenharmony_ci	void (*buf_unmap)(struct sec_ctx *ctx, struct sec_req *req);
8162306a36Sopenharmony_ci	void (*do_transfer)(struct sec_ctx *ctx, struct sec_req *req);
8262306a36Sopenharmony_ci	int (*bd_fill)(struct sec_ctx *ctx, struct sec_req *req);
8362306a36Sopenharmony_ci	int (*bd_send)(struct sec_ctx *ctx, struct sec_req *req);
8462306a36Sopenharmony_ci	void (*callback)(struct sec_ctx *ctx, struct sec_req *req, int err);
8562306a36Sopenharmony_ci	int (*process)(struct sec_ctx *ctx, struct sec_req *req);
8662306a36Sopenharmony_ci};
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci/* SEC auth context */
8962306a36Sopenharmony_cistruct sec_auth_ctx {
9062306a36Sopenharmony_ci	dma_addr_t a_key_dma;
9162306a36Sopenharmony_ci	u8 *a_key;
9262306a36Sopenharmony_ci	u8 a_key_len;
9362306a36Sopenharmony_ci	u8 mac_len;
9462306a36Sopenharmony_ci	u8 a_alg;
9562306a36Sopenharmony_ci	bool fallback;
9662306a36Sopenharmony_ci	struct crypto_shash *hash_tfm;
9762306a36Sopenharmony_ci	struct crypto_aead *fallback_aead_tfm;
9862306a36Sopenharmony_ci};
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci/* SEC cipher context which cipher's relatives */
10162306a36Sopenharmony_cistruct sec_cipher_ctx {
10262306a36Sopenharmony_ci	u8 *c_key;
10362306a36Sopenharmony_ci	dma_addr_t c_key_dma;
10462306a36Sopenharmony_ci	sector_t iv_offset;
10562306a36Sopenharmony_ci	u32 c_gran_size;
10662306a36Sopenharmony_ci	u32 ivsize;
10762306a36Sopenharmony_ci	u8 c_mode;
10862306a36Sopenharmony_ci	u8 c_alg;
10962306a36Sopenharmony_ci	u8 c_key_len;
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	/* add software support */
11262306a36Sopenharmony_ci	bool fallback;
11362306a36Sopenharmony_ci	struct crypto_sync_skcipher *fbtfm;
11462306a36Sopenharmony_ci};
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci/* SEC queue context which defines queue's relatives */
11762306a36Sopenharmony_cistruct sec_qp_ctx {
11862306a36Sopenharmony_ci	struct hisi_qp *qp;
11962306a36Sopenharmony_ci	struct sec_req **req_list;
12062306a36Sopenharmony_ci	struct idr req_idr;
12162306a36Sopenharmony_ci	struct sec_alg_res *res;
12262306a36Sopenharmony_ci	struct sec_ctx *ctx;
12362306a36Sopenharmony_ci	spinlock_t req_lock;
12462306a36Sopenharmony_ci	struct list_head backlog;
12562306a36Sopenharmony_ci	struct hisi_acc_sgl_pool *c_in_pool;
12662306a36Sopenharmony_ci	struct hisi_acc_sgl_pool *c_out_pool;
12762306a36Sopenharmony_ci};
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_cienum sec_alg_type {
13062306a36Sopenharmony_ci	SEC_SKCIPHER,
13162306a36Sopenharmony_ci	SEC_AEAD
13262306a36Sopenharmony_ci};
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci/* SEC Crypto TFM context which defines queue and cipher .etc relatives */
13562306a36Sopenharmony_cistruct sec_ctx {
13662306a36Sopenharmony_ci	struct sec_qp_ctx *qp_ctx;
13762306a36Sopenharmony_ci	struct sec_dev *sec;
13862306a36Sopenharmony_ci	const struct sec_req_op *req_op;
13962306a36Sopenharmony_ci	struct hisi_qp **qps;
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci	/* Half queues for encipher, and half for decipher */
14262306a36Sopenharmony_ci	u32 hlf_q_num;
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci	/* Threshold for fake busy, trigger to return -EBUSY to user */
14562306a36Sopenharmony_ci	u32 fake_req_limit;
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci	/* Current cyclic index to select a queue for encipher */
14862306a36Sopenharmony_ci	atomic_t enc_qcyclic;
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci	 /* Current cyclic index to select a queue for decipher */
15162306a36Sopenharmony_ci	atomic_t dec_qcyclic;
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci	enum sec_alg_type alg_type;
15462306a36Sopenharmony_ci	bool pbuf_supported;
15562306a36Sopenharmony_ci	struct sec_cipher_ctx c_ctx;
15662306a36Sopenharmony_ci	struct sec_auth_ctx a_ctx;
15762306a36Sopenharmony_ci	u8 type_supported;
15862306a36Sopenharmony_ci	struct device *dev;
15962306a36Sopenharmony_ci};
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_cienum sec_debug_file_index {
16362306a36Sopenharmony_ci	SEC_CLEAR_ENABLE,
16462306a36Sopenharmony_ci	SEC_DEBUG_FILE_NUM,
16562306a36Sopenharmony_ci};
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_cistruct sec_debug_file {
16862306a36Sopenharmony_ci	enum sec_debug_file_index index;
16962306a36Sopenharmony_ci	spinlock_t lock;
17062306a36Sopenharmony_ci	struct hisi_qm *qm;
17162306a36Sopenharmony_ci};
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_cistruct sec_dfx {
17462306a36Sopenharmony_ci	atomic64_t send_cnt;
17562306a36Sopenharmony_ci	atomic64_t recv_cnt;
17662306a36Sopenharmony_ci	atomic64_t send_busy_cnt;
17762306a36Sopenharmony_ci	atomic64_t recv_busy_cnt;
17862306a36Sopenharmony_ci	atomic64_t err_bd_cnt;
17962306a36Sopenharmony_ci	atomic64_t invalid_req_cnt;
18062306a36Sopenharmony_ci	atomic64_t done_flag_cnt;
18162306a36Sopenharmony_ci};
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_cistruct sec_debug {
18462306a36Sopenharmony_ci	struct sec_dfx dfx;
18562306a36Sopenharmony_ci	struct sec_debug_file files[SEC_DEBUG_FILE_NUM];
18662306a36Sopenharmony_ci};
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_cistruct sec_dev {
18962306a36Sopenharmony_ci	struct hisi_qm qm;
19062306a36Sopenharmony_ci	struct sec_debug debug;
19162306a36Sopenharmony_ci	u32 ctx_q_num;
19262306a36Sopenharmony_ci	bool iommu_used;
19362306a36Sopenharmony_ci};
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_cienum sec_cap_type {
19662306a36Sopenharmony_ci	SEC_QM_NFE_MASK_CAP = 0x0,
19762306a36Sopenharmony_ci	SEC_QM_RESET_MASK_CAP,
19862306a36Sopenharmony_ci	SEC_QM_OOO_SHUTDOWN_MASK_CAP,
19962306a36Sopenharmony_ci	SEC_QM_CE_MASK_CAP,
20062306a36Sopenharmony_ci	SEC_NFE_MASK_CAP,
20162306a36Sopenharmony_ci	SEC_RESET_MASK_CAP,
20262306a36Sopenharmony_ci	SEC_OOO_SHUTDOWN_MASK_CAP,
20362306a36Sopenharmony_ci	SEC_CE_MASK_CAP,
20462306a36Sopenharmony_ci	SEC_CLUSTER_NUM_CAP,
20562306a36Sopenharmony_ci	SEC_CORE_TYPE_NUM_CAP,
20662306a36Sopenharmony_ci	SEC_CORE_NUM_CAP,
20762306a36Sopenharmony_ci	SEC_CORES_PER_CLUSTER_NUM_CAP,
20862306a36Sopenharmony_ci	SEC_CORE_ENABLE_BITMAP,
20962306a36Sopenharmony_ci	SEC_DRV_ALG_BITMAP_LOW,
21062306a36Sopenharmony_ci	SEC_DRV_ALG_BITMAP_HIGH,
21162306a36Sopenharmony_ci	SEC_DEV_ALG_BITMAP_LOW,
21262306a36Sopenharmony_ci	SEC_DEV_ALG_BITMAP_HIGH,
21362306a36Sopenharmony_ci	SEC_CORE1_ALG_BITMAP_LOW,
21462306a36Sopenharmony_ci	SEC_CORE1_ALG_BITMAP_HIGH,
21562306a36Sopenharmony_ci	SEC_CORE2_ALG_BITMAP_LOW,
21662306a36Sopenharmony_ci	SEC_CORE2_ALG_BITMAP_HIGH,
21762306a36Sopenharmony_ci	SEC_CORE3_ALG_BITMAP_LOW,
21862306a36Sopenharmony_ci	SEC_CORE3_ALG_BITMAP_HIGH,
21962306a36Sopenharmony_ci	SEC_CORE4_ALG_BITMAP_LOW,
22062306a36Sopenharmony_ci	SEC_CORE4_ALG_BITMAP_HIGH,
22162306a36Sopenharmony_ci};
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_cienum sec_cap_reg_record_idx {
22462306a36Sopenharmony_ci	SEC_DRV_ALG_BITMAP_LOW_IDX = 0x0,
22562306a36Sopenharmony_ci	SEC_DRV_ALG_BITMAP_HIGH_IDX,
22662306a36Sopenharmony_ci	SEC_DEV_ALG_BITMAP_LOW_IDX,
22762306a36Sopenharmony_ci	SEC_DEV_ALG_BITMAP_HIGH_IDX,
22862306a36Sopenharmony_ci};
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_civoid sec_destroy_qps(struct hisi_qp **qps, int qp_num);
23162306a36Sopenharmony_cistruct hisi_qp **sec_create_qps(void);
23262306a36Sopenharmony_ciint sec_register_to_crypto(struct hisi_qm *qm);
23362306a36Sopenharmony_civoid sec_unregister_from_crypto(struct hisi_qm *qm);
23462306a36Sopenharmony_ciu64 sec_get_alg_bitmap(struct hisi_qm *qm, u32 high, u32 low);
23562306a36Sopenharmony_ci#endif
236