1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2019 Marvell International Ltd.
5 #include <rte_cryptodev.h>
6 #include <rte_malloc.h>
9 #include "nitrox_hal.h"
10 #include "nitrox_logs.h"
12 #define MAX_CMD_QLEN 16384
13 #define CMDQ_PKT_IN_ALIGN 16
16 nitrox_setup_cmdq(struct nitrox_qp *qp, uint8_t *bar_addr,
17 const char *dev_name, uint8_t instr_size, int socket_id)
19 char mz_name[RTE_MEMZONE_NAMESIZE];
20 const struct rte_memzone *mz;
21 size_t cmdq_size = qp->count * instr_size;
24 snprintf(mz_name, sizeof(mz_name), "%s_cmdq_%d", dev_name, qp->qno);
25 mz = rte_memzone_reserve_aligned(mz_name, cmdq_size, socket_id,
26 RTE_MEMZONE_SIZE_HINT_ONLY |
30 NITROX_LOG(ERR, "cmdq memzone reserve failed for %s queue\n",
36 offset = NPS_PKT_IN_INSTR_BAOFF_DBELLX(qp->qno);
37 qp->cmdq.dbell_csr_addr = NITROX_CSR_ADDR(bar_addr, offset);
38 qp->cmdq.ring = mz->addr;
39 qp->cmdq.instr_size = instr_size;
40 setup_nps_pkt_input_ring(bar_addr, qp->qno, qp->count, mz->iova);
41 setup_nps_pkt_solicit_output_port(bar_addr, qp->qno);
47 nitrox_setup_ridq(struct nitrox_qp *qp, int socket_id)
49 size_t ridq_size = qp->count * sizeof(*qp->ridq);
51 qp->ridq = rte_zmalloc_socket("nitrox ridq", ridq_size,
55 NITROX_LOG(ERR, "Failed to create rid queue\n");
63 nitrox_release_cmdq(struct nitrox_qp *qp, uint8_t *bar_addr)
65 nps_pkt_solicited_port_disable(bar_addr, qp->qno);
66 nps_pkt_input_ring_disable(bar_addr, qp->qno);
67 return rte_memzone_free(qp->cmdq.mz);
71 nitrox_qp_setup(struct nitrox_qp *qp, uint8_t *bar_addr, const char *dev_name,
72 uint32_t nb_descriptors, uint8_t instr_size, int socket_id)
77 count = rte_align32pow2(nb_descriptors);
78 if (count > MAX_CMD_QLEN) {
79 NITROX_LOG(ERR, "%s: Number of descriptors too big %d,"
80 " greater than max queue length %d\n",
87 qp->head = qp->tail = 0;
88 rte_atomic16_init(&qp->pending_count);
89 err = nitrox_setup_cmdq(qp, bar_addr, dev_name, instr_size, socket_id);
93 err = nitrox_setup_ridq(qp, socket_id);
100 nitrox_release_cmdq(qp, bar_addr);
105 nitrox_release_ridq(struct nitrox_qp *qp)
111 nitrox_qp_release(struct nitrox_qp *qp, uint8_t *bar_addr)
113 nitrox_release_ridq(qp);
114 return nitrox_release_cmdq(qp, bar_addr);