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