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