1416d8220SZaibo Xu /* SPDX-License-Identifier: GPL-2.0 */ 2416d8220SZaibo Xu /* Copyright (c) 2019 HiSilicon Limited. */ 3416d8220SZaibo Xu 4416d8220SZaibo Xu #ifndef __HISI_SEC_V2_H 5416d8220SZaibo Xu #define __HISI_SEC_V2_H 6416d8220SZaibo Xu 7416d8220SZaibo Xu #include <linux/list.h> 8416d8220SZaibo Xu 9416d8220SZaibo Xu #include "../qm.h" 10416d8220SZaibo Xu #include "sec_crypto.h" 11416d8220SZaibo Xu 12a181647cSZaibo Xu /* Algorithm resource per hardware SEC queue */ 13a181647cSZaibo Xu struct sec_alg_res { 1474b58db8SLongfang Liu u8 *pbuf; 1574b58db8SLongfang Liu dma_addr_t pbuf_dma; 16416d8220SZaibo Xu u8 *c_ivin; 17416d8220SZaibo Xu dma_addr_t c_ivin_dma; 182f072d75SZaibo Xu u8 *out_mac; 192f072d75SZaibo Xu dma_addr_t out_mac_dma; 20416d8220SZaibo Xu }; 21416d8220SZaibo Xu 22416d8220SZaibo Xu /* Cipher request of SEC private */ 23416d8220SZaibo Xu struct sec_cipher_req { 24416d8220SZaibo Xu struct hisi_acc_hw_sgl *c_in; 25416d8220SZaibo Xu dma_addr_t c_in_dma; 26416d8220SZaibo Xu struct hisi_acc_hw_sgl *c_out; 27416d8220SZaibo Xu dma_addr_t c_out_dma; 282514f559SLongfang Liu u8 *c_ivin; 292514f559SLongfang Liu dma_addr_t c_ivin_dma; 30416d8220SZaibo Xu struct skcipher_request *sk_req; 31416d8220SZaibo Xu u32 c_len; 32416d8220SZaibo Xu bool encrypt; 33416d8220SZaibo Xu }; 34416d8220SZaibo Xu 352f072d75SZaibo Xu struct sec_aead_req { 362f072d75SZaibo Xu u8 *out_mac; 372f072d75SZaibo Xu dma_addr_t out_mac_dma; 382f072d75SZaibo Xu struct aead_request *aead_req; 392f072d75SZaibo Xu }; 402f072d75SZaibo Xu 41416d8220SZaibo Xu /* SEC request of Crypto */ 42416d8220SZaibo Xu struct sec_req { 43416d8220SZaibo Xu struct sec_sqe sec_sqe; 44416d8220SZaibo Xu struct sec_ctx *ctx; 45416d8220SZaibo Xu struct sec_qp_ctx *qp_ctx; 46416d8220SZaibo Xu 47416d8220SZaibo Xu struct sec_cipher_req c_req; 482f072d75SZaibo Xu struct sec_aead_req aead_req; 492f072d75SZaibo Xu 50416d8220SZaibo Xu int err_type; 51416d8220SZaibo Xu int req_id; 52416d8220SZaibo Xu 53416d8220SZaibo Xu /* Status of the SEC request */ 54ca0d158dSZaibo Xu bool fake_busy; 5574b58db8SLongfang Liu bool use_pbuf; 56416d8220SZaibo Xu }; 57416d8220SZaibo Xu 58416d8220SZaibo Xu /** 59416d8220SZaibo Xu * struct sec_req_op - Operations for SEC request 60416d8220SZaibo Xu * @buf_map: DMA map the SGL buffers of the request 61416d8220SZaibo Xu * @buf_unmap: DMA unmap the SGL buffers of the request 62416d8220SZaibo Xu * @bd_fill: Fill the SEC queue BD 63416d8220SZaibo Xu * @bd_send: Send the SEC BD into the hardware queue 64416d8220SZaibo Xu * @callback: Call back for the request 65416d8220SZaibo Xu * @process: Main processing logic of Skcipher 66416d8220SZaibo Xu */ 67416d8220SZaibo Xu struct sec_req_op { 68416d8220SZaibo Xu int (*buf_map)(struct sec_ctx *ctx, struct sec_req *req); 69416d8220SZaibo Xu void (*buf_unmap)(struct sec_ctx *ctx, struct sec_req *req); 70416d8220SZaibo Xu void (*do_transfer)(struct sec_ctx *ctx, struct sec_req *req); 71416d8220SZaibo Xu int (*bd_fill)(struct sec_ctx *ctx, struct sec_req *req); 72416d8220SZaibo Xu int (*bd_send)(struct sec_ctx *ctx, struct sec_req *req); 73310ea0acSZaibo Xu void (*callback)(struct sec_ctx *ctx, struct sec_req *req, int err); 74416d8220SZaibo Xu int (*process)(struct sec_ctx *ctx, struct sec_req *req); 75416d8220SZaibo Xu }; 76416d8220SZaibo Xu 772f072d75SZaibo Xu /* SEC auth context */ 782f072d75SZaibo Xu struct sec_auth_ctx { 792f072d75SZaibo Xu dma_addr_t a_key_dma; 802f072d75SZaibo Xu u8 *a_key; 812f072d75SZaibo Xu u8 a_key_len; 822f072d75SZaibo Xu u8 mac_len; 832f072d75SZaibo Xu u8 a_alg; 842f072d75SZaibo Xu struct crypto_shash *hash_tfm; 852f072d75SZaibo Xu }; 862f072d75SZaibo Xu 87416d8220SZaibo Xu /* SEC cipher context which cipher's relatives */ 88416d8220SZaibo Xu struct sec_cipher_ctx { 89416d8220SZaibo Xu u8 *c_key; 90416d8220SZaibo Xu dma_addr_t c_key_dma; 91416d8220SZaibo Xu sector_t iv_offset; 92416d8220SZaibo Xu u32 c_gran_size; 93416d8220SZaibo Xu u32 ivsize; 94416d8220SZaibo Xu u8 c_mode; 95416d8220SZaibo Xu u8 c_alg; 96416d8220SZaibo Xu u8 c_key_len; 97416d8220SZaibo Xu }; 98416d8220SZaibo Xu 99416d8220SZaibo Xu /* SEC queue context which defines queue's relatives */ 100416d8220SZaibo Xu struct sec_qp_ctx { 101416d8220SZaibo Xu struct hisi_qp *qp; 1027c7d902aSZaibo Xu struct sec_req *req_list[QM_Q_DEPTH]; 103416d8220SZaibo Xu struct idr req_idr; 1047c7d902aSZaibo Xu struct sec_alg_res res[QM_Q_DEPTH]; 105416d8220SZaibo Xu struct sec_ctx *ctx; 106416d8220SZaibo Xu struct mutex req_lock; 107416d8220SZaibo Xu struct hisi_acc_sgl_pool *c_in_pool; 108416d8220SZaibo Xu struct hisi_acc_sgl_pool *c_out_pool; 109416d8220SZaibo Xu atomic_t pending_reqs; 110416d8220SZaibo Xu }; 111416d8220SZaibo Xu 1122f072d75SZaibo Xu enum sec_alg_type { 1132f072d75SZaibo Xu SEC_SKCIPHER, 1142f072d75SZaibo Xu SEC_AEAD 1152f072d75SZaibo Xu }; 1162f072d75SZaibo Xu 117416d8220SZaibo Xu /* SEC Crypto TFM context which defines queue and cipher .etc relatives */ 118416d8220SZaibo Xu struct sec_ctx { 119416d8220SZaibo Xu struct sec_qp_ctx *qp_ctx; 120416d8220SZaibo Xu struct sec_dev *sec; 121416d8220SZaibo Xu const struct sec_req_op *req_op; 1220b5e43bcSKai Ye struct hisi_qp **qps; 123416d8220SZaibo Xu 124416d8220SZaibo Xu /* Half queues for encipher, and half for decipher */ 125416d8220SZaibo Xu u32 hlf_q_num; 126416d8220SZaibo Xu 127416d8220SZaibo Xu /* Threshold for fake busy, trigger to return -EBUSY to user */ 128416d8220SZaibo Xu u32 fake_req_limit; 129416d8220SZaibo Xu 130416d8220SZaibo Xu /* Currrent cyclic index to select a queue for encipher */ 131416d8220SZaibo Xu atomic_t enc_qcyclic; 132416d8220SZaibo Xu 133416d8220SZaibo Xu /* Currrent cyclic index to select a queue for decipher */ 134416d8220SZaibo Xu atomic_t dec_qcyclic; 1352f072d75SZaibo Xu 1362f072d75SZaibo Xu enum sec_alg_type alg_type; 13774b58db8SLongfang Liu bool pbuf_supported; 138416d8220SZaibo Xu struct sec_cipher_ctx c_ctx; 1392f072d75SZaibo Xu struct sec_auth_ctx a_ctx; 140416d8220SZaibo Xu }; 141416d8220SZaibo Xu 142416d8220SZaibo Xu enum sec_endian { 143416d8220SZaibo Xu SEC_LE = 0, 144416d8220SZaibo Xu SEC_32BE, 145416d8220SZaibo Xu SEC_64BE 146416d8220SZaibo Xu }; 147416d8220SZaibo Xu 1481e9bc276SZaibo Xu enum sec_debug_file_index { 1491e9bc276SZaibo Xu SEC_CURRENT_QM, 1501e9bc276SZaibo Xu SEC_CLEAR_ENABLE, 1511e9bc276SZaibo Xu SEC_DEBUG_FILE_NUM, 1521e9bc276SZaibo Xu }; 1531e9bc276SZaibo Xu 1541e9bc276SZaibo Xu struct sec_debug_file { 1551e9bc276SZaibo Xu enum sec_debug_file_index index; 1561e9bc276SZaibo Xu spinlock_t lock; 1571e9bc276SZaibo Xu struct hisi_qm *qm; 1581e9bc276SZaibo Xu }; 1591e9bc276SZaibo Xu 1601e9bc276SZaibo Xu struct sec_dfx { 161cb1eeb75SArnd Bergmann atomic64_t send_cnt; 162cb1eeb75SArnd Bergmann atomic64_t recv_cnt; 1631e9bc276SZaibo Xu }; 1641e9bc276SZaibo Xu 1651e9bc276SZaibo Xu struct sec_debug { 1661e9bc276SZaibo Xu struct sec_dfx dfx; 1671e9bc276SZaibo Xu struct sec_debug_file files[SEC_DEBUG_FILE_NUM]; 1681e9bc276SZaibo Xu }; 1691e9bc276SZaibo Xu 170416d8220SZaibo Xu struct sec_dev { 171416d8220SZaibo Xu struct hisi_qm qm; 1721e9bc276SZaibo Xu struct sec_debug debug; 173416d8220SZaibo Xu u32 ctx_q_num; 1748824bc5eSLongfang Liu bool iommu_used; 17573bcb049SZaibo Xu u32 num_vfs; 176416d8220SZaibo Xu unsigned long status; 177416d8220SZaibo Xu }; 178416d8220SZaibo Xu 1790b5e43bcSKai Ye void sec_destroy_qps(struct hisi_qp **qps, int qp_num); 1800b5e43bcSKai Ye struct hisi_qp **sec_create_qps(void); 181416d8220SZaibo Xu int sec_register_to_crypto(void); 182416d8220SZaibo Xu void sec_unregister_from_crypto(void); 183416d8220SZaibo Xu #endif 184