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 7ff5812e0SShameer Kolothum #include <linux/hisi_acc_qm.h> 8416d8220SZaibo Xu #include "sec_crypto.h" 9416d8220SZaibo Xu 10a181647cSZaibo Xu /* Algorithm resource per hardware SEC queue */ 11a181647cSZaibo Xu struct sec_alg_res { 1274b58db8SLongfang Liu u8 *pbuf; 1374b58db8SLongfang Liu dma_addr_t pbuf_dma; 14416d8220SZaibo Xu u8 *c_ivin; 15416d8220SZaibo Xu dma_addr_t c_ivin_dma; 16c16a70c1SKai Ye u8 *a_ivin; 17c16a70c1SKai Ye dma_addr_t a_ivin_dma; 182f072d75SZaibo Xu u8 *out_mac; 192f072d75SZaibo Xu dma_addr_t out_mac_dma; 20129a9f34SWeili Qian u16 depth; 21416d8220SZaibo Xu }; 22416d8220SZaibo Xu 23416d8220SZaibo Xu /* Cipher request of SEC private */ 24416d8220SZaibo Xu struct sec_cipher_req { 25416d8220SZaibo Xu struct hisi_acc_hw_sgl *c_out; 26416d8220SZaibo Xu dma_addr_t c_out_dma; 272514f559SLongfang Liu u8 *c_ivin; 282514f559SLongfang Liu dma_addr_t c_ivin_dma; 29416d8220SZaibo Xu struct skcipher_request *sk_req; 30416d8220SZaibo Xu u32 c_len; 31416d8220SZaibo Xu bool encrypt; 32416d8220SZaibo Xu }; 33416d8220SZaibo Xu 342f072d75SZaibo Xu struct sec_aead_req { 352f072d75SZaibo Xu u8 *out_mac; 362f072d75SZaibo Xu dma_addr_t out_mac_dma; 37c16a70c1SKai Ye u8 *a_ivin; 38c16a70c1SKai Ye dma_addr_t a_ivin_dma; 392f072d75SZaibo Xu struct aead_request *aead_req; 402f072d75SZaibo Xu }; 412f072d75SZaibo Xu 42416d8220SZaibo Xu /* SEC request of Crypto */ 43416d8220SZaibo Xu struct sec_req { 44d5c1477bSKai Ye union { 45416d8220SZaibo Xu struct sec_sqe sec_sqe; 46d5c1477bSKai Ye struct sec_sqe3 sec_sqe3; 47d5c1477bSKai Ye }; 48416d8220SZaibo Xu struct sec_ctx *ctx; 49416d8220SZaibo Xu struct sec_qp_ctx *qp_ctx; 50416d8220SZaibo Xu 519039878aSKai Ye /** 529039878aSKai Ye * Common parameter of the SEC request. 539039878aSKai Ye */ 549039878aSKai Ye struct hisi_acc_hw_sgl *in; 559039878aSKai Ye dma_addr_t in_dma; 56416d8220SZaibo Xu struct sec_cipher_req c_req; 572f072d75SZaibo Xu struct sec_aead_req aead_req; 589597efc3SKai Ye struct list_head backlog_head; 592f072d75SZaibo Xu 60416d8220SZaibo Xu int err_type; 61416d8220SZaibo Xu int req_id; 62a44dce50SLongfang Liu u32 flag; 63416d8220SZaibo Xu 64416d8220SZaibo Xu /* Status of the SEC request */ 65ca0d158dSZaibo Xu bool fake_busy; 6674b58db8SLongfang Liu bool use_pbuf; 67416d8220SZaibo Xu }; 68416d8220SZaibo Xu 69416d8220SZaibo Xu /** 70416d8220SZaibo Xu * struct sec_req_op - Operations for SEC request 71416d8220SZaibo Xu * @buf_map: DMA map the SGL buffers of the request 72416d8220SZaibo Xu * @buf_unmap: DMA unmap the SGL buffers of the request 73416d8220SZaibo Xu * @bd_fill: Fill the SEC queue BD 74416d8220SZaibo Xu * @bd_send: Send the SEC BD into the hardware queue 75416d8220SZaibo Xu * @callback: Call back for the request 76416d8220SZaibo Xu * @process: Main processing logic of Skcipher 77416d8220SZaibo Xu */ 78416d8220SZaibo Xu struct sec_req_op { 79416d8220SZaibo Xu int (*buf_map)(struct sec_ctx *ctx, struct sec_req *req); 80416d8220SZaibo Xu void (*buf_unmap)(struct sec_ctx *ctx, struct sec_req *req); 81416d8220SZaibo Xu void (*do_transfer)(struct sec_ctx *ctx, struct sec_req *req); 82416d8220SZaibo Xu int (*bd_fill)(struct sec_ctx *ctx, struct sec_req *req); 83416d8220SZaibo Xu int (*bd_send)(struct sec_ctx *ctx, struct sec_req *req); 84310ea0acSZaibo Xu void (*callback)(struct sec_ctx *ctx, struct sec_req *req, int err); 85416d8220SZaibo Xu int (*process)(struct sec_ctx *ctx, struct sec_req *req); 86416d8220SZaibo Xu }; 87416d8220SZaibo Xu 882f072d75SZaibo Xu /* SEC auth context */ 892f072d75SZaibo Xu struct sec_auth_ctx { 902f072d75SZaibo Xu dma_addr_t a_key_dma; 912f072d75SZaibo Xu u8 *a_key; 922f072d75SZaibo Xu u8 a_key_len; 932f072d75SZaibo Xu u8 mac_len; 942f072d75SZaibo Xu u8 a_alg; 956c46a329SKai Ye bool fallback; 962f072d75SZaibo Xu struct crypto_shash *hash_tfm; 976c46a329SKai Ye struct crypto_aead *fallback_aead_tfm; 982f072d75SZaibo Xu }; 992f072d75SZaibo Xu 100416d8220SZaibo Xu /* SEC cipher context which cipher's relatives */ 101416d8220SZaibo Xu struct sec_cipher_ctx { 102416d8220SZaibo Xu u8 *c_key; 103416d8220SZaibo Xu dma_addr_t c_key_dma; 104416d8220SZaibo Xu sector_t iv_offset; 105416d8220SZaibo Xu u32 c_gran_size; 106416d8220SZaibo Xu u32 ivsize; 107416d8220SZaibo Xu u8 c_mode; 108416d8220SZaibo Xu u8 c_alg; 109416d8220SZaibo Xu u8 c_key_len; 1105652d55aSKai Ye 1115652d55aSKai Ye /* add software support */ 1125652d55aSKai Ye bool fallback; 1135652d55aSKai Ye struct crypto_sync_skcipher *fbtfm; 114416d8220SZaibo Xu }; 115416d8220SZaibo Xu 116416d8220SZaibo Xu /* SEC queue context which defines queue's relatives */ 117416d8220SZaibo Xu struct sec_qp_ctx { 118416d8220SZaibo Xu struct hisi_qp *qp; 119129a9f34SWeili Qian struct sec_req **req_list; 120416d8220SZaibo Xu struct idr req_idr; 121129a9f34SWeili Qian struct sec_alg_res *res; 122416d8220SZaibo Xu struct sec_ctx *ctx; 12302884a4fSZhengchao Shao spinlock_t req_lock; 1249597efc3SKai Ye struct list_head backlog; 125416d8220SZaibo Xu struct hisi_acc_sgl_pool *c_in_pool; 126416d8220SZaibo Xu struct hisi_acc_sgl_pool *c_out_pool; 127416d8220SZaibo Xu }; 128416d8220SZaibo Xu 1292f072d75SZaibo Xu enum sec_alg_type { 1302f072d75SZaibo Xu SEC_SKCIPHER, 1312f072d75SZaibo Xu SEC_AEAD 1322f072d75SZaibo Xu }; 1332f072d75SZaibo Xu 134416d8220SZaibo Xu /* SEC Crypto TFM context which defines queue and cipher .etc relatives */ 135416d8220SZaibo Xu struct sec_ctx { 136416d8220SZaibo Xu struct sec_qp_ctx *qp_ctx; 137416d8220SZaibo Xu struct sec_dev *sec; 138416d8220SZaibo Xu const struct sec_req_op *req_op; 1390b5e43bcSKai Ye struct hisi_qp **qps; 140416d8220SZaibo Xu 141416d8220SZaibo Xu /* Half queues for encipher, and half for decipher */ 142416d8220SZaibo Xu u32 hlf_q_num; 143416d8220SZaibo Xu 144416d8220SZaibo Xu /* Threshold for fake busy, trigger to return -EBUSY to user */ 145416d8220SZaibo Xu u32 fake_req_limit; 146416d8220SZaibo Xu 1473f3bbf22SJulia Lawall /* Current cyclic index to select a queue for encipher */ 148416d8220SZaibo Xu atomic_t enc_qcyclic; 149416d8220SZaibo Xu 1503f3bbf22SJulia Lawall /* Current cyclic index to select a queue for decipher */ 151416d8220SZaibo Xu atomic_t dec_qcyclic; 1522f072d75SZaibo Xu 1532f072d75SZaibo Xu enum sec_alg_type alg_type; 15474b58db8SLongfang Liu bool pbuf_supported; 155416d8220SZaibo Xu struct sec_cipher_ctx c_ctx; 1562f072d75SZaibo Xu struct sec_auth_ctx a_ctx; 157adc3f65aSKai Ye u8 type_supported; 158a44dce50SLongfang Liu struct device *dev; 159416d8220SZaibo Xu }; 160416d8220SZaibo Xu 161416d8220SZaibo Xu 1621e9bc276SZaibo Xu enum sec_debug_file_index { 1631e9bc276SZaibo Xu SEC_CLEAR_ENABLE, 1641e9bc276SZaibo Xu SEC_DEBUG_FILE_NUM, 1651e9bc276SZaibo Xu }; 1661e9bc276SZaibo Xu 1671e9bc276SZaibo Xu struct sec_debug_file { 1681e9bc276SZaibo Xu enum sec_debug_file_index index; 1691e9bc276SZaibo Xu spinlock_t lock; 1701e9bc276SZaibo Xu struct hisi_qm *qm; 1711e9bc276SZaibo Xu }; 1721e9bc276SZaibo Xu 1731e9bc276SZaibo Xu struct sec_dfx { 174cb1eeb75SArnd Bergmann atomic64_t send_cnt; 175cb1eeb75SArnd Bergmann atomic64_t recv_cnt; 1768213a1a6SKai Ye atomic64_t send_busy_cnt; 1779597efc3SKai Ye atomic64_t recv_busy_cnt; 1788213a1a6SKai Ye atomic64_t err_bd_cnt; 1798213a1a6SKai Ye atomic64_t invalid_req_cnt; 1808213a1a6SKai Ye atomic64_t done_flag_cnt; 1811e9bc276SZaibo Xu }; 1821e9bc276SZaibo Xu 1831e9bc276SZaibo Xu struct sec_debug { 1841e9bc276SZaibo Xu struct sec_dfx dfx; 1851e9bc276SZaibo Xu struct sec_debug_file files[SEC_DEBUG_FILE_NUM]; 1861e9bc276SZaibo Xu }; 1871e9bc276SZaibo Xu 188416d8220SZaibo Xu struct sec_dev { 189416d8220SZaibo Xu struct hisi_qm qm; 1901e9bc276SZaibo Xu struct sec_debug debug; 191416d8220SZaibo Xu u32 ctx_q_num; 1928824bc5eSLongfang Liu bool iommu_used; 193416d8220SZaibo Xu }; 194416d8220SZaibo Xu 195d90fab0dSWeili Qian enum sec_cap_type { 196d90fab0dSWeili Qian SEC_QM_NFE_MASK_CAP = 0x0, 197d90fab0dSWeili Qian SEC_QM_RESET_MASK_CAP, 198d90fab0dSWeili Qian SEC_QM_OOO_SHUTDOWN_MASK_CAP, 199d90fab0dSWeili Qian SEC_QM_CE_MASK_CAP, 200d90fab0dSWeili Qian SEC_NFE_MASK_CAP, 201d90fab0dSWeili Qian SEC_RESET_MASK_CAP, 202d90fab0dSWeili Qian SEC_OOO_SHUTDOWN_MASK_CAP, 203d90fab0dSWeili Qian SEC_CE_MASK_CAP, 204921715b6SWenkai Lin SEC_CLUSTER_NUM_CAP, 205921715b6SWenkai Lin SEC_CORE_TYPE_NUM_CAP, 206921715b6SWenkai Lin SEC_CORE_NUM_CAP, 207921715b6SWenkai Lin SEC_CORES_PER_CLUSTER_NUM_CAP, 208921715b6SWenkai Lin SEC_CORE_ENABLE_BITMAP, 209921715b6SWenkai Lin SEC_DRV_ALG_BITMAP_LOW, 210921715b6SWenkai Lin SEC_DRV_ALG_BITMAP_HIGH, 211921715b6SWenkai Lin SEC_DEV_ALG_BITMAP_LOW, 212921715b6SWenkai Lin SEC_DEV_ALG_BITMAP_HIGH, 213921715b6SWenkai Lin SEC_CORE1_ALG_BITMAP_LOW, 214921715b6SWenkai Lin SEC_CORE1_ALG_BITMAP_HIGH, 215921715b6SWenkai Lin SEC_CORE2_ALG_BITMAP_LOW, 216921715b6SWenkai Lin SEC_CORE2_ALG_BITMAP_HIGH, 217921715b6SWenkai Lin SEC_CORE3_ALG_BITMAP_LOW, 218921715b6SWenkai Lin SEC_CORE3_ALG_BITMAP_HIGH, 219921715b6SWenkai Lin SEC_CORE4_ALG_BITMAP_LOW, 220921715b6SWenkai Lin SEC_CORE4_ALG_BITMAP_HIGH, 221d90fab0dSWeili Qian }; 222d90fab0dSWeili Qian 223*b06a6d5eSZhiqi Song enum sec_cap_reg_record_idx { 224*b06a6d5eSZhiqi Song SEC_DRV_ALG_BITMAP_LOW_IDX = 0x0, 225*b06a6d5eSZhiqi Song SEC_DRV_ALG_BITMAP_HIGH_IDX, 226*b06a6d5eSZhiqi Song SEC_DEV_ALG_BITMAP_LOW_IDX, 227*b06a6d5eSZhiqi Song SEC_DEV_ALG_BITMAP_HIGH_IDX, 228*b06a6d5eSZhiqi Song }; 229*b06a6d5eSZhiqi Song 2300b5e43bcSKai Ye void sec_destroy_qps(struct hisi_qp **qps, int qp_num); 2310b5e43bcSKai Ye struct hisi_qp **sec_create_qps(void); 2328123455aSMeng Yu int sec_register_to_crypto(struct hisi_qm *qm); 2338123455aSMeng Yu void sec_unregister_from_crypto(struct hisi_qm *qm); 234921715b6SWenkai Lin u64 sec_get_alg_bitmap(struct hisi_qm *qm, u32 high, u32 low); 235416d8220SZaibo Xu #endif 236