Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(C) 2019 Marvell International Ltd.
3 : : */
4 : :
5 : : #include <rte_cryptodev.h>
6 : : #include <rte_malloc.h>
7 : :
8 : : #include "nitrox_qp.h"
9 : : #include "nitrox_hal.h"
10 : : #include "nitrox_logs.h"
11 : :
12 : : #define MAX_CMD_QLEN 16384
13 : : #define CMDQ_PKT_IN_ALIGN 16
14 : :
15 : : static int
16 : 0 : nitrox_setup_cmdq(struct nitrox_qp *qp, uint8_t *bar_addr,
17 : : const char *dev_name, uint8_t instr_size, int socket_id)
18 : : {
19 : : char mz_name[RTE_MEMZONE_NAMESIZE];
20 : : const struct rte_memzone *mz;
21 : 0 : size_t cmdq_size = qp->count * instr_size;
22 : : uint64_t offset;
23 : :
24 : 0 : snprintf(mz_name, sizeof(mz_name), "%s_cmdq_%d", dev_name, qp->qno);
25 : 0 : mz = rte_memzone_reserve_aligned(mz_name, cmdq_size, socket_id,
26 : : RTE_MEMZONE_SIZE_HINT_ONLY |
27 : : RTE_MEMZONE_256MB,
28 : : CMDQ_PKT_IN_ALIGN);
29 [ # # ]: 0 : if (!mz) {
30 : 0 : NITROX_LOG(ERR, "cmdq memzone reserve failed for %s queue\n",
31 : : mz_name);
32 : 0 : return -ENOMEM;
33 : : }
34 : :
35 : 0 : qp->cmdq.mz = mz;
36 : 0 : offset = NPS_PKT_IN_INSTR_BAOFF_DBELLX(qp->qno);
37 : 0 : qp->cmdq.dbell_csr_addr = NITROX_CSR_ADDR(bar_addr, offset);
38 : 0 : qp->cmdq.ring = mz->addr;
39 : 0 : qp->cmdq.instr_size = instr_size;
40 : 0 : setup_nps_pkt_input_ring(bar_addr, qp->qno, qp->count, mz->iova);
41 : 0 : setup_nps_pkt_solicit_output_port(bar_addr, qp->qno);
42 : :
43 : 0 : return 0;
44 : : }
45 : :
46 : : static int
47 : 0 : nitrox_setup_ridq(struct nitrox_qp *qp, int socket_id)
48 : : {
49 : 0 : size_t ridq_size = qp->count * sizeof(*qp->ridq);
50 : :
51 : 0 : qp->ridq = rte_zmalloc_socket("nitrox ridq", ridq_size,
52 : : RTE_CACHE_LINE_SIZE,
53 : : socket_id);
54 [ # # ]: 0 : if (!qp->ridq) {
55 : 0 : NITROX_LOG(ERR, "Failed to create rid queue\n");
56 : 0 : return -ENOMEM;
57 : : }
58 : :
59 : : return 0;
60 : : }
61 : :
62 : : static int
63 : 0 : nitrox_release_cmdq(struct nitrox_qp *qp, uint8_t *bar_addr)
64 : : {
65 : 0 : nps_pkt_solicited_port_disable(bar_addr, qp->qno);
66 : 0 : nps_pkt_input_ring_disable(bar_addr, qp->qno);
67 : 0 : return rte_memzone_free(qp->cmdq.mz);
68 : : }
69 : :
70 : : int
71 [ # # ]: 0 : 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)
73 : : {
74 : : int err;
75 : : uint32_t count;
76 : :
77 : : count = rte_align32pow2(nb_descriptors);
78 [ # # ]: 0 : if (count > MAX_CMD_QLEN) {
79 : 0 : NITROX_LOG(ERR, "%s: Number of descriptors too big %d,"
80 : : " greater than max queue length %d\n",
81 : : dev_name, count,
82 : : MAX_CMD_QLEN);
83 : 0 : return -EINVAL;
84 : : }
85 : :
86 : 0 : qp->count = count;
87 : 0 : qp->head = qp->tail = 0;
88 : : rte_atomic16_init(&qp->pending_count);
89 : 0 : err = nitrox_setup_cmdq(qp, bar_addr, dev_name, instr_size, socket_id);
90 [ # # ]: 0 : if (err)
91 : : return err;
92 : :
93 : 0 : err = nitrox_setup_ridq(qp, socket_id);
94 [ # # ]: 0 : if (err)
95 : 0 : goto ridq_err;
96 : :
97 : : return 0;
98 : :
99 : : ridq_err:
100 : 0 : nitrox_release_cmdq(qp, bar_addr);
101 : 0 : return err;
102 : : }
103 : :
104 : : static void
105 : : nitrox_release_ridq(struct nitrox_qp *qp)
106 : : {
107 : 0 : rte_free(qp->ridq);
108 : : }
109 : :
110 : : int
111 : 0 : nitrox_qp_release(struct nitrox_qp *qp, uint8_t *bar_addr)
112 : : {
113 : : nitrox_release_ridq(qp);
114 : 0 : return nitrox_release_cmdq(qp, bar_addr);
115 : : }
|