xref: /openbmc/linux/drivers/crypto/marvell/octeontx2/otx2_cpt_reqmgr.h (revision d0034a7a4ac7fae708146ac0059b9c47a1543f0d)
178506c2aSSrujana Challa /* SPDX-License-Identifier: GPL-2.0-only
278506c2aSSrujana Challa  * Copyright (C) 2020 Marvell.
378506c2aSSrujana Challa  */
478506c2aSSrujana Challa 
578506c2aSSrujana Challa #ifndef __OTX2_CPT_REQMGR_H
678506c2aSSrujana Challa #define __OTX2_CPT_REQMGR_H
778506c2aSSrujana Challa 
878506c2aSSrujana Challa #include "otx2_cpt_common.h"
978506c2aSSrujana Challa 
1078506c2aSSrujana Challa /* Completion code size and initial value */
1178506c2aSSrujana Challa #define OTX2_CPT_COMPLETION_CODE_SIZE 8
1278506c2aSSrujana Challa #define OTX2_CPT_COMPLETION_CODE_INIT OTX2_CPT_COMP_E_NOTDONE
138ec8015aSSrujana Challa /*
148ec8015aSSrujana Challa  * Maximum total number of SG buffers is 100, we divide it equally
158ec8015aSSrujana Challa  * between input and output
168ec8015aSSrujana Challa  */
178ec8015aSSrujana Challa #define OTX2_CPT_MAX_SG_IN_CNT  50
188ec8015aSSrujana Challa #define OTX2_CPT_MAX_SG_OUT_CNT 50
198ec8015aSSrujana Challa 
208ec8015aSSrujana Challa /* DMA mode direct or SG */
218ec8015aSSrujana Challa #define OTX2_CPT_DMA_MODE_DIRECT 0
228ec8015aSSrujana Challa #define OTX2_CPT_DMA_MODE_SG     1
238ec8015aSSrujana Challa 
248ec8015aSSrujana Challa /* Context source CPTR or DPTR */
258ec8015aSSrujana Challa #define OTX2_CPT_FROM_CPTR 0
268ec8015aSSrujana Challa #define OTX2_CPT_FROM_DPTR 1
278ec8015aSSrujana Challa 
288ec8015aSSrujana Challa #define OTX2_CPT_MAX_REQ_SIZE 65535
2978506c2aSSrujana Challa 
3078506c2aSSrujana Challa union otx2_cpt_opcode {
3178506c2aSSrujana Challa 	u16 flags;
3278506c2aSSrujana Challa 	struct {
3378506c2aSSrujana Challa 		u8 major;
3478506c2aSSrujana Challa 		u8 minor;
3578506c2aSSrujana Challa 	} s;
3678506c2aSSrujana Challa };
3778506c2aSSrujana Challa 
388ec8015aSSrujana Challa struct otx2_cptvf_request {
398ec8015aSSrujana Challa 	u32 param1;
408ec8015aSSrujana Challa 	u32 param2;
418ec8015aSSrujana Challa 	u16 dlen;
428ec8015aSSrujana Challa 	union otx2_cpt_opcode opcode;
438ec8015aSSrujana Challa };
448ec8015aSSrujana Challa 
4578506c2aSSrujana Challa /*
4678506c2aSSrujana Challa  * CPT_INST_S software command definitions
4778506c2aSSrujana Challa  * Words EI (0-3)
4878506c2aSSrujana Challa  */
4978506c2aSSrujana Challa union otx2_cpt_iq_cmd_word0 {
5078506c2aSSrujana Challa 	u64 u;
5178506c2aSSrujana Challa 	struct {
5278506c2aSSrujana Challa 		__be16 opcode;
5378506c2aSSrujana Challa 		__be16 param1;
5478506c2aSSrujana Challa 		__be16 param2;
5578506c2aSSrujana Challa 		__be16 dlen;
5678506c2aSSrujana Challa 	} s;
5778506c2aSSrujana Challa };
5878506c2aSSrujana Challa 
5978506c2aSSrujana Challa union otx2_cpt_iq_cmd_word3 {
6078506c2aSSrujana Challa 	u64 u;
6178506c2aSSrujana Challa 	struct {
6278506c2aSSrujana Challa 		u64 cptr:61;
6378506c2aSSrujana Challa 		u64 grp:3;
6478506c2aSSrujana Challa 	} s;
6578506c2aSSrujana Challa };
6678506c2aSSrujana Challa 
6778506c2aSSrujana Challa struct otx2_cpt_iq_command {
6878506c2aSSrujana Challa 	union otx2_cpt_iq_cmd_word0 cmd;
6978506c2aSSrujana Challa 	u64 dptr;
7078506c2aSSrujana Challa 	u64 rptr;
7178506c2aSSrujana Challa 	union otx2_cpt_iq_cmd_word3 cptr;
7278506c2aSSrujana Challa };
7378506c2aSSrujana Challa 
748ec8015aSSrujana Challa struct otx2_cpt_pending_entry {
758ec8015aSSrujana Challa 	void *completion_addr;	/* Completion address */
768ec8015aSSrujana Challa 	void *info;
778ec8015aSSrujana Challa 	/* Kernel async request callback */
788ec8015aSSrujana Challa 	void (*callback)(int status, void *arg1, void *arg2);
798ec8015aSSrujana Challa 	struct crypto_async_request *areq; /* Async request callback arg */
808ec8015aSSrujana Challa 	u8 resume_sender;	/* Notify sender to resume sending requests */
818ec8015aSSrujana Challa 	u8 busy;		/* Entry status (free/busy) */
828ec8015aSSrujana Challa };
838ec8015aSSrujana Challa 
848ec8015aSSrujana Challa struct otx2_cpt_pending_queue {
858ec8015aSSrujana Challa 	struct otx2_cpt_pending_entry *head; /* Head of the queue */
868ec8015aSSrujana Challa 	u32 front;		/* Process work from here */
878ec8015aSSrujana Challa 	u32 rear;		/* Append new work here */
888ec8015aSSrujana Challa 	u32 pending_count;	/* Pending requests count */
898ec8015aSSrujana Challa 	u32 qlen;		/* Queue length */
908ec8015aSSrujana Challa 	spinlock_t lock;	/* Queue lock */
918ec8015aSSrujana Challa };
928ec8015aSSrujana Challa 
938ec8015aSSrujana Challa struct otx2_cpt_buf_ptr {
948ec8015aSSrujana Challa 	u8 *vptr;
958ec8015aSSrujana Challa 	dma_addr_t dma_addr;
968ec8015aSSrujana Challa 	u16 size;
978ec8015aSSrujana Challa };
988ec8015aSSrujana Challa 
998ec8015aSSrujana Challa union otx2_cpt_ctrl_info {
1008ec8015aSSrujana Challa 	u32 flags;
1018ec8015aSSrujana Challa 	struct {
1028ec8015aSSrujana Challa #if defined(__BIG_ENDIAN_BITFIELD)
1038ec8015aSSrujana Challa 		u32 reserved_6_31:26;
1048ec8015aSSrujana Challa 		u32 grp:3;	/* Group bits */
1058ec8015aSSrujana Challa 		u32 dma_mode:2;	/* DMA mode */
1068ec8015aSSrujana Challa 		u32 se_req:1;	/* To SE core */
1078ec8015aSSrujana Challa #else
1088ec8015aSSrujana Challa 		u32 se_req:1;	/* To SE core */
1098ec8015aSSrujana Challa 		u32 dma_mode:2;	/* DMA mode */
1108ec8015aSSrujana Challa 		u32 grp:3;	/* Group bits */
1118ec8015aSSrujana Challa 		u32 reserved_6_31:26;
1128ec8015aSSrujana Challa #endif
1138ec8015aSSrujana Challa 	} s;
1148ec8015aSSrujana Challa };
1158ec8015aSSrujana Challa 
1168ec8015aSSrujana Challa struct otx2_cpt_req_info {
1178ec8015aSSrujana Challa 	/* Kernel async request callback */
1188ec8015aSSrujana Challa 	void (*callback)(int status, void *arg1, void *arg2);
1198ec8015aSSrujana Challa 	struct crypto_async_request *areq; /* Async request callback arg */
1208ec8015aSSrujana Challa 	struct otx2_cptvf_request req;/* Request information (core specific) */
1218ec8015aSSrujana Challa 	union otx2_cpt_ctrl_info ctrl;/* User control information */
1228ec8015aSSrujana Challa 	struct otx2_cpt_buf_ptr in[OTX2_CPT_MAX_SG_IN_CNT];
1238ec8015aSSrujana Challa 	struct otx2_cpt_buf_ptr out[OTX2_CPT_MAX_SG_OUT_CNT];
1248ec8015aSSrujana Challa 	u8 *iv_out;     /* IV to send back */
1258ec8015aSSrujana Challa 	u16 rlen;	/* Output length */
1268ec8015aSSrujana Challa 	u8 in_cnt;	/* Number of input buffers */
1278ec8015aSSrujana Challa 	u8 out_cnt;	/* Number of output buffers */
1288ec8015aSSrujana Challa 	u8 req_type;	/* Type of request */
1298ec8015aSSrujana Challa 	u8 is_enc;	/* Is a request an encryption request */
1308ec8015aSSrujana Challa 	u8 is_trunc_hmac;/* Is truncated hmac used */
1318ec8015aSSrujana Challa };
1328ec8015aSSrujana Challa 
1338ec8015aSSrujana Challa struct otx2_cpt_inst_info {
1348ec8015aSSrujana Challa 	struct otx2_cpt_pending_entry *pentry;
1358ec8015aSSrujana Challa 	struct otx2_cpt_req_info *req;
1368ec8015aSSrujana Challa 	struct pci_dev *pdev;
1378ec8015aSSrujana Challa 	void *completion_addr;
1388ec8015aSSrujana Challa 	u8 *out_buffer;
1398ec8015aSSrujana Challa 	u8 *in_buffer;
1408ec8015aSSrujana Challa 	dma_addr_t dptr_baddr;
1418ec8015aSSrujana Challa 	dma_addr_t rptr_baddr;
1428ec8015aSSrujana Challa 	dma_addr_t comp_baddr;
1438ec8015aSSrujana Challa 	unsigned long time_in;
1448ec8015aSSrujana Challa 	u32 dlen;
1458ec8015aSSrujana Challa 	u32 dma_len;
1468ec8015aSSrujana Challa 	u8 extra_time;
1478ec8015aSSrujana Challa };
1488ec8015aSSrujana Challa 
1498ec8015aSSrujana Challa struct otx2_cpt_sglist_component {
1508ec8015aSSrujana Challa 	__be16 len0;
1518ec8015aSSrujana Challa 	__be16 len1;
1528ec8015aSSrujana Challa 	__be16 len2;
1538ec8015aSSrujana Challa 	__be16 len3;
1548ec8015aSSrujana Challa 	__be64 ptr0;
1558ec8015aSSrujana Challa 	__be64 ptr1;
1568ec8015aSSrujana Challa 	__be64 ptr2;
1578ec8015aSSrujana Challa 	__be64 ptr3;
1588ec8015aSSrujana Challa };
1598ec8015aSSrujana Challa 
otx2_cpt_info_destroy(struct pci_dev * pdev,struct otx2_cpt_inst_info * info)1608ec8015aSSrujana Challa static inline void otx2_cpt_info_destroy(struct pci_dev *pdev,
1618ec8015aSSrujana Challa 					 struct otx2_cpt_inst_info *info)
1628ec8015aSSrujana Challa {
1638ec8015aSSrujana Challa 	struct otx2_cpt_req_info *req;
1648ec8015aSSrujana Challa 	int i;
1658ec8015aSSrujana Challa 
1668ec8015aSSrujana Challa 	if (info->dptr_baddr)
1678ec8015aSSrujana Challa 		dma_unmap_single(&pdev->dev, info->dptr_baddr,
1688ec8015aSSrujana Challa 				 info->dma_len, DMA_BIDIRECTIONAL);
1698ec8015aSSrujana Challa 
1708ec8015aSSrujana Challa 	if (info->req) {
1718ec8015aSSrujana Challa 		req = info->req;
1728ec8015aSSrujana Challa 		for (i = 0; i < req->out_cnt; i++) {
1738ec8015aSSrujana Challa 			if (req->out[i].dma_addr)
1748ec8015aSSrujana Challa 				dma_unmap_single(&pdev->dev,
1758ec8015aSSrujana Challa 						 req->out[i].dma_addr,
1768ec8015aSSrujana Challa 						 req->out[i].size,
1778ec8015aSSrujana Challa 						 DMA_BIDIRECTIONAL);
1788ec8015aSSrujana Challa 		}
1798ec8015aSSrujana Challa 
1808ec8015aSSrujana Challa 		for (i = 0; i < req->in_cnt; i++) {
1818ec8015aSSrujana Challa 			if (req->in[i].dma_addr)
1828ec8015aSSrujana Challa 				dma_unmap_single(&pdev->dev,
1838ec8015aSSrujana Challa 						 req->in[i].dma_addr,
1848ec8015aSSrujana Challa 						 req->in[i].size,
1858ec8015aSSrujana Challa 						 DMA_BIDIRECTIONAL);
1868ec8015aSSrujana Challa 		}
1878ec8015aSSrujana Challa 	}
1888ec8015aSSrujana Challa 	kfree(info);
1898ec8015aSSrujana Challa }
1908ec8015aSSrujana Challa 
1918ec8015aSSrujana Challa struct otx2_cptlf_wqe;
1928ec8015aSSrujana Challa int otx2_cpt_do_request(struct pci_dev *pdev, struct otx2_cpt_req_info *req,
1938ec8015aSSrujana Challa 			int cpu_num);
1948ec8015aSSrujana Challa void otx2_cpt_post_process(struct otx2_cptlf_wqe *wqe);
195*6f03f0e8SSrujana Challa int otx2_cpt_get_kcrypto_eng_grp_num(struct pci_dev *pdev);
1968ec8015aSSrujana Challa 
19778506c2aSSrujana Challa #endif /* __OTX2_CPT_REQMGR_H */
198