162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* Copyright (c) 2019 HiSilicon Limited. */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#ifndef __HISI_SEC_V2_H 562306a36Sopenharmony_ci#define __HISI_SEC_V2_H 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/hisi_acc_qm.h> 862306a36Sopenharmony_ci#include "sec_crypto.h" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci/* Algorithm resource per hardware SEC queue */ 1162306a36Sopenharmony_cistruct sec_alg_res { 1262306a36Sopenharmony_ci u8 *pbuf; 1362306a36Sopenharmony_ci dma_addr_t pbuf_dma; 1462306a36Sopenharmony_ci u8 *c_ivin; 1562306a36Sopenharmony_ci dma_addr_t c_ivin_dma; 1662306a36Sopenharmony_ci u8 *a_ivin; 1762306a36Sopenharmony_ci dma_addr_t a_ivin_dma; 1862306a36Sopenharmony_ci u8 *out_mac; 1962306a36Sopenharmony_ci dma_addr_t out_mac_dma; 2062306a36Sopenharmony_ci u16 depth; 2162306a36Sopenharmony_ci}; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci/* Cipher request of SEC private */ 2462306a36Sopenharmony_cistruct sec_cipher_req { 2562306a36Sopenharmony_ci struct hisi_acc_hw_sgl *c_out; 2662306a36Sopenharmony_ci dma_addr_t c_out_dma; 2762306a36Sopenharmony_ci u8 *c_ivin; 2862306a36Sopenharmony_ci dma_addr_t c_ivin_dma; 2962306a36Sopenharmony_ci struct skcipher_request *sk_req; 3062306a36Sopenharmony_ci u32 c_len; 3162306a36Sopenharmony_ci bool encrypt; 3262306a36Sopenharmony_ci}; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cistruct sec_aead_req { 3562306a36Sopenharmony_ci u8 *out_mac; 3662306a36Sopenharmony_ci dma_addr_t out_mac_dma; 3762306a36Sopenharmony_ci u8 *a_ivin; 3862306a36Sopenharmony_ci dma_addr_t a_ivin_dma; 3962306a36Sopenharmony_ci struct aead_request *aead_req; 4062306a36Sopenharmony_ci}; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci/* SEC request of Crypto */ 4362306a36Sopenharmony_cistruct sec_req { 4462306a36Sopenharmony_ci union { 4562306a36Sopenharmony_ci struct sec_sqe sec_sqe; 4662306a36Sopenharmony_ci struct sec_sqe3 sec_sqe3; 4762306a36Sopenharmony_ci }; 4862306a36Sopenharmony_ci struct sec_ctx *ctx; 4962306a36Sopenharmony_ci struct sec_qp_ctx *qp_ctx; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci /** 5262306a36Sopenharmony_ci * Common parameter of the SEC request. 5362306a36Sopenharmony_ci */ 5462306a36Sopenharmony_ci struct hisi_acc_hw_sgl *in; 5562306a36Sopenharmony_ci dma_addr_t in_dma; 5662306a36Sopenharmony_ci struct sec_cipher_req c_req; 5762306a36Sopenharmony_ci struct sec_aead_req aead_req; 5862306a36Sopenharmony_ci struct list_head backlog_head; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci int err_type; 6162306a36Sopenharmony_ci int req_id; 6262306a36Sopenharmony_ci u32 flag; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci /* Status of the SEC request */ 6562306a36Sopenharmony_ci bool fake_busy; 6662306a36Sopenharmony_ci bool use_pbuf; 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/** 7062306a36Sopenharmony_ci * struct sec_req_op - Operations for SEC request 7162306a36Sopenharmony_ci * @buf_map: DMA map the SGL buffers of the request 7262306a36Sopenharmony_ci * @buf_unmap: DMA unmap the SGL buffers of the request 7362306a36Sopenharmony_ci * @bd_fill: Fill the SEC queue BD 7462306a36Sopenharmony_ci * @bd_send: Send the SEC BD into the hardware queue 7562306a36Sopenharmony_ci * @callback: Call back for the request 7662306a36Sopenharmony_ci * @process: Main processing logic of Skcipher 7762306a36Sopenharmony_ci */ 7862306a36Sopenharmony_cistruct sec_req_op { 7962306a36Sopenharmony_ci int (*buf_map)(struct sec_ctx *ctx, struct sec_req *req); 8062306a36Sopenharmony_ci void (*buf_unmap)(struct sec_ctx *ctx, struct sec_req *req); 8162306a36Sopenharmony_ci void (*do_transfer)(struct sec_ctx *ctx, struct sec_req *req); 8262306a36Sopenharmony_ci int (*bd_fill)(struct sec_ctx *ctx, struct sec_req *req); 8362306a36Sopenharmony_ci int (*bd_send)(struct sec_ctx *ctx, struct sec_req *req); 8462306a36Sopenharmony_ci void (*callback)(struct sec_ctx *ctx, struct sec_req *req, int err); 8562306a36Sopenharmony_ci int (*process)(struct sec_ctx *ctx, struct sec_req *req); 8662306a36Sopenharmony_ci}; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci/* SEC auth context */ 8962306a36Sopenharmony_cistruct sec_auth_ctx { 9062306a36Sopenharmony_ci dma_addr_t a_key_dma; 9162306a36Sopenharmony_ci u8 *a_key; 9262306a36Sopenharmony_ci u8 a_key_len; 9362306a36Sopenharmony_ci u8 mac_len; 9462306a36Sopenharmony_ci u8 a_alg; 9562306a36Sopenharmony_ci bool fallback; 9662306a36Sopenharmony_ci struct crypto_shash *hash_tfm; 9762306a36Sopenharmony_ci struct crypto_aead *fallback_aead_tfm; 9862306a36Sopenharmony_ci}; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci/* SEC cipher context which cipher's relatives */ 10162306a36Sopenharmony_cistruct sec_cipher_ctx { 10262306a36Sopenharmony_ci u8 *c_key; 10362306a36Sopenharmony_ci dma_addr_t c_key_dma; 10462306a36Sopenharmony_ci sector_t iv_offset; 10562306a36Sopenharmony_ci u32 c_gran_size; 10662306a36Sopenharmony_ci u32 ivsize; 10762306a36Sopenharmony_ci u8 c_mode; 10862306a36Sopenharmony_ci u8 c_alg; 10962306a36Sopenharmony_ci u8 c_key_len; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci /* add software support */ 11262306a36Sopenharmony_ci bool fallback; 11362306a36Sopenharmony_ci struct crypto_sync_skcipher *fbtfm; 11462306a36Sopenharmony_ci}; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci/* SEC queue context which defines queue's relatives */ 11762306a36Sopenharmony_cistruct sec_qp_ctx { 11862306a36Sopenharmony_ci struct hisi_qp *qp; 11962306a36Sopenharmony_ci struct sec_req **req_list; 12062306a36Sopenharmony_ci struct idr req_idr; 12162306a36Sopenharmony_ci struct sec_alg_res *res; 12262306a36Sopenharmony_ci struct sec_ctx *ctx; 12362306a36Sopenharmony_ci spinlock_t req_lock; 12462306a36Sopenharmony_ci struct list_head backlog; 12562306a36Sopenharmony_ci struct hisi_acc_sgl_pool *c_in_pool; 12662306a36Sopenharmony_ci struct hisi_acc_sgl_pool *c_out_pool; 12762306a36Sopenharmony_ci}; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_cienum sec_alg_type { 13062306a36Sopenharmony_ci SEC_SKCIPHER, 13162306a36Sopenharmony_ci SEC_AEAD 13262306a36Sopenharmony_ci}; 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci/* SEC Crypto TFM context which defines queue and cipher .etc relatives */ 13562306a36Sopenharmony_cistruct sec_ctx { 13662306a36Sopenharmony_ci struct sec_qp_ctx *qp_ctx; 13762306a36Sopenharmony_ci struct sec_dev *sec; 13862306a36Sopenharmony_ci const struct sec_req_op *req_op; 13962306a36Sopenharmony_ci struct hisi_qp **qps; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci /* Half queues for encipher, and half for decipher */ 14262306a36Sopenharmony_ci u32 hlf_q_num; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci /* Threshold for fake busy, trigger to return -EBUSY to user */ 14562306a36Sopenharmony_ci u32 fake_req_limit; 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci /* Current cyclic index to select a queue for encipher */ 14862306a36Sopenharmony_ci atomic_t enc_qcyclic; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci /* Current cyclic index to select a queue for decipher */ 15162306a36Sopenharmony_ci atomic_t dec_qcyclic; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci enum sec_alg_type alg_type; 15462306a36Sopenharmony_ci bool pbuf_supported; 15562306a36Sopenharmony_ci struct sec_cipher_ctx c_ctx; 15662306a36Sopenharmony_ci struct sec_auth_ctx a_ctx; 15762306a36Sopenharmony_ci u8 type_supported; 15862306a36Sopenharmony_ci struct device *dev; 15962306a36Sopenharmony_ci}; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_cienum sec_debug_file_index { 16362306a36Sopenharmony_ci SEC_CLEAR_ENABLE, 16462306a36Sopenharmony_ci SEC_DEBUG_FILE_NUM, 16562306a36Sopenharmony_ci}; 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_cistruct sec_debug_file { 16862306a36Sopenharmony_ci enum sec_debug_file_index index; 16962306a36Sopenharmony_ci spinlock_t lock; 17062306a36Sopenharmony_ci struct hisi_qm *qm; 17162306a36Sopenharmony_ci}; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_cistruct sec_dfx { 17462306a36Sopenharmony_ci atomic64_t send_cnt; 17562306a36Sopenharmony_ci atomic64_t recv_cnt; 17662306a36Sopenharmony_ci atomic64_t send_busy_cnt; 17762306a36Sopenharmony_ci atomic64_t recv_busy_cnt; 17862306a36Sopenharmony_ci atomic64_t err_bd_cnt; 17962306a36Sopenharmony_ci atomic64_t invalid_req_cnt; 18062306a36Sopenharmony_ci atomic64_t done_flag_cnt; 18162306a36Sopenharmony_ci}; 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_cistruct sec_debug { 18462306a36Sopenharmony_ci struct sec_dfx dfx; 18562306a36Sopenharmony_ci struct sec_debug_file files[SEC_DEBUG_FILE_NUM]; 18662306a36Sopenharmony_ci}; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_cistruct sec_dev { 18962306a36Sopenharmony_ci struct hisi_qm qm; 19062306a36Sopenharmony_ci struct sec_debug debug; 19162306a36Sopenharmony_ci u32 ctx_q_num; 19262306a36Sopenharmony_ci bool iommu_used; 19362306a36Sopenharmony_ci}; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_cienum sec_cap_type { 19662306a36Sopenharmony_ci SEC_QM_NFE_MASK_CAP = 0x0, 19762306a36Sopenharmony_ci SEC_QM_RESET_MASK_CAP, 19862306a36Sopenharmony_ci SEC_QM_OOO_SHUTDOWN_MASK_CAP, 19962306a36Sopenharmony_ci SEC_QM_CE_MASK_CAP, 20062306a36Sopenharmony_ci SEC_NFE_MASK_CAP, 20162306a36Sopenharmony_ci SEC_RESET_MASK_CAP, 20262306a36Sopenharmony_ci SEC_OOO_SHUTDOWN_MASK_CAP, 20362306a36Sopenharmony_ci SEC_CE_MASK_CAP, 20462306a36Sopenharmony_ci SEC_CLUSTER_NUM_CAP, 20562306a36Sopenharmony_ci SEC_CORE_TYPE_NUM_CAP, 20662306a36Sopenharmony_ci SEC_CORE_NUM_CAP, 20762306a36Sopenharmony_ci SEC_CORES_PER_CLUSTER_NUM_CAP, 20862306a36Sopenharmony_ci SEC_CORE_ENABLE_BITMAP, 20962306a36Sopenharmony_ci SEC_DRV_ALG_BITMAP_LOW, 21062306a36Sopenharmony_ci SEC_DRV_ALG_BITMAP_HIGH, 21162306a36Sopenharmony_ci SEC_DEV_ALG_BITMAP_LOW, 21262306a36Sopenharmony_ci SEC_DEV_ALG_BITMAP_HIGH, 21362306a36Sopenharmony_ci SEC_CORE1_ALG_BITMAP_LOW, 21462306a36Sopenharmony_ci SEC_CORE1_ALG_BITMAP_HIGH, 21562306a36Sopenharmony_ci SEC_CORE2_ALG_BITMAP_LOW, 21662306a36Sopenharmony_ci SEC_CORE2_ALG_BITMAP_HIGH, 21762306a36Sopenharmony_ci SEC_CORE3_ALG_BITMAP_LOW, 21862306a36Sopenharmony_ci SEC_CORE3_ALG_BITMAP_HIGH, 21962306a36Sopenharmony_ci SEC_CORE4_ALG_BITMAP_LOW, 22062306a36Sopenharmony_ci SEC_CORE4_ALG_BITMAP_HIGH, 22162306a36Sopenharmony_ci}; 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_cienum sec_cap_reg_record_idx { 22462306a36Sopenharmony_ci SEC_DRV_ALG_BITMAP_LOW_IDX = 0x0, 22562306a36Sopenharmony_ci SEC_DRV_ALG_BITMAP_HIGH_IDX, 22662306a36Sopenharmony_ci SEC_DEV_ALG_BITMAP_LOW_IDX, 22762306a36Sopenharmony_ci SEC_DEV_ALG_BITMAP_HIGH_IDX, 22862306a36Sopenharmony_ci}; 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_civoid sec_destroy_qps(struct hisi_qp **qps, int qp_num); 23162306a36Sopenharmony_cistruct hisi_qp **sec_create_qps(void); 23262306a36Sopenharmony_ciint sec_register_to_crypto(struct hisi_qm *qm); 23362306a36Sopenharmony_civoid sec_unregister_from_crypto(struct hisi_qm *qm); 23462306a36Sopenharmony_ciu64 sec_get_alg_bitmap(struct hisi_qm *qm, u32 high, u32 low); 23562306a36Sopenharmony_ci#endif 236