162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/* Copyright (c) 2019 HiSilicon Limited. */
362306a36Sopenharmony_ci#ifndef __HISI_HPRE_H
462306a36Sopenharmony_ci#define __HISI_HPRE_H
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/list.h>
762306a36Sopenharmony_ci#include <linux/hisi_acc_qm.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#define HPRE_SQE_SIZE			sizeof(struct hpre_sqe)
1062306a36Sopenharmony_ci#define HPRE_PF_DEF_Q_NUM		64
1162306a36Sopenharmony_ci#define HPRE_PF_DEF_Q_BASE		0
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci/*
1462306a36Sopenharmony_ci * type used in qm sqc DW6.
1562306a36Sopenharmony_ci * 0 - Algorithm which has been supported in V2, like RSA, DH and so on;
1662306a36Sopenharmony_ci * 1 - ECC algorithm in V3.
1762306a36Sopenharmony_ci */
1862306a36Sopenharmony_ci#define HPRE_V2_ALG_TYPE	0
1962306a36Sopenharmony_ci#define HPRE_V3_ECC_ALG_TYPE	1
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cienum {
2262306a36Sopenharmony_ci	HPRE_CLUSTER0,
2362306a36Sopenharmony_ci	HPRE_CLUSTER1,
2462306a36Sopenharmony_ci	HPRE_CLUSTER2,
2562306a36Sopenharmony_ci	HPRE_CLUSTER3,
2662306a36Sopenharmony_ci	HPRE_CLUSTERS_NUM_MAX
2762306a36Sopenharmony_ci};
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cienum hpre_ctrl_dbgfs_file {
3062306a36Sopenharmony_ci	HPRE_CLEAR_ENABLE,
3162306a36Sopenharmony_ci	HPRE_CLUSTER_CTRL,
3262306a36Sopenharmony_ci	HPRE_DEBUG_FILE_NUM,
3362306a36Sopenharmony_ci};
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cienum hpre_dfx_dbgfs_file {
3662306a36Sopenharmony_ci	HPRE_SEND_CNT,
3762306a36Sopenharmony_ci	HPRE_RECV_CNT,
3862306a36Sopenharmony_ci	HPRE_SEND_FAIL_CNT,
3962306a36Sopenharmony_ci	HPRE_SEND_BUSY_CNT,
4062306a36Sopenharmony_ci	HPRE_OVER_THRHLD_CNT,
4162306a36Sopenharmony_ci	HPRE_OVERTIME_THRHLD,
4262306a36Sopenharmony_ci	HPRE_INVALID_REQ_CNT,
4362306a36Sopenharmony_ci	HPRE_DFX_FILE_NUM
4462306a36Sopenharmony_ci};
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci#define HPRE_DEBUGFS_FILE_NUM (HPRE_DEBUG_FILE_NUM + HPRE_CLUSTERS_NUM_MAX - 1)
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistruct hpre_debugfs_file {
4962306a36Sopenharmony_ci	int index;
5062306a36Sopenharmony_ci	enum hpre_ctrl_dbgfs_file type;
5162306a36Sopenharmony_ci	spinlock_t lock;
5262306a36Sopenharmony_ci	struct hpre_debug *debug;
5362306a36Sopenharmony_ci};
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistruct hpre_dfx {
5662306a36Sopenharmony_ci	atomic64_t value;
5762306a36Sopenharmony_ci	enum hpre_dfx_dbgfs_file type;
5862306a36Sopenharmony_ci};
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci/*
6162306a36Sopenharmony_ci * One HPRE controller has one PF and multiple VFs, some global configurations
6262306a36Sopenharmony_ci * which PF has need this structure.
6362306a36Sopenharmony_ci * Just relevant for PF.
6462306a36Sopenharmony_ci */
6562306a36Sopenharmony_cistruct hpre_debug {
6662306a36Sopenharmony_ci	struct hpre_dfx dfx[HPRE_DFX_FILE_NUM];
6762306a36Sopenharmony_ci	struct hpre_debugfs_file files[HPRE_DEBUGFS_FILE_NUM];
6862306a36Sopenharmony_ci};
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_cistruct hpre {
7162306a36Sopenharmony_ci	struct hisi_qm qm;
7262306a36Sopenharmony_ci	struct hpre_debug debug;
7362306a36Sopenharmony_ci	unsigned long status;
7462306a36Sopenharmony_ci};
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cienum hpre_alg_type {
7762306a36Sopenharmony_ci	HPRE_ALG_NC_NCRT = 0x0,
7862306a36Sopenharmony_ci	HPRE_ALG_NC_CRT = 0x1,
7962306a36Sopenharmony_ci	HPRE_ALG_KG_STD = 0x2,
8062306a36Sopenharmony_ci	HPRE_ALG_KG_CRT = 0x3,
8162306a36Sopenharmony_ci	HPRE_ALG_DH_G2 = 0x4,
8262306a36Sopenharmony_ci	HPRE_ALG_DH = 0x5,
8362306a36Sopenharmony_ci	HPRE_ALG_ECC_MUL = 0xD,
8462306a36Sopenharmony_ci	/* shared by x25519 and x448, but x448 is not supported now */
8562306a36Sopenharmony_ci	HPRE_ALG_CURVE25519_MUL = 0x10,
8662306a36Sopenharmony_ci};
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_cistruct hpre_sqe {
8962306a36Sopenharmony_ci	__le32 dw0;
9062306a36Sopenharmony_ci	__u8 task_len1;
9162306a36Sopenharmony_ci	__u8 task_len2;
9262306a36Sopenharmony_ci	__u8 mrttest_num;
9362306a36Sopenharmony_ci	__u8 resv1;
9462306a36Sopenharmony_ci	__le64 key;
9562306a36Sopenharmony_ci	__le64 in;
9662306a36Sopenharmony_ci	__le64 out;
9762306a36Sopenharmony_ci	__le16 tag;
9862306a36Sopenharmony_ci	__le16 resv2;
9962306a36Sopenharmony_ci#define _HPRE_SQE_ALIGN_EXT	7
10062306a36Sopenharmony_ci	__le32 rsvd1[_HPRE_SQE_ALIGN_EXT];
10162306a36Sopenharmony_ci};
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_cistruct hisi_qp *hpre_create_qp(u8 type);
10462306a36Sopenharmony_ciint hpre_algs_register(struct hisi_qm *qm);
10562306a36Sopenharmony_civoid hpre_algs_unregister(struct hisi_qm *qm);
10662306a36Sopenharmony_cibool hpre_check_alg_support(struct hisi_qm *qm, u32 alg);
10762306a36Sopenharmony_ci#endif
108