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