| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* Copyright (c) 2019 HiSilicon Limited. */ |
| #ifndef __HISI_HPRE_H |
| #define __HISI_HPRE_H |
| |
| #include <linux/list.h> |
| #include <linux/hisi_acc_qm.h> |
| |
| #define HPRE_SQE_SIZE sizeof(struct hpre_sqe) |
| #define HPRE_PF_DEF_Q_NUM 64 |
| #define HPRE_PF_DEF_Q_BASE 0 |
| |
| /* |
| * type used in qm sqc DW6. |
| * 0 - Algorithm which has been supported in V2, like RSA, DH and so on; |
| * 1 - ECC algorithm in V3. |
| */ |
| #define HPRE_V2_ALG_TYPE 0 |
| #define HPRE_V3_ECC_ALG_TYPE 1 |
| |
| enum { |
| HPRE_CLUSTER0, |
| HPRE_CLUSTER1, |
| HPRE_CLUSTER2, |
| HPRE_CLUSTER3, |
| HPRE_CLUSTERS_NUM_MAX |
| }; |
| |
| enum hpre_ctrl_dbgfs_file { |
| HPRE_CLEAR_ENABLE, |
| HPRE_CLUSTER_CTRL, |
| HPRE_DEBUG_FILE_NUM, |
| }; |
| |
| enum hpre_dfx_dbgfs_file { |
| HPRE_SEND_CNT, |
| HPRE_RECV_CNT, |
| HPRE_SEND_FAIL_CNT, |
| HPRE_SEND_BUSY_CNT, |
| HPRE_OVER_THRHLD_CNT, |
| HPRE_OVERTIME_THRHLD, |
| HPRE_INVALID_REQ_CNT, |
| HPRE_DFX_FILE_NUM |
| }; |
| |
| #define HPRE_DEBUGFS_FILE_NUM (HPRE_DEBUG_FILE_NUM + HPRE_CLUSTERS_NUM_MAX - 1) |
| |
| struct hpre_debugfs_file { |
| int index; |
| enum hpre_ctrl_dbgfs_file type; |
| spinlock_t lock; |
| struct hpre_debug *debug; |
| }; |
| |
| struct hpre_dfx { |
| atomic64_t value; |
| enum hpre_dfx_dbgfs_file type; |
| }; |
| |
| /* |
| * One HPRE controller has one PF and multiple VFs, some global configurations |
| * which PF has need this structure. |
| * Just relevant for PF. |
| */ |
| struct hpre_debug { |
| struct hpre_dfx dfx[HPRE_DFX_FILE_NUM]; |
| struct hpre_debugfs_file files[HPRE_DEBUGFS_FILE_NUM]; |
| }; |
| |
| struct hpre { |
| struct hisi_qm qm; |
| struct hpre_debug debug; |
| unsigned long status; |
| }; |
| |
| enum hpre_alg_type { |
| HPRE_ALG_NC_NCRT = 0x0, |
| HPRE_ALG_NC_CRT = 0x1, |
| HPRE_ALG_KG_STD = 0x2, |
| HPRE_ALG_KG_CRT = 0x3, |
| HPRE_ALG_DH_G2 = 0x4, |
| HPRE_ALG_DH = 0x5, |
| HPRE_ALG_ECC_MUL = 0xD, |
| /* shared by x25519 and x448, but x448 is not supported now */ |
| HPRE_ALG_CURVE25519_MUL = 0x10, |
| }; |
| |
| struct hpre_sqe { |
| __le32 dw0; |
| __u8 task_len1; |
| __u8 task_len2; |
| __u8 mrttest_num; |
| __u8 resv1; |
| __le64 key; |
| __le64 in; |
| __le64 out; |
| __le16 tag; |
| __le16 resv2; |
| #define _HPRE_SQE_ALIGN_EXT 7 |
| __le32 rsvd1[_HPRE_SQE_ALIGN_EXT]; |
| }; |
| |
| struct hisi_qp *hpre_create_qp(u8 type); |
| int hpre_algs_register(struct hisi_qm *qm); |
| void hpre_algs_unregister(struct hisi_qm *qm); |
| bool hpre_check_alg_support(struct hisi_qm *qm, u32 alg); |
| #endif |