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 { 14416d8220SZaibo Xu u8 *c_ivin; 15416d8220SZaibo Xu dma_addr_t c_ivin_dma; 162f072d75SZaibo Xu u8 *out_mac; 172f072d75SZaibo Xu dma_addr_t out_mac_dma; 18416d8220SZaibo Xu }; 19416d8220SZaibo Xu 20416d8220SZaibo Xu /* Cipher request of SEC private */ 21416d8220SZaibo Xu struct sec_cipher_req { 22416d8220SZaibo Xu struct hisi_acc_hw_sgl *c_in; 23416d8220SZaibo Xu dma_addr_t c_in_dma; 24416d8220SZaibo Xu struct hisi_acc_hw_sgl *c_out; 25416d8220SZaibo Xu dma_addr_t c_out_dma; 26416d8220SZaibo Xu struct skcipher_request *sk_req; 27416d8220SZaibo Xu u32 c_len; 28416d8220SZaibo Xu bool encrypt; 29416d8220SZaibo Xu }; 30416d8220SZaibo Xu 312f072d75SZaibo Xu struct sec_aead_req { 322f072d75SZaibo Xu u8 *out_mac; 332f072d75SZaibo Xu dma_addr_t out_mac_dma; 342f072d75SZaibo Xu struct aead_request *aead_req; 352f072d75SZaibo Xu }; 362f072d75SZaibo Xu 37416d8220SZaibo Xu /* SEC request of Crypto */ 38416d8220SZaibo Xu struct sec_req { 39416d8220SZaibo Xu struct sec_sqe sec_sqe; 40416d8220SZaibo Xu struct sec_ctx *ctx; 41416d8220SZaibo Xu struct sec_qp_ctx *qp_ctx; 42416d8220SZaibo Xu 43416d8220SZaibo Xu struct sec_cipher_req c_req; 442f072d75SZaibo Xu struct sec_aead_req aead_req; 452f072d75SZaibo Xu 46416d8220SZaibo Xu int err_type; 47416d8220SZaibo Xu int req_id; 48416d8220SZaibo Xu 49416d8220SZaibo Xu /* Status of the SEC request */ 50ca0d158dSZaibo Xu bool fake_busy; 51416d8220SZaibo Xu }; 52416d8220SZaibo Xu 53416d8220SZaibo Xu /** 54416d8220SZaibo Xu * struct sec_req_op - Operations for SEC request 55416d8220SZaibo Xu * @buf_map: DMA map the SGL buffers of the request 56416d8220SZaibo Xu * @buf_unmap: DMA unmap the SGL buffers of the request 57416d8220SZaibo Xu * @bd_fill: Fill the SEC queue BD 58416d8220SZaibo Xu * @bd_send: Send the SEC BD into the hardware queue 59416d8220SZaibo Xu * @callback: Call back for the request 60416d8220SZaibo Xu * @process: Main processing logic of Skcipher 61416d8220SZaibo Xu */ 62416d8220SZaibo Xu struct sec_req_op { 63416d8220SZaibo Xu int (*buf_map)(struct sec_ctx *ctx, struct sec_req *req); 64416d8220SZaibo Xu void (*buf_unmap)(struct sec_ctx *ctx, struct sec_req *req); 65416d8220SZaibo Xu void (*do_transfer)(struct sec_ctx *ctx, struct sec_req *req); 66416d8220SZaibo Xu int (*bd_fill)(struct sec_ctx *ctx, struct sec_req *req); 67416d8220SZaibo Xu int (*bd_send)(struct sec_ctx *ctx, struct sec_req *req); 68310ea0acSZaibo Xu void (*callback)(struct sec_ctx *ctx, struct sec_req *req, int err); 69416d8220SZaibo Xu int (*process)(struct sec_ctx *ctx, struct sec_req *req); 70416d8220SZaibo Xu }; 71416d8220SZaibo Xu 722f072d75SZaibo Xu /* SEC auth context */ 732f072d75SZaibo Xu struct sec_auth_ctx { 742f072d75SZaibo Xu dma_addr_t a_key_dma; 752f072d75SZaibo Xu u8 *a_key; 762f072d75SZaibo Xu u8 a_key_len; 772f072d75SZaibo Xu u8 mac_len; 782f072d75SZaibo Xu u8 a_alg; 792f072d75SZaibo Xu struct crypto_shash *hash_tfm; 802f072d75SZaibo Xu }; 812f072d75SZaibo Xu 82416d8220SZaibo Xu /* SEC cipher context which cipher's relatives */ 83416d8220SZaibo Xu struct sec_cipher_ctx { 84416d8220SZaibo Xu u8 *c_key; 85416d8220SZaibo Xu dma_addr_t c_key_dma; 86416d8220SZaibo Xu sector_t iv_offset; 87416d8220SZaibo Xu u32 c_gran_size; 88416d8220SZaibo Xu u32 ivsize; 89416d8220SZaibo Xu u8 c_mode; 90416d8220SZaibo Xu u8 c_alg; 91416d8220SZaibo Xu u8 c_key_len; 92416d8220SZaibo Xu }; 93416d8220SZaibo Xu 94416d8220SZaibo Xu /* SEC queue context which defines queue's relatives */ 95416d8220SZaibo Xu struct sec_qp_ctx { 96416d8220SZaibo Xu struct hisi_qp *qp; 977c7d902aSZaibo Xu struct sec_req *req_list[QM_Q_DEPTH]; 98416d8220SZaibo Xu struct idr req_idr; 997c7d902aSZaibo Xu struct sec_alg_res res[QM_Q_DEPTH]; 100416d8220SZaibo Xu struct sec_ctx *ctx; 101416d8220SZaibo Xu struct mutex req_lock; 102416d8220SZaibo Xu struct hisi_acc_sgl_pool *c_in_pool; 103416d8220SZaibo Xu struct hisi_acc_sgl_pool *c_out_pool; 104416d8220SZaibo Xu atomic_t pending_reqs; 105416d8220SZaibo Xu }; 106416d8220SZaibo Xu 1072f072d75SZaibo Xu enum sec_alg_type { 1082f072d75SZaibo Xu SEC_SKCIPHER, 1092f072d75SZaibo Xu SEC_AEAD 1102f072d75SZaibo Xu }; 1112f072d75SZaibo Xu 112416d8220SZaibo Xu /* SEC Crypto TFM context which defines queue and cipher .etc relatives */ 113416d8220SZaibo Xu struct sec_ctx { 114416d8220SZaibo Xu struct sec_qp_ctx *qp_ctx; 115416d8220SZaibo Xu struct sec_dev *sec; 116416d8220SZaibo Xu const struct sec_req_op *req_op; 117416d8220SZaibo Xu 118416d8220SZaibo Xu /* Half queues for encipher, and half for decipher */ 119416d8220SZaibo Xu u32 hlf_q_num; 120416d8220SZaibo Xu 121416d8220SZaibo Xu /* Threshold for fake busy, trigger to return -EBUSY to user */ 122416d8220SZaibo Xu u32 fake_req_limit; 123416d8220SZaibo Xu 124416d8220SZaibo Xu /* Currrent cyclic index to select a queue for encipher */ 125416d8220SZaibo Xu atomic_t enc_qcyclic; 126416d8220SZaibo Xu 127416d8220SZaibo Xu /* Currrent cyclic index to select a queue for decipher */ 128416d8220SZaibo Xu atomic_t dec_qcyclic; 1292f072d75SZaibo Xu 1302f072d75SZaibo Xu enum sec_alg_type alg_type; 131416d8220SZaibo Xu struct sec_cipher_ctx c_ctx; 1322f072d75SZaibo Xu struct sec_auth_ctx a_ctx; 133416d8220SZaibo Xu }; 134416d8220SZaibo Xu 135416d8220SZaibo Xu enum sec_endian { 136416d8220SZaibo Xu SEC_LE = 0, 137416d8220SZaibo Xu SEC_32BE, 138416d8220SZaibo Xu SEC_64BE 139416d8220SZaibo Xu }; 140416d8220SZaibo Xu 1411e9bc276SZaibo Xu enum sec_debug_file_index { 1421e9bc276SZaibo Xu SEC_CURRENT_QM, 1431e9bc276SZaibo Xu SEC_CLEAR_ENABLE, 1441e9bc276SZaibo Xu SEC_DEBUG_FILE_NUM, 1451e9bc276SZaibo Xu }; 1461e9bc276SZaibo Xu 1471e9bc276SZaibo Xu struct sec_debug_file { 1481e9bc276SZaibo Xu enum sec_debug_file_index index; 1491e9bc276SZaibo Xu spinlock_t lock; 1501e9bc276SZaibo Xu struct hisi_qm *qm; 1511e9bc276SZaibo Xu }; 1521e9bc276SZaibo Xu 1531e9bc276SZaibo Xu struct sec_dfx { 154cb1eeb75SArnd Bergmann atomic64_t send_cnt; 155cb1eeb75SArnd Bergmann atomic64_t recv_cnt; 1561e9bc276SZaibo Xu }; 1571e9bc276SZaibo Xu 1581e9bc276SZaibo Xu struct sec_debug { 1591e9bc276SZaibo Xu struct sec_dfx dfx; 1601e9bc276SZaibo Xu struct sec_debug_file files[SEC_DEBUG_FILE_NUM]; 1611e9bc276SZaibo Xu }; 1621e9bc276SZaibo Xu 163416d8220SZaibo Xu struct sec_dev { 164416d8220SZaibo Xu struct hisi_qm qm; 165416d8220SZaibo Xu struct list_head list; 1661e9bc276SZaibo Xu struct sec_debug debug; 167416d8220SZaibo Xu u32 ctx_q_num; 1688824bc5eSLongfang Liu bool iommu_used; 16973bcb049SZaibo Xu u32 num_vfs; 170416d8220SZaibo Xu unsigned long status; 171416d8220SZaibo Xu }; 172416d8220SZaibo Xu 173416d8220SZaibo Xu struct sec_dev *sec_find_device(int node); 174416d8220SZaibo Xu int sec_register_to_crypto(void); 175416d8220SZaibo Xu void sec_unregister_from_crypto(void); 176416d8220SZaibo Xu #endif 177