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