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_queue_add(
224 : : const struct rte_eventdev *event_dev, const struct rte_eth_dev *eth_dev,
225 : : int32_t rx_queue_id,
226 : : const struct rte_event_eth_rx_adapter_queue_conf *queue_conf)
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 : 0 : uint16_t port = eth_dev->data->port_id;
231 : : struct cnxk_eth_rxq_sp *rxq_sp;
232 : : int i, rc = 0;
233 : :
234 [ # # ]: 0 : if (rx_queue_id < 0) {
235 [ # # ]: 0 : for (i = 0; i < eth_dev->data->nb_rx_queues; i++)
236 : 0 : rc |= cnxk_sso_rx_adapter_queue_add(event_dev, eth_dev,
237 : : i, queue_conf);
238 : : } else {
239 : 0 : rxq_sp = cnxk_eth_rxq_to_sp(
240 : 0 : eth_dev->data->rx_queues[rx_queue_id]);
241 : 0 : cnxk_sso_updt_xae_cnt(dev, rxq_sp, RTE_EVENT_TYPE_ETHDEV);
242 : 0 : rc = cnxk_sso_xae_reconfigure(
243 : : (struct rte_eventdev *)(uintptr_t)event_dev);
244 : 0 : rc |= cnxk_sso_rxq_enable(
245 : : cnxk_eth_dev, (uint16_t)rx_queue_id, port,
246 : : &queue_conf->ev,
247 : 0 : !!(queue_conf->rx_queue_flags &
248 : : RTE_EVENT_ETH_RX_ADAPTER_QUEUE_FLOW_ID_VALID));
249 [ # # ]: 0 : if (queue_conf->rx_queue_flags &
250 : : RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR) {
251 : 0 : cnxk_sso_updt_xae_cnt(dev, queue_conf->vector_mp,
252 : : RTE_EVENT_TYPE_ETHDEV_VECTOR);
253 : 0 : rc |= cnxk_sso_xae_reconfigure(
254 : : (struct rte_eventdev *)(uintptr_t)event_dev);
255 : 0 : rc |= cnxk_sso_rx_adapter_vwqe_enable(
256 : : cnxk_eth_dev, port, rx_queue_id,
257 : 0 : queue_conf->vector_sz,
258 : 0 : queue_conf->vector_timeout_ns,
259 : 0 : queue_conf->vector_mp);
260 : :
261 [ # # ]: 0 : if (cnxk_eth_dev->vec_drop_re_dis)
262 : 0 : rc |= roc_nix_rx_drop_re_set(&cnxk_eth_dev->nix,
263 : : false);
264 : : }
265 : :
266 : : /* Propagate force bp devarg */
267 : 0 : cnxk_eth_dev->nix.force_rx_aura_bp = dev->force_ena_bp;
268 : 0 : cnxk_sso_tstamp_cfg(eth_dev->data->port_id, eth_dev, dev);
269 : 0 : cnxk_eth_dev->nb_rxq_sso++;
270 : : }
271 : :
272 [ # # ]: 0 : if (rc < 0) {
273 : 0 : plt_err("Failed to configure Rx adapter port=%d, q=%d", port,
274 : : queue_conf->ev.queue_id);
275 : 0 : return rc;
276 : : }
277 : :
278 : 0 : dev->rx_offloads |= cnxk_eth_dev->rx_offload_flags;
279 : 0 : return 0;
280 : : }
281 : :
282 : : int
283 : 0 : cnxk_sso_rx_adapter_queue_del(const struct rte_eventdev *event_dev,
284 : : const struct rte_eth_dev *eth_dev,
285 : : int32_t rx_queue_id)
286 : : {
287 : 0 : struct cnxk_eth_dev *cnxk_eth_dev = eth_dev->data->dev_private;
288 : : int i, rc = 0;
289 : :
290 : : RTE_SET_USED(event_dev);
291 [ # # ]: 0 : if (rx_queue_id < 0) {
292 [ # # ]: 0 : for (i = 0; i < eth_dev->data->nb_rx_queues; i++)
293 : 0 : cnxk_sso_rx_adapter_queue_del(event_dev, eth_dev, i);
294 : : } else {
295 : 0 : rc = cnxk_sso_rxq_disable(eth_dev, (uint16_t)rx_queue_id);
296 : 0 : cnxk_eth_dev->nb_rxq_sso--;
297 : :
298 : : /* Enable drop_re if it was disabled earlier */
299 [ # # # # ]: 0 : if (cnxk_eth_dev->vec_drop_re_dis && !cnxk_eth_dev->nb_rxq_sso)
300 : 0 : rc |= roc_nix_rx_drop_re_set(&cnxk_eth_dev->nix, true);
301 : : }
302 : :
303 [ # # ]: 0 : if (rc < 0)
304 : 0 : plt_err("Failed to clear Rx adapter config port=%d, q=%d",
305 : : eth_dev->data->port_id, rx_queue_id);
306 : 0 : return rc;
307 : : }
308 : :
309 : : int
310 : 0 : cnxk_sso_rx_adapter_start(const struct rte_eventdev *event_dev,
311 : : const struct rte_eth_dev *eth_dev)
312 : : {
313 : 0 : struct cnxk_eth_dev *cnxk_eth_dev = eth_dev->data->dev_private;
314 : : struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
315 : 0 : dev->rx_offloads |= cnxk_eth_dev->rx_offload_flags;
316 : 0 : return 0;
317 : : }
318 : :
319 : : int
320 : 0 : cnxk_sso_rx_adapter_stop(const struct rte_eventdev *event_dev,
321 : : const struct rte_eth_dev *eth_dev)
322 : : {
323 : : RTE_SET_USED(eth_dev);
324 : : struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
325 : 0 : dev->rx_offloads = 0;
326 : 0 : return 0;
327 : : }
328 : :
329 : : static int
330 : 0 : cnxk_sso_sqb_aura_limit_edit(struct roc_nix_sq *sq, uint16_t nb_sqb_bufs)
331 : : {
332 : : int rc;
333 : :
334 [ # # ]: 0 : if (sq->aura_sqb_bufs != nb_sqb_bufs) {
335 : 0 : rc = roc_npa_aura_limit_modify(
336 : : sq->aura_handle,
337 : 0 : RTE_MIN(nb_sqb_bufs, sq->aura_sqb_bufs));
338 [ # # ]: 0 : if (rc < 0)
339 : : return rc;
340 : :
341 : 0 : sq->nb_sqb_bufs = RTE_MIN(nb_sqb_bufs, sq->aura_sqb_bufs) -
342 : 0 : sq->roc_nix->sqb_slack;
343 : : }
344 : : return 0;
345 : : }
346 : :
347 : : static void
348 : 0 : cnxk_sso_tx_queue_data_init(struct cnxk_sso_evdev *dev, uint64_t *txq_data,
349 : : uint16_t eth_port_id, uint16_t tx_queue_id)
350 : : {
351 : : uint64_t offset = 0;
352 : : int i;
353 : :
354 : 0 : dev->max_queue_id[0] = RTE_MAX(dev->max_queue_id[0], eth_port_id);
355 [ # # ]: 0 : for (i = 1; i < eth_port_id; i++) {
356 : 0 : offset += (dev->max_queue_id[i - 1] + 1);
357 : 0 : txq_data[i] |= offset << 48;
358 : : }
359 : 0 : dev->max_port_id = RTE_MAX(dev->max_port_id, eth_port_id);
360 : 0 : dev->max_queue_id[eth_port_id] =
361 : 0 : RTE_MAX(dev->max_queue_id[eth_port_id], tx_queue_id);
362 : 0 : }
363 : :
364 : : static void
365 : 0 : cnxk_sso_tx_queue_data_cpy(struct cnxk_sso_evdev *dev, uint64_t *txq_data,
366 : : uint64_t *otxq_data, uint16_t eth_port_id)
367 : : {
368 : : uint64_t offset = 0;
369 : : int i, j;
370 : :
371 [ # # ]: 0 : for (i = 1; i < eth_port_id; i++) {
372 : 0 : offset += (dev->max_queue_id[i - 1] + 1);
373 : 0 : txq_data[i] |= offset << 48;
374 : 0 : for (j = 0;
375 [ # # # # ]: 0 : (i < dev->max_port_id) && (j < dev->max_queue_id[i] + 1);
376 : 0 : j++)
377 : 0 : txq_data[offset + j] =
378 : 0 : otxq_data[(otxq_data[i] >> 48) + j];
379 : : }
380 : 0 : }
381 : :
382 : : static void
383 : 0 : cnxk_sso_tx_queue_data_cpy_max(struct cnxk_sso_evdev *dev, uint64_t *txq_data,
384 : : uint64_t *otxq_data, uint16_t eth_port_id,
385 : : uint16_t max_port_id, uint16_t max_queue_id)
386 : : {
387 : : uint64_t offset = 0;
388 : : int i, j;
389 : :
390 [ # # ]: 0 : for (i = 1; i < max_port_id + 1; i++) {
391 : 0 : offset += (dev->max_queue_id[i - 1] + 1);
392 : 0 : txq_data[i] |= offset << 48;
393 [ # # ]: 0 : for (j = 0; j < dev->max_queue_id[i] + 1; j++) {
394 [ # # # # ]: 0 : if (i == eth_port_id && j > max_queue_id)
395 : 0 : continue;
396 : 0 : txq_data[offset + j] =
397 : 0 : otxq_data[(otxq_data[i] >> 48) + j];
398 : : }
399 : : }
400 : 0 : }
401 : :
402 : : static void
403 : 0 : cnxk_sso_tx_queue_data_rewrite(struct cnxk_sso_evdev *dev, uint64_t *txq_data,
404 : : uint16_t eth_port_id, uint16_t tx_queue_id,
405 : : uint64_t *otxq_data, uint16_t max_port_id,
406 : : uint16_t max_queue_id)
407 : : {
408 : : int i;
409 : :
410 [ # # ]: 0 : for (i = 0; i < dev->max_queue_id[0] + 1; i++)
411 : 0 : txq_data[i] |= (otxq_data[i] & ~((BIT_ULL(16) - 1) << 48));
412 : :
413 [ # # ]: 0 : if (eth_port_id > max_port_id) {
414 : 0 : dev->max_queue_id[0] =
415 : 0 : RTE_MAX(dev->max_queue_id[0], eth_port_id);
416 : 0 : dev->max_port_id = RTE_MAX(dev->max_port_id, eth_port_id);
417 : :
418 : 0 : cnxk_sso_tx_queue_data_cpy(dev, txq_data, otxq_data,
419 : : eth_port_id);
420 : 0 : dev->max_queue_id[eth_port_id] =
421 : 0 : RTE_MAX(dev->max_queue_id[eth_port_id], tx_queue_id);
422 [ # # ]: 0 : } else if (tx_queue_id > max_queue_id) {
423 : 0 : dev->max_queue_id[eth_port_id] =
424 : 0 : RTE_MAX(dev->max_queue_id[eth_port_id], tx_queue_id);
425 : 0 : dev->max_port_id = RTE_MAX(max_port_id, eth_port_id);
426 : 0 : cnxk_sso_tx_queue_data_cpy_max(dev, txq_data, otxq_data,
427 : : eth_port_id, max_port_id,
428 : : max_queue_id);
429 : : }
430 : 0 : }
431 : :
432 : : static void
433 : 0 : cnxk_sso_tx_queue_data_sz(struct cnxk_sso_evdev *dev, uint16_t eth_port_id,
434 : : uint16_t tx_queue_id, uint16_t max_port_id,
435 : : uint16_t max_queue_id, uint64_t *r, size_t *sz)
436 : : {
437 : : uint64_t row = 0;
438 : : size_t size = 0;
439 : : int i;
440 : :
441 [ # # ]: 0 : if (dev->tx_adptr_data == NULL) {
442 : 0 : size = (eth_port_id + 1);
443 : 0 : size += (eth_port_id + tx_queue_id);
444 : 0 : row = 2 * eth_port_id;
445 : 0 : *r = row;
446 : 0 : *sz = size;
447 : 0 : return;
448 : : }
449 : :
450 [ # # ]: 0 : if (eth_port_id > max_port_id) {
451 : 0 : size = (RTE_MAX(eth_port_id, dev->max_queue_id[0]) + 1);
452 [ # # ]: 0 : for (i = 1; i < eth_port_id; i++)
453 : 0 : size += (dev->max_queue_id[i] + 1);
454 : : row = size;
455 : 0 : size += (tx_queue_id + 1);
456 [ # # ]: 0 : } else if (tx_queue_id > max_queue_id) {
457 : : size = !eth_port_id ?
458 [ # # ]: 0 : tx_queue_id + 1 :
459 : 0 : RTE_MAX(max_port_id, dev->max_queue_id[0]) + 1;
460 [ # # ]: 0 : for (i = 1; i < max_port_id + 1; i++) {
461 [ # # ]: 0 : if (i == eth_port_id) {
462 : : row = size;
463 : 0 : size += tx_queue_id + 1;
464 : : } else {
465 : 0 : size += dev->max_queue_id[i] + 1;
466 : : }
467 : : }
468 : : }
469 : 0 : *r = row;
470 : 0 : *sz = size;
471 : : }
472 : :
473 : : static int
474 [ # # ]: 0 : cnxk_sso_updt_tx_queue_data(const struct rte_eventdev *event_dev,
475 : : uint16_t eth_port_id, uint16_t tx_queue_id,
476 : : void *txq)
477 : : {
478 : : struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
479 : 0 : uint16_t max_queue_id = dev->max_queue_id[eth_port_id];
480 : 0 : uint16_t max_port_id = dev->max_port_id;
481 : : uint64_t *txq_data = NULL;
482 : 0 : uint64_t row = 0;
483 : 0 : size_t size = 0;
484 : :
485 [ # # ]: 0 : if (((uint64_t)txq) & 0xFFFF000000000000)
486 : : return -EINVAL;
487 : :
488 : 0 : cnxk_sso_tx_queue_data_sz(dev, eth_port_id, tx_queue_id, max_port_id,
489 : : max_queue_id, &row, &size);
490 : :
491 : 0 : size *= sizeof(uint64_t);
492 : :
493 [ # # ]: 0 : if (size) {
494 : 0 : uint64_t *otxq_data = dev->tx_adptr_data;
495 : :
496 : 0 : txq_data = malloc(size);
497 [ # # ]: 0 : if (txq_data == NULL)
498 : : return -ENOMEM;
499 : : memset(txq_data, 0, size);
500 : 0 : txq_data[eth_port_id] = ((uint64_t)row) << 48;
501 : 0 : txq_data[row + tx_queue_id] = (uint64_t)txq;
502 : :
503 [ # # ]: 0 : if (otxq_data != NULL)
504 : 0 : cnxk_sso_tx_queue_data_rewrite(
505 : : dev, txq_data, eth_port_id, tx_queue_id,
506 : : otxq_data, max_port_id, max_queue_id);
507 : : else
508 : 0 : cnxk_sso_tx_queue_data_init(dev, txq_data, eth_port_id,
509 : : tx_queue_id);
510 : 0 : dev->tx_adptr_data_sz = size;
511 : 0 : free(otxq_data);
512 : 0 : dev->tx_adptr_data = txq_data;
513 : : } else {
514 : 0 : txq_data = dev->tx_adptr_data;
515 : 0 : row = txq_data[eth_port_id] >> 48;
516 : 0 : txq_data[row + tx_queue_id] &= ~(BIT_ULL(48) - 1);
517 : 0 : txq_data[row + tx_queue_id] |= (uint64_t)txq;
518 : : }
519 : :
520 : : return 0;
521 : : }
522 : :
523 : : int
524 : 0 : cnxk_sso_tx_adapter_queue_add(const struct rte_eventdev *event_dev,
525 : : const struct rte_eth_dev *eth_dev,
526 : : int32_t tx_queue_id)
527 : : {
528 : 0 : struct cnxk_eth_dev *cnxk_eth_dev = eth_dev->data->dev_private;
529 : : struct roc_nix_sq *sq;
530 : : int i, ret = 0;
531 : : void *txq;
532 : :
533 [ # # ]: 0 : if (tx_queue_id < 0) {
534 [ # # ]: 0 : for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
535 : 0 : ret |= cnxk_sso_tx_adapter_queue_add(event_dev, eth_dev,
536 : : i);
537 : : } else {
538 : 0 : txq = eth_dev->data->tx_queues[tx_queue_id];
539 : 0 : sq = &cnxk_eth_dev->sqs[tx_queue_id];
540 : 0 : cnxk_sso_sqb_aura_limit_edit(sq, sq->aura_sqb_bufs);
541 : 0 : ret = cnxk_sso_updt_tx_queue_data(
542 : 0 : event_dev, eth_dev->data->port_id, tx_queue_id, txq);
543 [ # # ]: 0 : if (ret < 0)
544 : : return ret;
545 : : }
546 : :
547 [ # # ]: 0 : if (ret < 0) {
548 : 0 : plt_err("Failed to configure Tx adapter port=%d, q=%d",
549 : : eth_dev->data->port_id, tx_queue_id);
550 : 0 : return ret;
551 : : }
552 : :
553 : : return 0;
554 : : }
555 : :
556 : : int
557 : 0 : cnxk_sso_tx_adapter_queue_del(const struct rte_eventdev *event_dev,
558 : : const struct rte_eth_dev *eth_dev,
559 : : int32_t tx_queue_id)
560 : : {
561 : 0 : struct cnxk_eth_dev *cnxk_eth_dev = eth_dev->data->dev_private;
562 : : struct roc_nix_sq *sq;
563 : : int i, ret = 0;
564 : :
565 : : RTE_SET_USED(event_dev);
566 [ # # ]: 0 : if (tx_queue_id < 0) {
567 [ # # ]: 0 : for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
568 : 0 : ret |= cnxk_sso_tx_adapter_queue_del(event_dev, eth_dev,
569 : : i);
570 : : } else {
571 : 0 : sq = &cnxk_eth_dev->sqs[tx_queue_id];
572 : 0 : cnxk_sso_sqb_aura_limit_edit(sq, sq->aura_sqb_bufs);
573 : 0 : ret = cnxk_sso_updt_tx_queue_data(
574 : 0 : event_dev, eth_dev->data->port_id, tx_queue_id, NULL);
575 [ # # ]: 0 : if (ret < 0)
576 : : return ret;
577 : : }
578 : :
579 [ # # ]: 0 : if (ret < 0) {
580 : 0 : plt_err("Failed to clear Tx adapter config port=%d, q=%d",
581 : : eth_dev->data->port_id, tx_queue_id);
582 : 0 : return ret;
583 : : }
584 : :
585 : : return 0;
586 : : }
587 : :
588 : : int
589 : 0 : cnxk_sso_tx_adapter_start(uint8_t id, const struct rte_eventdev *event_dev)
590 : : {
591 : : struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
592 : :
593 : 0 : dev->tx_adptr_active_mask |= (1 << id);
594 : :
595 : 0 : return 0;
596 : : }
597 : :
598 : : int
599 : 0 : cnxk_sso_tx_adapter_stop(uint8_t id, const struct rte_eventdev *event_dev)
600 : : {
601 : : struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
602 : :
603 : 0 : dev->tx_adptr_active_mask &= ~(1 << id);
604 : :
605 : 0 : return 0;
606 : : }
607 : :
608 : : int
609 [ # # ]: 0 : cnxk_sso_tx_adapter_free(uint8_t id __rte_unused,
610 : : const struct rte_eventdev *event_dev)
611 : : {
612 : : struct cnxk_sso_evdev *dev = cnxk_sso_pmd_priv(event_dev);
613 : :
614 [ # # # # ]: 0 : if (dev->tx_adptr_data_sz && dev->tx_adptr_active_mask == 0) {
615 : 0 : dev->tx_adptr_data_sz = 0;
616 : 0 : free(dev->tx_adptr_data);
617 : 0 : dev->tx_adptr_data = NULL;
618 : : }
619 : :
620 : 0 : return 0;
621 : : }
622 : :
623 : : static int
624 [ # # ]: 0 : crypto_adapter_qp_setup(const struct rte_cryptodev *cdev, struct cnxk_cpt_qp *qp,
625 : : const struct rte_event_crypto_adapter_queue_conf *conf)
626 : : {
627 : : char name[RTE_MEMPOOL_NAMESIZE];
628 : : uint32_t cache_size, nb_req;
629 : : unsigned int req_size;
630 : : uint32_t nb_desc_min;
631 : :
632 : : /*
633 : : * Update CPT FC threshold. Decrement by hardware burst size to allow
634 : : * simultaneous enqueue from all available cores.
635 : : */
636 [ # # ]: 0 : if (roc_model_is_cn10k())
637 : 0 : nb_desc_min = rte_lcore_count() * CN10K_CPT_PKTS_PER_LOOP;
638 : : else
639 : 0 : nb_desc_min = rte_lcore_count() * 2;
640 : :
641 [ # # ]: 0 : if (qp->lmtline.fc_thresh < nb_desc_min) {
642 : 0 : plt_err("CPT queue depth not sufficient to allow enqueueing from %d cores",
643 : : rte_lcore_count());
644 : 0 : return -ENOSPC;
645 : : }
646 : :
647 : 0 : qp->lmtline.fc_thresh -= nb_desc_min;
648 : :
649 [ # # ]: 0 : snprintf(name, RTE_MEMPOOL_NAMESIZE, "cnxk_ca_req_%u:%u", cdev->data->dev_id, qp->lf.lf_id);
650 : : req_size = sizeof(struct cpt_inflight_req);
651 [ # # ]: 0 : cache_size = RTE_MIN(RTE_MEMPOOL_CACHE_MAX_SIZE, qp->lf.nb_desc / 1.5);
652 : 0 : nb_req = RTE_MAX(qp->lf.nb_desc, cache_size * rte_lcore_count());
653 : 0 : qp->ca.req_mp = rte_mempool_create(name, nb_req, req_size, cache_size, 0, NULL, NULL, NULL,
654 : 0 : NULL, rte_socket_id(), 0);
655 [ # # ]: 0 : if (qp->ca.req_mp == NULL)
656 : : return -ENOMEM;
657 : :
658 [ # # ]: 0 : if (conf != NULL) {
659 : 0 : qp->ca.vector_sz = conf->vector_sz;
660 : 0 : qp->ca.vector_mp = conf->vector_mp;
661 : : }
662 : 0 : qp->ca.enabled = true;
663 : :
664 : 0 : return 0;
665 : : }
666 : :
667 : : int
668 [ # # ]: 0 : cnxk_crypto_adapter_qp_add(const struct rte_eventdev *event_dev, const struct rte_cryptodev *cdev,
669 : : int32_t queue_pair_id,
670 : : const struct rte_event_crypto_adapter_queue_conf *conf)
671 : : {
672 : : struct cnxk_sso_evdev *sso_evdev = cnxk_sso_pmd_priv(event_dev);
673 : : uint32_t adptr_xae_cnt = 0;
674 : : struct cnxk_cpt_qp *qp;
675 : : int ret;
676 : :
677 [ # # ]: 0 : if (queue_pair_id == -1) {
678 : : uint16_t qp_id;
679 : :
680 [ # # ]: 0 : for (qp_id = 0; qp_id < cdev->data->nb_queue_pairs; qp_id++) {
681 : 0 : qp = cdev->data->queue_pairs[qp_id];
682 : 0 : ret = crypto_adapter_qp_setup(cdev, qp, conf);
683 [ # # ]: 0 : if (ret) {
684 : 0 : cnxk_crypto_adapter_qp_del(cdev, -1);
685 : 0 : return ret;
686 : : }
687 : 0 : adptr_xae_cnt += qp->ca.req_mp->size;
688 : : }
689 : : } else {
690 : 0 : qp = cdev->data->queue_pairs[queue_pair_id];
691 : 0 : ret = crypto_adapter_qp_setup(cdev, qp, conf);
692 [ # # ]: 0 : if (ret)
693 : : return ret;
694 : 0 : adptr_xae_cnt = qp->ca.req_mp->size;
695 : : }
696 : :
697 : : /* Update crypto adapter XAE count */
698 : 0 : sso_evdev->adptr_xae_cnt += adptr_xae_cnt;
699 : 0 : cnxk_sso_xae_reconfigure((struct rte_eventdev *)(uintptr_t)event_dev);
700 : :
701 : 0 : return 0;
702 : : }
703 : :
704 : : static int
705 : 0 : crypto_adapter_qp_free(struct cnxk_cpt_qp *qp)
706 : : {
707 : : int ret;
708 : :
709 : 0 : rte_mempool_free(qp->ca.req_mp);
710 : 0 : qp->ca.enabled = false;
711 : :
712 : 0 : ret = roc_cpt_lmtline_init(qp->lf.roc_cpt, &qp->lmtline, qp->lf.lf_id, true);
713 [ # # ]: 0 : if (ret < 0) {
714 : 0 : plt_err("Could not reset lmtline for queue pair %d", qp->lf.lf_id);
715 : 0 : return ret;
716 : : }
717 : :
718 : : return 0;
719 : : }
720 : :
721 : : int
722 : 0 : cnxk_crypto_adapter_qp_del(const struct rte_cryptodev *cdev,
723 : : int32_t queue_pair_id)
724 : : {
725 : : struct cnxk_cpt_qp *qp;
726 : :
727 [ # # ]: 0 : if (queue_pair_id == -1) {
728 : : uint16_t qp_id;
729 : :
730 [ # # ]: 0 : for (qp_id = 0; qp_id < cdev->data->nb_queue_pairs; qp_id++) {
731 : 0 : qp = cdev->data->queue_pairs[qp_id];
732 [ # # ]: 0 : if (qp->ca.enabled)
733 : 0 : crypto_adapter_qp_free(qp);
734 : : }
735 : : } else {
736 : 0 : qp = cdev->data->queue_pairs[queue_pair_id];
737 [ # # ]: 0 : if (qp->ca.enabled)
738 : 0 : crypto_adapter_qp_free(qp);
739 : : }
740 : :
741 : 0 : return 0;
742 : : }
743 : :
744 : : int
745 [ # # ]: 0 : cnxk_dma_adapter_vchan_add(const struct rte_eventdev *event_dev,
746 : : const int16_t dma_dev_id, uint16_t vchan_id)
747 : : {
748 : : struct cnxk_sso_evdev *sso_evdev = cnxk_sso_pmd_priv(event_dev);
749 : : uint32_t adptr_xae_cnt = 0;
750 : : struct cnxk_dpi_vf_s *dpivf;
751 : : struct cnxk_dpi_conf *vchan;
752 : :
753 : 0 : dpivf = rte_dma_fp_objs[dma_dev_id].dev_private;
754 [ # # ]: 0 : if ((int16_t)vchan_id == -1) {
755 : : uint16_t vchan_id;
756 : :
757 [ # # ]: 0 : for (vchan_id = 0; vchan_id < dpivf->num_vchans; vchan_id++) {
758 : 0 : vchan = &dpivf->conf[vchan_id];
759 : 0 : vchan->adapter_enabled = true;
760 : 0 : adptr_xae_cnt += vchan->c_desc.max_cnt;
761 : : }
762 : : } else {
763 : 0 : vchan = &dpivf->conf[vchan_id];
764 : 0 : vchan->adapter_enabled = true;
765 : 0 : adptr_xae_cnt = vchan->c_desc.max_cnt;
766 : : }
767 : :
768 : : /* Update dma adapter XAE count */
769 : 0 : sso_evdev->adptr_xae_cnt += adptr_xae_cnt;
770 : 0 : cnxk_sso_xae_reconfigure((struct rte_eventdev *)(uintptr_t)event_dev);
771 : :
772 : 0 : return 0;
773 : : }
774 : :
775 : : static int
776 : : dma_adapter_vchan_free(struct cnxk_dpi_conf *vchan)
777 : : {
778 : 0 : vchan->adapter_enabled = false;
779 : :
780 : 0 : return 0;
781 : : }
782 : :
783 : : int
784 : 0 : cnxk_dma_adapter_vchan_del(const int16_t dma_dev_id, uint16_t vchan_id)
785 : : {
786 : : struct cnxk_dpi_vf_s *dpivf;
787 : : struct cnxk_dpi_conf *vchan;
788 : :
789 : 0 : dpivf = rte_dma_fp_objs[dma_dev_id].dev_private;
790 [ # # ]: 0 : if ((int16_t)vchan_id == -1) {
791 : : uint16_t vchan_id;
792 : :
793 [ # # ]: 0 : for (vchan_id = 0; vchan_id < dpivf->num_vchans; vchan_id++) {
794 : 0 : vchan = &dpivf->conf[vchan_id];
795 [ # # ]: 0 : if (vchan->adapter_enabled)
796 : : dma_adapter_vchan_free(vchan);
797 : : }
798 : : } else {
799 : 0 : vchan = &dpivf->conf[vchan_id];
800 [ # # ]: 0 : if (vchan->adapter_enabled)
801 : : dma_adapter_vchan_free(vchan);
802 : : }
803 : :
804 : 0 : return 0;
805 : : }
|