Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(C) 2019 Marvell International Ltd.
3 : : */
4 : :
5 : : #include <eal_export.h>
6 : : #include <rte_memzone.h>
7 : : #include <rte_malloc.h>
8 : :
9 : : #include "nitrox_qp.h"
10 : : #include "nitrox_hal.h"
11 : : #include "nitrox_logs.h"
12 : :
13 : : #define MAX_CMD_QLEN 16384
14 : : #define CMDQ_PKT_IN_ALIGN 16
15 : :
16 : : static int
17 : 0 : nitrox_setup_cmdq(struct nitrox_qp *qp, uint8_t *bar_addr,
18 : : const char *dev_name, uint8_t instr_size, int socket_id)
19 : : {
20 : : char mz_name[RTE_MEMZONE_NAMESIZE];
21 : : const struct rte_memzone *mz;
22 : 0 : size_t cmdq_size = qp->count * instr_size;
23 : : uint64_t offset;
24 : : int err = 0;
25 : :
26 : 0 : snprintf(mz_name, sizeof(mz_name), "%s_cmdq_%d", dev_name, qp->qno);
27 : 0 : mz = rte_memzone_reserve_aligned(mz_name, cmdq_size, socket_id,
28 : : RTE_MEMZONE_SIZE_HINT_ONLY |
29 : : RTE_MEMZONE_256MB,
30 : : CMDQ_PKT_IN_ALIGN);
31 [ # # ]: 0 : if (!mz) {
32 : 0 : NITROX_LOG_LINE(ERR, "cmdq memzone reserve failed for %s queue",
33 : : mz_name);
34 : 0 : return -ENOMEM;
35 : : }
36 : :
37 [ # # # ]: 0 : switch (qp->type) {
38 : 0 : case NITROX_QUEUE_SE:
39 : 0 : offset = NPS_PKT_IN_INSTR_BAOFF_DBELLX(qp->qno);
40 : 0 : qp->cmdq.dbell_csr_addr = NITROX_CSR_ADDR(bar_addr, offset);
41 : 0 : setup_nps_pkt_input_ring(bar_addr, qp->qno, qp->count,
42 : 0 : mz->iova);
43 : 0 : setup_nps_pkt_solicit_output_port(bar_addr, qp->qno);
44 : : break;
45 : 0 : case NITROX_QUEUE_ZIP:
46 : 0 : offset = ZQMQ_DRBLX(qp->qno);
47 : 0 : qp->cmdq.dbell_csr_addr = NITROX_CSR_ADDR(bar_addr, offset);
48 : 0 : err = setup_zqmq_input_ring(bar_addr, qp->qno, qp->count,
49 : 0 : mz->iova);
50 : : break;
51 : 0 : default:
52 : 0 : NITROX_LOG_LINE(ERR, "Invalid queue type %d", qp->type);
53 : : err = -EINVAL;
54 : : break;
55 : : }
56 : :
57 [ # # ]: 0 : if (err) {
58 : 0 : rte_memzone_free(mz);
59 : 0 : return err;
60 : : }
61 : :
62 : 0 : qp->cmdq.mz = mz;
63 : 0 : qp->cmdq.ring = mz->addr;
64 : 0 : qp->cmdq.instr_size = instr_size;
65 : 0 : return 0;
66 : : }
67 : :
68 : : static int
69 : 0 : nitrox_setup_ridq(struct nitrox_qp *qp, int socket_id)
70 : : {
71 : 0 : size_t ridq_size = qp->count * sizeof(*qp->ridq);
72 : :
73 : 0 : qp->ridq = rte_zmalloc_socket("nitrox ridq", ridq_size,
74 : : RTE_CACHE_LINE_SIZE,
75 : : socket_id);
76 [ # # ]: 0 : if (!qp->ridq) {
77 : 0 : NITROX_LOG_LINE(ERR, "Failed to create rid queue");
78 : 0 : return -ENOMEM;
79 : : }
80 : :
81 : : return 0;
82 : : }
83 : :
84 : : static int
85 : 0 : nitrox_release_cmdq(struct nitrox_qp *qp, uint8_t *bar_addr)
86 : : {
87 : : int err = 0;
88 : :
89 [ # # # ]: 0 : switch (qp->type) {
90 : 0 : case NITROX_QUEUE_SE:
91 : 0 : nps_pkt_solicited_port_disable(bar_addr, qp->qno);
92 : 0 : nps_pkt_input_ring_disable(bar_addr, qp->qno);
93 : : break;
94 : 0 : case NITROX_QUEUE_ZIP:
95 : 0 : err = zqmq_input_ring_disable(bar_addr, qp->qno);
96 : : break;
97 : : default:
98 : : err = -EINVAL;
99 : : }
100 : :
101 [ # # ]: 0 : if (err)
102 : 0 : return err;
103 : :
104 : 0 : return rte_memzone_free(qp->cmdq.mz);
105 : : }
106 : :
107 : : RTE_EXPORT_INTERNAL_SYMBOL(nitrox_qp_setup)
108 : : int
109 [ # # ]: 0 : nitrox_qp_setup(struct nitrox_qp *qp, uint8_t *bar_addr, const char *dev_name,
110 : : uint32_t nb_descriptors, uint8_t instr_size, int socket_id)
111 : : {
112 : : int err;
113 : : uint32_t count;
114 : :
115 : : count = rte_align32pow2(nb_descriptors);
116 [ # # ]: 0 : if (count > MAX_CMD_QLEN) {
117 : 0 : NITROX_LOG_LINE(ERR, "%s: Number of descriptors too big %d,"
118 : : " greater than max queue length %d",
119 : : dev_name, count,
120 : : MAX_CMD_QLEN);
121 : 0 : return -EINVAL;
122 : : }
123 : :
124 : 0 : qp->bar_addr = bar_addr;
125 : 0 : qp->count = count;
126 : 0 : qp->head = qp->tail = 0;
127 : 0 : rte_atomic_store_explicit(&qp->pending_count, 0,
128 : : rte_memory_order_relaxed);
129 : 0 : err = nitrox_setup_cmdq(qp, bar_addr, dev_name, instr_size, socket_id);
130 [ # # ]: 0 : if (err)
131 : : return err;
132 : :
133 : 0 : err = nitrox_setup_ridq(qp, socket_id);
134 [ # # ]: 0 : if (err)
135 : 0 : goto ridq_err;
136 : :
137 : : return 0;
138 : :
139 : : ridq_err:
140 : 0 : nitrox_release_cmdq(qp, bar_addr);
141 : 0 : return err;
142 : : }
143 : :
144 : : static void
145 : : nitrox_release_ridq(struct nitrox_qp *qp)
146 : : {
147 : 0 : rte_free(qp->ridq);
148 : : }
149 : :
150 : : RTE_EXPORT_INTERNAL_SYMBOL(nitrox_qp_release)
151 : : int
152 : 0 : nitrox_qp_release(struct nitrox_qp *qp, uint8_t *bar_addr)
153 : : {
154 : : nitrox_release_ridq(qp);
155 : 0 : return nitrox_release_cmdq(qp, bar_addr);
156 : : }
|