1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2019 Marvell International Ltd.
5 #include <rte_crypto.h>
6 #include <rte_cryptodev.h>
7 #include <rte_cycles.h>
10 #include "nitrox_sym_reqmgr.h"
11 #include "nitrox_logs.h"
13 #define PENDING_SIG 0xFFFFFFFFFFFFFFFFUL
19 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
20 uint64_t raz_48_63 : 16;
25 uint64_t raz_30_31 : 2;
27 uint64_t raz_16_23 : 8;
31 uint64_t raz_16_23 : 8;
33 uint64_t raz_30_31 : 2;
38 uint64_t raz_48_63 : 16;
46 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
53 uint64_t destport : 9;
55 uint64_t raz_19_23 : 5;
65 uint64_t raz_19_23 : 5;
67 uint64_t destport : 9;
79 union slc_store_info {
82 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
83 uint64_t raz_39_63 : 25;
85 uint64_t raz_0_31 : 32;
87 uint64_t raz_0_31 : 32;
89 uint64_t raz_39_63 : 25;
95 struct nps_pkt_instr {
97 union pkt_instr_hdr ih;
99 union slc_store_info slc;
108 struct nitrox_softreq {
109 struct nitrox_crypto_ctx *ctx;
110 struct rte_crypto_op *op;
111 struct nps_pkt_instr instr;
112 struct resp_hdr resp;
118 softreq_init(struct nitrox_softreq *sr, rte_iova_t iova)
120 memset(sr, 0, sizeof(*sr));
125 process_cipher_auth_data(struct nitrox_softreq *sr)
132 process_softreq(struct nitrox_softreq *sr)
134 struct nitrox_crypto_ctx *ctx = sr->ctx;
137 switch (ctx->nitrox_chain) {
138 case NITROX_CHAIN_CIPHER_AUTH:
139 case NITROX_CHAIN_AUTH_CIPHER:
140 err = process_cipher_auth_data(sr);
151 nitrox_process_se_req(uint16_t qno, struct rte_crypto_op *op,
152 struct nitrox_crypto_ctx *ctx,
153 struct nitrox_softreq *sr)
156 softreq_init(sr, sr->iova);
160 sr->timeout = rte_get_timer_cycles() + CMD_TIMEOUT * rte_get_timer_hz();
165 nitrox_check_se_req(struct nitrox_softreq *sr, struct rte_crypto_op **op)
171 cc = *(volatile uint64_t *)(&sr->resp.completion);
172 orh = *(volatile uint64_t *)(&sr->resp.orh);
173 if (cc != PENDING_SIG)
175 else if ((orh != PENDING_SIG) && (orh & 0xff))
177 else if (rte_get_timer_cycles() >= sr->timeout)
183 NITROX_LOG(ERR, "Request err 0x%x, orh 0x%"PRIx64"\n", err,
191 nitrox_sym_instr_addr(struct nitrox_softreq *sr)
197 req_pool_obj_init(__rte_unused struct rte_mempool *mp,
198 __rte_unused void *opaque, void *obj,
199 __rte_unused unsigned int obj_idx)
201 softreq_init(obj, rte_mempool_virt2iova(obj));
205 nitrox_sym_req_pool_create(struct rte_cryptodev *cdev, uint32_t nobjs,
206 uint16_t qp_id, int socket_id)
208 char softreq_pool_name[RTE_RING_NAMESIZE];
209 struct rte_mempool *mp;
211 snprintf(softreq_pool_name, RTE_RING_NAMESIZE, "%s_sr_%d",
212 cdev->data->name, qp_id);
213 mp = rte_mempool_create(softreq_pool_name,
214 RTE_ALIGN_MUL_CEIL(nobjs, 64),
215 sizeof(struct nitrox_softreq),
216 64, 0, NULL, NULL, req_pool_obj_init, NULL,
219 NITROX_LOG(ERR, "Failed to create req pool, qid %d, err %d\n",
226 nitrox_sym_req_pool_free(struct rte_mempool *mp)
228 rte_mempool_free(mp);