Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(C) 2021 Marvell.
3 : : */
4 : :
5 : : #include "cnxk_cryptodev_ops.h"
6 : : #include "cnxk_ethdev.h"
7 : : #include "cnxk_eventdev.h"
8 : : #include "cnxk_dmadev.h"
9 : :
10 : : void
11 : 0 : cnxk_sso_updt_xae_cnt(struct cnxk_sso_evdev *dev, void *data,
12 : : uint32_t event_type)
13 : : {
14 : : int i;
15 : :
16 [ # # # # ]: 0 : switch (event_type) {
17 : : case RTE_EVENT_TYPE_ETHDEV: {
18 : : struct cnxk_eth_rxq_sp *rxq = data;
19 : : uint64_t *old_ptr;
20 : :
21 [ # # ]: 0 : for (i = 0; i < dev->rx_adptr_pool_cnt; i++) {
22 [ # # ]: 0 : if ((uint64_t)rxq->qconf.mp == dev->rx_adptr_pools[i])
23 : : return;
24 : : }
25 : :
26 : 0 : dev->rx_adptr_pool_cnt++;
27 : 0 : old_ptr = dev->rx_adptr_pools;
28 : 0 : dev->rx_adptr_pools = rte_realloc(
29 : : dev->rx_adptr_pools,
30 : 0 : sizeof(uint64_t) * dev->rx_adptr_pool_cnt, 0);
31 [ # # ]: 0 : if (dev->rx_adptr_pools == NULL) {
32 : 0 : dev->adptr_xae_cnt += rxq->qconf.mp->size;
33 : 0 : dev->rx_adptr_pools = old_ptr;
34 : 0 : dev->rx_adptr_pool_cnt--;
35 : 0 : return;
36 : : }
37 : 0 : dev->rx_adptr_pools[dev->rx_adptr_pool_cnt - 1] =
38 : 0 : (uint64_t)rxq->qconf.mp;
39 : :
40 : 0 : dev->adptr_xae_cnt += rxq->qconf.mp->size;
41 : 0 : break;
42 : : }
43 : : case RTE_EVENT_TYPE_ETHDEV_VECTOR: {
44 : : struct rte_mempool *mp = data;
45 : : uint64_t *old_ptr;
46 : :
47 [ # # ]: 0 : for (i = 0; i < dev->vec_pool_cnt; i++) {
48 [ # # ]: 0 : if ((uint64_t)mp == dev->vec_pools[i])
49 : : return;
50 : : }
51 : :
52 : 0 : dev->vec_pool_cnt++;
53 : 0 : old_ptr = dev->vec_pools;
54 : 0 : dev->vec_pools =
55 : 0 : rte_realloc(dev->vec_pools,
56 : 0 : sizeof(uint64_t) * dev->vec_pool_cnt, 0);
57 [ # # ]: 0 : if (dev->vec_pools == NULL) {
58 : 0 : dev->adptr_xae_cnt += mp->size;
59 : 0 : dev->vec_pools = old_ptr;
60 : 0 : dev->vec_pool_cnt--;
61 : 0 : return;
62 : : }
63 : 0 : dev->vec_pools[dev->vec_pool_cnt - 1] = (uint64_t)mp;
64 : :
65 : 0 : dev->adptr_xae_cnt += mp->size;
66 : 0 : break;
67 : : }
68 : : case RTE_EVENT_TYPE_TIMER: {
69 : : struct cnxk_tim_ring *timr = data;
70 : : uint16_t *old_ring_ptr;
71 : : uint64_t *old_sz_ptr;
72 : :
73 [ # # ]: 0 : for (i = 0; i < dev->tim_adptr_ring_cnt; i++) {
74 [ # # ]: 0 : if (timr->ring_id != dev->timer_adptr_rings[i])
75 : : continue;
76 [ # # ]: 0 : if (timr->nb_timers == dev->timer_adptr_sz[i])
77 : : return;
78 : 0 : dev->adptr_xae_cnt -= dev->timer_adptr_sz[i];
79 : 0 : dev->adptr_xae_cnt += timr->nb_timers;
80 : 0 : dev->timer_adptr_sz[i] = timr->nb_timers;
81 : :
82 : 0 : return;
83 : : }
84 : :
85 : 0 : dev->tim_adptr_ring_cnt++;
86 : 0 : old_ring_ptr = dev->timer_adptr_rings;
87 : 0 : old_sz_ptr = dev->timer_adptr_sz;
88 : :
89 : 0 : dev->timer_adptr_rings = rte_realloc(
90 : : dev->timer_adptr_rings,
91 : 0 : sizeof(uint16_t) * dev->tim_adptr_ring_cnt, 0);
92 [ # # ]: 0 : if (dev->timer_adptr_rings == NULL) {
93 : 0 : dev->adptr_xae_cnt += timr->nb_timers;
94 : 0 : dev->timer_adptr_rings = old_ring_ptr;
95 : 0 : dev->tim_adptr_ring_cnt--;
96 : 0 : return;
97 : : }
98 : :
99 : 0 : dev->timer_adptr_sz = rte_realloc(
100 : 0 : dev->timer_adptr_sz,
101 : 0 : sizeof(uint64_t) * dev->tim_adptr_ring_cnt, 0);
102 : :
103 [ # # ]: 0 : if (dev->timer_adptr_sz == NULL) {
104 : 0 : dev->adptr_xae_cnt += timr->nb_timers;
105 : 0 : dev->timer_adptr_sz = old_sz_ptr;
106 : 0 : dev->tim_adptr_ring_cnt--;
107 : 0 : return;
108 : : }
109 : :
110 : 0 : dev->timer_adptr_rings[dev->tim_adptr_ring_cnt - 1] =
111 : 0 : timr->ring_id;
112 : 0 : dev->timer_adptr_sz[dev->tim_adptr_ring_cnt - 1] =
113 : 0 : timr->nb_timers;
114 : :
115 : 0 : dev->adptr_xae_cnt += timr->nb_timers;
116 : 0 : break;
117 : : }
118 : : default:
119 : : break;
120 : : }
121 : : }
122 : :
123 : : static int
124 : 0 : cnxk_sso_rxq_enable(struct cnxk_eth_dev *cnxk_eth_dev, uint16_t rq_id,
125 : : uint16_t port_id, const struct rte_event *ev,
126 : : uint8_t custom_flowid)
127 : : {
128 : 0 : struct roc_nix *nix = &cnxk_eth_dev->nix;
129 : : struct roc_nix_rq *rq;
130 : : uint16_t wqe_skip;
131 : : int rc;
132 : :
133 : 0 : rq = &cnxk_eth_dev->rqs[rq_id];
134 : 0 : rq->sso_ena = 1;
135 : 0 : rq->tt = ev->sched_type;
136 : 0 : rq->hwgrp = ev->queue_id;
137 : 0 : rq->flow_tag_width = 20;
138 : : wqe_skip = RTE_ALIGN_CEIL(sizeof(struct rte_mbuf), ROC_CACHE_LINE_SZ);
139 : : wqe_skip = wqe_skip / ROC_CACHE_LINE_SZ;
140 : 0 : rq->wqe_skip = wqe_skip;
141 : 0 : rq->tag_mask = (port_id & 0xF) << 20;
142 : 0 : rq->tag_mask |= (((port_id >> 4) & 0xF) | (RTE_EVENT_TYPE_ETHDEV << 4))
143 : 0 : << 24;
144 : :
145 [ # # ]: 0 : if (custom_flowid) {
146 : 0 : rq->flow_tag_width = 0;
147 : 0 : rq->tag_mask |= ev->flow_id;
148 : : }
149 : :
150 : 0 : rc = roc_nix_rq_modify(&cnxk_eth_dev->nix, rq, 0);
151 [ # # ]: 0 : if (rc)
152 : : return rc;
153 : :
154 [ # # # # ]: 0 : if (rq_id == 0 && roc_nix_inl_inb_is_enabled(nix)) {
155 : : uint32_t sec_tag_const;
156 : :
157 : : /* IPSec tag const is 8-bit left shifted value of tag_mask
158 : : * as it applies to bit 32:8 of tag only.
159 : : */
160 : 0 : sec_tag_const = rq->tag_mask >> 8;
161 : 0 : rc = roc_nix_inl_inb_tag_update(nix, sec_tag_const,
162 : 0 : ev->sched_type);
163 [ # # ]: 0 : if (rc)
164 : 0 : plt_err("Failed to set tag conf for ipsec, rc=%d", rc);
165 : : }
166 : :
167 : : return rc;
168 : : }
169 : :
170 : : int
171 : 0 : cnxk_sso_rxq_disable(const struct rte_eth_dev *eth_dev, uint16_t rq_id)
172 : : {
173 : 0 : struct cnxk_eth_dev *cnxk_eth_dev = eth_dev->data->dev_private;
174 : : struct roc_nix_rq *rq;
175 : :
176 : 0 : rq = &cnxk_eth_dev->rqs[rq_id];
177 : 0 : rq->sso_ena = 0;
178 : 0 : rq->flow_tag_width = 32;
179 : 0 : rq->tag_mask = 0;
180 : :
181 : 0 : return roc_nix_rq_modify(&cnxk_eth_dev->nix, rq, 0);
182 : : }
183 : :
184 : : static int
185 : 0 : cnxk_sso_rx_adapter_vwqe_enable(struct cnxk_eth_dev *cnxk_eth_dev,
186 : : uint16_t port_id, uint16_t rq_id, uint16_t sz,
187 : : uint64_t tmo_ns, struct rte_mempool *vmp)
188 : : {
189 : : struct roc_nix_rq *rq;
190 : :
191 : 0 : rq = &cnxk_eth_dev->rqs[rq_id];
192 : :
193 [ # # ]: 0 : if (!rq->sso_ena)
194 : : return -EINVAL;
195 [ # # ]: 0 : if (rq->flow_tag_width == 0)
196 : : return -EINVAL;
197 : :
198 : 0 : rq->vwqe_ena = 1;
199 : 0 : rq->vwqe_first_skip = 0;
200 : 0 : rq->vwqe_aura_handle = vmp->pool_id;
201 [ # # ]: 0 : rq->vwqe_max_sz_exp = rte_log2_u32(sz);
202 : 0 : rq->vwqe_wait_tmo =
203 : 0 : tmo_ns /
204 : 0 : ((roc_nix_get_vwqe_interval(&cnxk_eth_dev->nix) + 1) * 100);
205 : 0 : rq->tag_mask = (port_id & 0xF) << 20;
206 : 0 : rq->tag_mask |=
207 : : (((port_id >> 4) & 0xF) | (RTE_EVENT_TYPE_ETHDEV_VECTOR << 4))
208 : 0 : << 24;
209 : :
210 : 0 : return roc_nix_rq_modify(&cnxk_eth_dev->nix, rq, 0);
211 : : }
212 : :
213 : : void
214 : 0 : cnxk_sso_tstamp_cfg(uint16_t port_id, const struct rte_eth_dev *eth_dev, struct cnxk_sso_evdev *dev)
215 : : {
216 : 0 : struct cnxk_eth_dev *cnxk_eth_dev = eth_dev->data->dev_private;
217 : :
218 [ # # # # ]: 0 : if (cnxk_eth_dev->rx_offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP || cnxk_eth_dev->ptp_en)
219 : 0 : dev->tstamp[port_id] = &cnxk_eth_dev->tstamp;
220 : 0 : }
221 : :
222 : : int
223 : 0 : cnxk_sso_rx_adapter_queues_add(const struct rte_eventdev *event_dev,
224 : : const struct rte_eth_dev *eth_dev, int32_t rx_queue_id[],
225 : : const struct rte_event_eth_rx_adapter_queue_conf queue_conf[],
226 : : uint16_t nb_rx_queues)
227 : : {
228 [ # # ]: 0 : struct cnxk_eth_dev *cnxk_eth_dev = eth_dev->data->dev_private;
229 : : struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
230 : : const struct rte_event_eth_rx_adapter_queue_conf *conf;
231 : 0 : uint64_t old_xae_cnt = dev->adptr_xae_cnt;
232 : 0 : uint16_t port = eth_dev->data->port_id;
233 : : struct cnxk_eth_rxq_sp *rxq_sp;
234 : : bool vec_drop_reset = false;
235 : : uint16_t max_rx_queues;
236 : : int32_t queue_id;
237 : : int i, rc;
238 : :
239 [ # # ]: 0 : max_rx_queues = nb_rx_queues ? nb_rx_queues : eth_dev->data->nb_rx_queues;
240 [ # # ]: 0 : for (i = 0; i < max_rx_queues; i++) {
241 [ # # ]: 0 : conf = nb_rx_queues ? &queue_conf[i] : &queue_conf[0];
242 [ # # ]: 0 : queue_id = nb_rx_queues ? rx_queue_id[i] : i;
243 : :
244 : 0 : rxq_sp = cnxk_eth_rxq_to_sp(eth_dev->data->rx_queues[queue_id]);
245 : 0 : cnxk_sso_updt_xae_cnt(dev, rxq_sp, RTE_EVENT_TYPE_ETHDEV);
246 : :
247 [ # # ]: 0 : if (conf->rx_queue_flags & RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR)
248 : 0 : cnxk_sso_updt_xae_cnt(dev, conf->vector_mp, RTE_EVENT_TYPE_ETHDEV_VECTOR);
249 : : }
250 : :
251 [ # # ]: 0 : if (dev->adptr_xae_cnt != old_xae_cnt) {
252 : 0 : rc = cnxk_sso_xae_reconfigure((struct rte_eventdev *)(uintptr_t)event_dev);
253 [ # # ]: 0 : if (rc < 0)
254 : : return rc;
255 : : }
256 : :
257 [ # # ]: 0 : for (i = 0; i < max_rx_queues; i++) {
258 [ # # ]: 0 : conf = nb_rx_queues ? &queue_conf[i] : &queue_conf[0];
259 [ # # ]: 0 : queue_id = nb_rx_queues ? rx_queue_id[i] : i;
260 : :
261 : 0 : rc = cnxk_sso_rxq_enable(
262 : : cnxk_eth_dev, (uint16_t)queue_id, port, &conf->ev,
263 : 0 : !!(conf->rx_queue_flags & RTE_EVENT_ETH_RX_ADAPTER_QUEUE_FLOW_ID_VALID));
264 [ # # ]: 0 : if (rc < 0)
265 : 0 : goto fail;
266 : :
267 [ # # ]: 0 : if (conf->rx_queue_flags & RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR) {
268 : 0 : rc = cnxk_sso_rx_adapter_vwqe_enable(
269 : 0 : cnxk_eth_dev, port, (uint16_t)queue_id, conf->vector_sz,
270 : 0 : conf->vector_timeout_ns, conf->vector_mp);
271 [ # # ]: 0 : if (rc < 0)
272 : 0 : goto fail;
273 : :
274 : : vec_drop_reset = true;
275 : : }
276 : 0 : cnxk_eth_dev->nb_rxq_sso++;
277 : : }
278 : :
279 [ # # # # ]: 0 : if (cnxk_eth_dev->vec_drop_re_dis && vec_drop_reset) {
280 : 0 : rc = roc_nix_rx_drop_re_set(&cnxk_eth_dev->nix, false);
281 [ # # ]: 0 : if (rc < 0)
282 : 0 : goto fail;
283 : : }
284 : :
285 : : /* Propagate force bp devarg */
286 : 0 : cnxk_eth_dev->nix.force_rx_aura_bp = dev->force_ena_bp;
287 : 0 : cnxk_sso_tstamp_cfg(eth_dev->data->port_id, eth_dev, dev);
288 : 0 : dev->rx_offloads |= cnxk_eth_dev->rx_offload_flags;
289 : 0 : return 0;
290 : :
291 : 0 : fail:
292 [ # # ]: 0 : for (i = cnxk_eth_dev->nb_rxq_sso - 1; i >= 0; i--) {
293 [ # # ]: 0 : queue_id = nb_rx_queues ? rx_queue_id[i] : i;
294 : 0 : cnxk_sso_rx_adapter_queue_del(event_dev, eth_dev, queue_id);
295 : : }
296 : :
297 : : return rc;
298 : : }
299 : :
300 : : int
301 : 0 : cnxk_sso_rx_adapter_queue_del(const struct rte_eventdev *event_dev,
302 : : const struct rte_eth_dev *eth_dev,
303 : : int32_t rx_queue_id)
304 : : {
305 : 0 : struct cnxk_eth_dev *cnxk_eth_dev = eth_dev->data->dev_private;
306 : : int i, rc = 0;
307 : :
308 : : RTE_SET_USED(event_dev);
309 [ # # ]: 0 : if (rx_queue_id < 0) {
310 [ # # ]: 0 : for (i = 0; i < eth_dev->data->nb_rx_queues; i++)
311 : 0 : cnxk_sso_rx_adapter_queue_del(event_dev, eth_dev, i);
312 : : } else {
313 : 0 : rc = cnxk_sso_rxq_disable(eth_dev, (uint16_t)rx_queue_id);
314 : 0 : cnxk_eth_dev->nb_rxq_sso--;
315 : :
316 : : /* Enable drop_re if it was disabled earlier */
317 [ # # # # ]: 0 : if (cnxk_eth_dev->vec_drop_re_dis && !cnxk_eth_dev->nb_rxq_sso)
318 : 0 : rc |= roc_nix_rx_drop_re_set(&cnxk_eth_dev->nix, true);
319 : : }
320 : :
321 [ # # ]: 0 : if (rc < 0)
322 : 0 : plt_err("Failed to clear Rx adapter config port=%d, q=%d",
323 : : eth_dev->data->port_id, rx_queue_id);
324 : 0 : return rc;
325 : : }
326 : :
327 : : int
328 : 0 : cnxk_sso_rx_adapter_start(const struct rte_eventdev *event_dev,
329 : : const struct rte_eth_dev *eth_dev)
330 : : {
331 : 0 : struct cnxk_eth_dev *cnxk_eth_dev = eth_dev->data->dev_private;
332 : : struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
333 : 0 : dev->rx_offloads |= cnxk_eth_dev->rx_offload_flags;
334 : 0 : return 0;
335 : : }
336 : :
337 : : int
338 : 0 : cnxk_sso_rx_adapter_stop(const struct rte_eventdev *event_dev,
339 : : const struct rte_eth_dev *eth_dev)
340 : : {
341 : : RTE_SET_USED(eth_dev);
342 : : struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
343 : 0 : dev->rx_offloads = 0;
344 : 0 : return 0;
345 : : }
346 : :
347 : : static int
348 : 0 : cnxk_sso_sqb_aura_limit_edit(struct roc_nix_sq *sq, uint16_t nb_sqb_bufs)
349 : : {
350 : : int rc;
351 : :
352 [ # # ]: 0 : if (sq->aura_sqb_bufs != nb_sqb_bufs) {
353 : 0 : rc = roc_npa_aura_limit_modify(
354 : : sq->aura_handle,
355 : 0 : RTE_MIN(nb_sqb_bufs, sq->aura_sqb_bufs));
356 [ # # ]: 0 : if (rc < 0)
357 : : return rc;
358 : :
359 : 0 : sq->nb_sqb_bufs = RTE_MIN(nb_sqb_bufs, sq->aura_sqb_bufs) -
360 : 0 : sq->roc_nix->sqb_slack;
361 : : }
362 : : return 0;
363 : : }
364 : :
365 : : static void
366 : 0 : cnxk_sso_tx_queue_data_init(struct cnxk_sso_evdev *dev, uint64_t *txq_data,
367 : : uint16_t eth_port_id, uint16_t tx_queue_id)
368 : : {
369 : : uint64_t offset = 0;
370 : : int i;
371 : :
372 : 0 : dev->max_queue_id[0] = RTE_MAX(dev->max_queue_id[0], eth_port_id);
373 [ # # ]: 0 : for (i = 1; i < eth_port_id; i++) {
374 : 0 : offset += (dev->max_queue_id[i - 1] + 1);
375 : 0 : txq_data[i] |= offset << 48;
376 : : }
377 : 0 : dev->max_port_id = RTE_MAX(dev->max_port_id, eth_port_id);
378 : 0 : dev->max_queue_id[eth_port_id] =
379 : 0 : RTE_MAX(dev->max_queue_id[eth_port_id], tx_queue_id);
380 : 0 : }
381 : :
382 : : static void
383 : 0 : cnxk_sso_tx_queue_data_cpy(struct cnxk_sso_evdev *dev, uint64_t *txq_data,
384 : : uint64_t *otxq_data, uint16_t eth_port_id)
385 : : {
386 : : uint64_t offset = 0;
387 : : int i, j;
388 : :
389 [ # # ]: 0 : for (i = 1; i < eth_port_id; i++) {
390 : 0 : offset += (dev->max_queue_id[i - 1] + 1);
391 : 0 : txq_data[i] |= offset << 48;
392 : 0 : for (j = 0;
393 [ # # # # ]: 0 : (i < dev->max_port_id) && (j < dev->max_queue_id[i] + 1);
394 : 0 : j++)
395 : 0 : txq_data[offset + j] =
396 : 0 : otxq_data[(otxq_data[i] >> 48) + j];
397 : : }
398 : 0 : }
399 : :
400 : : static void
401 : 0 : cnxk_sso_tx_queue_data_cpy_max(struct cnxk_sso_evdev *dev, uint64_t *txq_data,
402 : : uint64_t *otxq_data, uint16_t eth_port_id,
403 : : uint16_t max_port_id, uint16_t max_queue_id)
404 : : {
405 : : uint64_t offset = 0;
406 : : int i, j;
407 : :
408 [ # # ]: 0 : for (i = 1; i < max_port_id + 1; i++) {
409 : 0 : offset += (dev->max_queue_id[i - 1] + 1);
410 : 0 : txq_data[i] |= offset << 48;
411 [ # # ]: 0 : for (j = 0; j < dev->max_queue_id[i] + 1; j++) {
412 [ # # # # ]: 0 : if (i == eth_port_id && j > max_queue_id)
413 : 0 : continue;
414 : 0 : txq_data[offset + j] =
415 : 0 : otxq_data[(otxq_data[i] >> 48) + j];
416 : : }
417 : : }
418 : 0 : }
419 : :
420 : : static void
421 : 0 : cnxk_sso_tx_queue_data_rewrite(struct cnxk_sso_evdev *dev, uint64_t *txq_data,
422 : : uint16_t eth_port_id, uint16_t tx_queue_id,
423 : : uint64_t *otxq_data, uint16_t max_port_id,
424 : : uint16_t max_queue_id)
425 : : {
426 : : int i;
427 : :
428 [ # # ]: 0 : for (i = 0; i < dev->max_queue_id[0] + 1; i++)
429 : 0 : txq_data[i] |= (otxq_data[i] & ~((BIT_ULL(16) - 1) << 48));
430 : :
431 [ # # ]: 0 : if (eth_port_id > max_port_id) {
432 : 0 : dev->max_queue_id[0] =
433 : 0 : RTE_MAX(dev->max_queue_id[0], eth_port_id);
434 : 0 : dev->max_port_id = RTE_MAX(dev->max_port_id, eth_port_id);
435 : :
436 : 0 : cnxk_sso_tx_queue_data_cpy(dev, txq_data, otxq_data,
437 : : eth_port_id);
438 : 0 : dev->max_queue_id[eth_port_id] =
439 : 0 : RTE_MAX(dev->max_queue_id[eth_port_id], tx_queue_id);
440 [ # # ]: 0 : } else if (tx_queue_id > max_queue_id) {
441 : 0 : dev->max_queue_id[eth_port_id] =
442 : 0 : RTE_MAX(dev->max_queue_id[eth_port_id], tx_queue_id);
443 : 0 : dev->max_port_id = RTE_MAX(max_port_id, eth_port_id);
444 : 0 : cnxk_sso_tx_queue_data_cpy_max(dev, txq_data, otxq_data,
445 : : eth_port_id, max_port_id,
446 : : max_queue_id);
447 : : }
448 : 0 : }
449 : :
450 : : static void
451 : 0 : cnxk_sso_tx_queue_data_sz(struct cnxk_sso_evdev *dev, uint16_t eth_port_id,
452 : : uint16_t tx_queue_id, uint16_t max_port_id,
453 : : uint16_t max_queue_id, uint64_t *r, size_t *sz)
454 : : {
455 : : uint64_t row = 0;
456 : : size_t size = 0;
457 : : int i;
458 : :
459 [ # # ]: 0 : if (dev->tx_adptr_data == NULL) {
460 : 0 : size = (eth_port_id + 1);
461 : 0 : size += (eth_port_id + tx_queue_id);
462 : 0 : row = 2 * eth_port_id;
463 : 0 : *r = row;
464 : 0 : *sz = size;
465 : 0 : return;
466 : : }
467 : :
468 [ # # ]: 0 : if (eth_port_id > max_port_id) {
469 : 0 : size = (RTE_MAX(eth_port_id, dev->max_queue_id[0]) + 1);
470 [ # # ]: 0 : for (i = 1; i < eth_port_id; i++)
471 : 0 : size += (dev->max_queue_id[i] + 1);
472 : : row = size;
473 : 0 : size += (tx_queue_id + 1);
474 [ # # ]: 0 : } else if (tx_queue_id > max_queue_id) {
475 : : size = !eth_port_id ?
476 [ # # ]: 0 : tx_queue_id + 1 :
477 : 0 : RTE_MAX(max_port_id, dev->max_queue_id[0]) + 1;
478 [ # # ]: 0 : for (i = 1; i < max_port_id + 1; i++) {
479 [ # # ]: 0 : if (i == eth_port_id) {
480 : : row = size;
481 : 0 : size += tx_queue_id + 1;
482 : : } else {
483 : 0 : size += dev->max_queue_id[i] + 1;
484 : : }
485 : : }
486 : : }
487 : 0 : *r = row;
488 : 0 : *sz = size;
489 : : }
490 : :
491 : : static int
492 [ # # ]: 0 : cnxk_sso_updt_tx_queue_data(const struct rte_eventdev *event_dev,
493 : : uint16_t eth_port_id, uint16_t tx_queue_id,
494 : : void *txq)
495 : : {
496 : : struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
497 : 0 : uint16_t max_queue_id = dev->max_queue_id[eth_port_id];
498 : 0 : uint16_t max_port_id = dev->max_port_id;
499 : : uint64_t *txq_data = NULL;
500 : 0 : uint64_t row = 0;
501 : 0 : size_t size = 0;
502 : :
503 [ # # ]: 0 : if (((uint64_t)txq) & 0xFFFF000000000000)
504 : : return -EINVAL;
505 : :
506 : 0 : cnxk_sso_tx_queue_data_sz(dev, eth_port_id, tx_queue_id, max_port_id,
507 : : max_queue_id, &row, &size);
508 : :
509 : 0 : size *= sizeof(uint64_t);
510 : :
511 [ # # ]: 0 : if (size) {
512 : 0 : uint64_t *otxq_data = dev->tx_adptr_data;
513 : :
514 : 0 : txq_data = malloc(size);
515 [ # # ]: 0 : if (txq_data == NULL)
516 : : return -ENOMEM;
517 : : memset(txq_data, 0, size);
518 : 0 : txq_data[eth_port_id] = ((uint64_t)row) << 48;
519 : 0 : txq_data[row + tx_queue_id] = (uint64_t)txq;
520 : :
521 [ # # ]: 0 : if (otxq_data != NULL)
522 : 0 : cnxk_sso_tx_queue_data_rewrite(
523 : : dev, txq_data, eth_port_id, tx_queue_id,
524 : : otxq_data, max_port_id, max_queue_id);
525 : : else
526 : 0 : cnxk_sso_tx_queue_data_init(dev, txq_data, eth_port_id,
527 : : tx_queue_id);
528 : 0 : dev->tx_adptr_data_sz = size;
529 : 0 : free(otxq_data);
530 : 0 : dev->tx_adptr_data = txq_data;
531 : : } else {
532 : 0 : txq_data = dev->tx_adptr_data;
533 : 0 : row = txq_data[eth_port_id] >> 48;
534 : 0 : txq_data[row + tx_queue_id] &= ~(BIT_ULL(48) - 1);
535 : 0 : txq_data[row + tx_queue_id] |= (uint64_t)txq;
536 : : }
537 : :
538 : : return 0;
539 : : }
540 : :
541 : : int
542 : 0 : cnxk_sso_tx_adapter_queue_add(const struct rte_eventdev *event_dev,
543 : : const struct rte_eth_dev *eth_dev,
544 : : int32_t tx_queue_id)
545 : : {
546 : 0 : struct cnxk_eth_dev *cnxk_eth_dev = eth_dev->data->dev_private;
547 : : struct roc_nix_sq *sq;
548 : : int i, ret = 0;
549 : : void *txq;
550 : :
551 [ # # ]: 0 : if (tx_queue_id < 0) {
552 [ # # ]: 0 : for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
553 : 0 : ret |= cnxk_sso_tx_adapter_queue_add(event_dev, eth_dev,
554 : : i);
555 : : } else {
556 : 0 : txq = eth_dev->data->tx_queues[tx_queue_id];
557 : 0 : sq = &cnxk_eth_dev->sqs[tx_queue_id];
558 : 0 : cnxk_sso_sqb_aura_limit_edit(sq, sq->aura_sqb_bufs);
559 : 0 : ret = cnxk_sso_updt_tx_queue_data(
560 : 0 : event_dev, eth_dev->data->port_id, tx_queue_id, txq);
561 [ # # ]: 0 : if (ret < 0)
562 : : return ret;
563 : : }
564 : :
565 [ # # ]: 0 : if (ret < 0) {
566 : 0 : plt_err("Failed to configure Tx adapter port=%d, q=%d",
567 : : eth_dev->data->port_id, tx_queue_id);
568 : 0 : return ret;
569 : : }
570 : :
571 : : return 0;
572 : : }
573 : :
574 : : int
575 : 0 : cnxk_sso_tx_adapter_queue_del(const struct rte_eventdev *event_dev,
576 : : const struct rte_eth_dev *eth_dev,
577 : : int32_t tx_queue_id)
578 : : {
579 : 0 : struct cnxk_eth_dev *cnxk_eth_dev = eth_dev->data->dev_private;
580 : : struct roc_nix_sq *sq;
581 : : int i, ret = 0;
582 : :
583 : : RTE_SET_USED(event_dev);
584 [ # # ]: 0 : if (tx_queue_id < 0) {
585 [ # # ]: 0 : for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
586 : 0 : ret |= cnxk_sso_tx_adapter_queue_del(event_dev, eth_dev,
587 : : i);
588 : : } else {
589 : 0 : sq = &cnxk_eth_dev->sqs[tx_queue_id];
590 : 0 : cnxk_sso_sqb_aura_limit_edit(sq, sq->aura_sqb_bufs);
591 : 0 : ret = cnxk_sso_updt_tx_queue_data(
592 : 0 : event_dev, eth_dev->data->port_id, tx_queue_id, NULL);
593 [ # # ]: 0 : if (ret < 0)
594 : : return ret;
595 : : }
596 : :
597 [ # # ]: 0 : if (ret < 0) {
598 : 0 : plt_err("Failed to clear Tx adapter config port=%d, q=%d",
599 : : eth_dev->data->port_id, tx_queue_id);
600 : 0 : return ret;
601 : : }
602 : :
603 : : return 0;
604 : : }
605 : :
606 : : int
607 : 0 : cnxk_sso_tx_adapter_start(uint8_t id, const struct rte_eventdev *event_dev)
608 : : {
609 : : struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
610 : :
611 : 0 : dev->tx_adptr_active_mask |= (1 << id);
612 : :
613 : 0 : return 0;
614 : : }
615 : :
616 : : int
617 : 0 : cnxk_sso_tx_adapter_stop(uint8_t id, const struct rte_eventdev *event_dev)
618 : : {
619 : : struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
620 : :
621 : 0 : dev->tx_adptr_active_mask &= ~(1 << id);
622 : :
623 : 0 : return 0;
624 : : }
625 : :
626 : : int
627 [ # # ]: 0 : cnxk_sso_tx_adapter_free(uint8_t id __rte_unused,
628 : : const struct rte_eventdev *event_dev)
629 : : {
630 : : struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
631 : :
632 [ # # # # ]: 0 : if (dev->tx_adptr_data_sz && dev->tx_adptr_active_mask == 0) {
633 : 0 : dev->tx_adptr_data_sz = 0;
634 : 0 : free(dev->tx_adptr_data);
635 : 0 : dev->tx_adptr_data = NULL;
636 : : }
637 : :
638 : 0 : return 0;
639 : : }
640 : :
641 : : static int
642 [ # # ]: 0 : crypto_adapter_qp_setup(const struct rte_cryptodev *cdev, struct cnxk_cpt_qp *qp,
643 : : const struct rte_event_crypto_adapter_queue_conf *conf)
644 : : {
645 : : char name[RTE_MEMPOOL_NAMESIZE];
646 : : uint32_t cache_size, nb_req;
647 : : unsigned int req_size;
648 : : uint32_t nb_desc_min;
649 : :
650 : : /*
651 : : * Update CPT FC threshold. Decrement by hardware burst size to allow
652 : : * simultaneous enqueue from all available cores.
653 : : */
654 [ # # ]: 0 : if (roc_model_is_cn10k())
655 : 0 : nb_desc_min = rte_lcore_count() * CN10K_CPT_PKTS_PER_LOOP;
656 : : else
657 : 0 : nb_desc_min = rte_lcore_count() * 2;
658 : :
659 [ # # ]: 0 : if (qp->lmtline.fc_thresh < nb_desc_min) {
660 : 0 : plt_err("CPT queue depth not sufficient to allow enqueueing from %d cores",
661 : : rte_lcore_count());
662 : 0 : return -ENOSPC;
663 : : }
664 : :
665 : 0 : qp->lmtline.fc_thresh -= nb_desc_min;
666 : :
667 [ # # ]: 0 : snprintf(name, RTE_MEMPOOL_NAMESIZE, "cnxk_ca_req_%u:%u", cdev->data->dev_id, qp->lf.lf_id);
668 : : req_size = sizeof(struct cpt_inflight_req);
669 [ # # ]: 0 : cache_size = RTE_MIN(RTE_MEMPOOL_CACHE_MAX_SIZE, qp->lf.nb_desc / 1.5);
670 : 0 : nb_req = RTE_MAX(qp->lf.nb_desc, cache_size * rte_lcore_count());
671 : 0 : qp->ca.req_mp = rte_mempool_create(name, nb_req, req_size, cache_size, 0, NULL, NULL, NULL,
672 : 0 : NULL, rte_socket_id(), 0);
673 [ # # ]: 0 : if (qp->ca.req_mp == NULL)
674 : : return -ENOMEM;
675 : :
676 [ # # ]: 0 : if (conf != NULL) {
677 : 0 : qp->ca.vector_sz = conf->vector_sz;
678 : 0 : qp->ca.vector_mp = conf->vector_mp;
679 : : }
680 : 0 : qp->ca.enabled = true;
681 : :
682 : 0 : return 0;
683 : : }
684 : :
685 : : int
686 [ # # ]: 0 : cnxk_crypto_adapter_qp_add(const struct rte_eventdev *event_dev, const struct rte_cryptodev *cdev,
687 : : int32_t queue_pair_id,
688 : : const struct rte_event_crypto_adapter_queue_conf *conf)
689 : : {
690 : : struct cnxk_sso_evdev *sso_evdev = cnxk_sso_pmd_priv(event_dev);
691 : : uint32_t adptr_xae_cnt = 0;
692 : : struct cnxk_cpt_qp *qp;
693 : : int ret;
694 : :
695 [ # # ]: 0 : if (queue_pair_id == -1) {
696 : : uint16_t qp_id;
697 : :
698 [ # # ]: 0 : for (qp_id = 0; qp_id < cdev->data->nb_queue_pairs; qp_id++) {
699 : 0 : qp = cdev->data->queue_pairs[qp_id];
700 : 0 : ret = crypto_adapter_qp_setup(cdev, qp, conf);
701 [ # # ]: 0 : if (ret) {
702 : 0 : cnxk_crypto_adapter_qp_del(cdev, -1);
703 : 0 : return ret;
704 : : }
705 : 0 : adptr_xae_cnt += qp->ca.req_mp->size;
706 : : }
707 : : } else {
708 : 0 : qp = cdev->data->queue_pairs[queue_pair_id];
709 : 0 : ret = crypto_adapter_qp_setup(cdev, qp, conf);
710 [ # # ]: 0 : if (ret)
711 : : return ret;
712 : 0 : adptr_xae_cnt = qp->ca.req_mp->size;
713 : : }
714 : :
715 : : /* Update crypto adapter XAE count */
716 : 0 : sso_evdev->adptr_xae_cnt += adptr_xae_cnt;
717 : 0 : cnxk_sso_xae_reconfigure((struct rte_eventdev *)(uintptr_t)event_dev);
718 : :
719 : 0 : return 0;
720 : : }
721 : :
722 : : static int
723 : 0 : crypto_adapter_qp_free(struct cnxk_cpt_qp *qp)
724 : : {
725 : : int ret;
726 : :
727 : 0 : rte_mempool_free(qp->ca.req_mp);
728 : 0 : qp->ca.enabled = false;
729 : :
730 : 0 : ret = roc_cpt_lmtline_init(qp->lf.roc_cpt, &qp->lmtline, qp->lf.lf_id, true);
731 [ # # ]: 0 : if (ret < 0) {
732 : 0 : plt_err("Could not reset lmtline for queue pair %d", qp->lf.lf_id);
733 : 0 : return ret;
734 : : }
735 : :
736 : : return 0;
737 : : }
738 : :
739 : : int
740 : 0 : cnxk_crypto_adapter_qp_del(const struct rte_cryptodev *cdev,
741 : : int32_t queue_pair_id)
742 : : {
743 : : struct cnxk_cpt_qp *qp;
744 : :
745 [ # # ]: 0 : if (queue_pair_id == -1) {
746 : : uint16_t qp_id;
747 : :
748 [ # # ]: 0 : for (qp_id = 0; qp_id < cdev->data->nb_queue_pairs; qp_id++) {
749 : 0 : qp = cdev->data->queue_pairs[qp_id];
750 [ # # ]: 0 : if (qp->ca.enabled)
751 : 0 : crypto_adapter_qp_free(qp);
752 : : }
753 : : } else {
754 : 0 : qp = cdev->data->queue_pairs[queue_pair_id];
755 [ # # ]: 0 : if (qp->ca.enabled)
756 : 0 : crypto_adapter_qp_free(qp);
757 : : }
758 : :
759 : 0 : return 0;
760 : : }
761 : :
762 : : int
763 [ # # ]: 0 : cnxk_dma_adapter_vchan_add(const struct rte_eventdev *event_dev,
764 : : const int16_t dma_dev_id, uint16_t vchan_id)
765 : : {
766 : : struct cnxk_sso_evdev *sso_evdev = cnxk_sso_pmd_priv(event_dev);
767 : : uint32_t adptr_xae_cnt = 0;
768 : : struct cnxk_dpi_vf_s *dpivf;
769 : : struct cnxk_dpi_conf *vchan;
770 : :
771 : 0 : dpivf = rte_dma_fp_objs[dma_dev_id].dev_private;
772 [ # # ]: 0 : if ((int16_t)vchan_id == -1) {
773 : : uint16_t vchan_id;
774 : :
775 [ # # ]: 0 : for (vchan_id = 0; vchan_id < dpivf->num_vchans; vchan_id++) {
776 : 0 : vchan = &dpivf->conf[vchan_id];
777 : 0 : vchan->adapter_enabled = true;
778 : 0 : adptr_xae_cnt += vchan->c_desc.max_cnt;
779 : : }
780 : : } else {
781 : 0 : vchan = &dpivf->conf[vchan_id];
782 : 0 : vchan->adapter_enabled = true;
783 : 0 : adptr_xae_cnt = vchan->c_desc.max_cnt;
784 : : }
785 : :
786 : : /* Update dma adapter XAE count */
787 : 0 : sso_evdev->adptr_xae_cnt += adptr_xae_cnt;
788 : 0 : cnxk_sso_xae_reconfigure((struct rte_eventdev *)(uintptr_t)event_dev);
789 : :
790 : 0 : return 0;
791 : : }
792 : :
793 : : static int
794 : : dma_adapter_vchan_free(struct cnxk_dpi_conf *vchan)
795 : : {
796 : 0 : vchan->adapter_enabled = false;
797 : :
798 : 0 : return 0;
799 : : }
800 : :
801 : : int
802 : 0 : cnxk_dma_adapter_vchan_del(const int16_t dma_dev_id, uint16_t vchan_id)
803 : : {
804 : : struct cnxk_dpi_vf_s *dpivf;
805 : : struct cnxk_dpi_conf *vchan;
806 : :
807 : 0 : dpivf = rte_dma_fp_objs[dma_dev_id].dev_private;
808 [ # # ]: 0 : if ((int16_t)vchan_id == -1) {
809 : : uint16_t vchan_id;
810 : :
811 [ # # ]: 0 : for (vchan_id = 0; vchan_id < dpivf->num_vchans; vchan_id++) {
812 : 0 : vchan = &dpivf->conf[vchan_id];
813 [ # # ]: 0 : if (vchan->adapter_enabled)
814 : : dma_adapter_vchan_free(vchan);
815 : : }
816 : : } else {
817 : 0 : vchan = &dpivf->conf[vchan_id];
818 [ # # ]: 0 : if (vchan->adapter_enabled)
819 : : dma_adapter_vchan_free(vchan);
820 : : }
821 : :
822 : 0 : return 0;
823 : : }
|