1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
24418919fSjohnjiang * Copyright 2017,2019 NXP
32bfe3f2eSlogwang */
42bfe3f2eSlogwang
52bfe3f2eSlogwang #include <assert.h>
62bfe3f2eSlogwang #include <stdio.h>
72bfe3f2eSlogwang #include <stdbool.h>
82bfe3f2eSlogwang #include <errno.h>
92bfe3f2eSlogwang #include <stdint.h>
102bfe3f2eSlogwang #include <string.h>
112bfe3f2eSlogwang #include <sys/epoll.h>
122bfe3f2eSlogwang
132bfe3f2eSlogwang #include <rte_atomic.h>
142bfe3f2eSlogwang #include <rte_byteorder.h>
152bfe3f2eSlogwang #include <rte_common.h>
162bfe3f2eSlogwang #include <rte_debug.h>
172bfe3f2eSlogwang #include <rte_dev.h>
182bfe3f2eSlogwang #include <rte_eal.h>
192bfe3f2eSlogwang #include <rte_fslmc.h>
202bfe3f2eSlogwang #include <rte_lcore.h>
212bfe3f2eSlogwang #include <rte_log.h>
222bfe3f2eSlogwang #include <rte_malloc.h>
232bfe3f2eSlogwang #include <rte_memcpy.h>
242bfe3f2eSlogwang #include <rte_memory.h>
252bfe3f2eSlogwang #include <rte_pci.h>
262bfe3f2eSlogwang #include <rte_bus_vdev.h>
27d30ea906Sjfb8856606 #include <rte_ethdev_driver.h>
28d30ea906Sjfb8856606 #include <rte_cryptodev.h>
292bfe3f2eSlogwang #include <rte_event_eth_rx_adapter.h>
304418919fSjohnjiang #include <rte_event_eth_tx_adapter.h>
312bfe3f2eSlogwang
322bfe3f2eSlogwang #include <fslmc_vfio.h>
332bfe3f2eSlogwang #include <dpaa2_hw_pvt.h>
342bfe3f2eSlogwang #include <dpaa2_hw_mempool.h>
352bfe3f2eSlogwang #include <dpaa2_hw_dpio.h>
362bfe3f2eSlogwang #include <dpaa2_ethdev.h>
37d30ea906Sjfb8856606 #include <dpaa2_sec_event.h>
382bfe3f2eSlogwang #include "dpaa2_eventdev.h"
39d30ea906Sjfb8856606 #include "dpaa2_eventdev_logs.h"
402bfe3f2eSlogwang #include <portal/dpaa2_hw_pvt.h>
412bfe3f2eSlogwang #include <mc/fsl_dpci.h>
422bfe3f2eSlogwang
432bfe3f2eSlogwang /* Clarifications
442bfe3f2eSlogwang * Evendev = SoC Instance
452bfe3f2eSlogwang * Eventport = DPIO Instance
462bfe3f2eSlogwang * Eventqueue = DPCON Instance
472bfe3f2eSlogwang * 1 Eventdev can have N Eventqueue
482bfe3f2eSlogwang * Soft Event Flow is DPCI Instance
492bfe3f2eSlogwang */
502bfe3f2eSlogwang
514418919fSjohnjiang #define DPAA2_EV_TX_RETRY_COUNT 10000
52d30ea906Sjfb8856606
532bfe3f2eSlogwang static uint16_t
dpaa2_eventdev_enqueue_burst(void * port,const struct rte_event ev[],uint16_t nb_events)542bfe3f2eSlogwang dpaa2_eventdev_enqueue_burst(void *port, const struct rte_event ev[],
552bfe3f2eSlogwang uint16_t nb_events)
562bfe3f2eSlogwang {
57d30ea906Sjfb8856606
58d30ea906Sjfb8856606 struct dpaa2_port *dpaa2_portal = port;
59d30ea906Sjfb8856606 struct dpaa2_dpio_dev *dpio_dev;
602bfe3f2eSlogwang uint32_t queue_id = ev[0].queue_id;
61d30ea906Sjfb8856606 struct dpaa2_eventq *evq_info;
624418919fSjohnjiang uint32_t fqid, retry_count;
632bfe3f2eSlogwang struct qbman_swp *swp;
642bfe3f2eSlogwang struct qbman_fd fd_arr[MAX_TX_RING_SLOTS];
652bfe3f2eSlogwang uint32_t loop, frames_to_send;
662bfe3f2eSlogwang struct qbman_eq_desc eqdesc[MAX_TX_RING_SLOTS];
672bfe3f2eSlogwang uint16_t num_tx = 0;
68d30ea906Sjfb8856606 int i, n, ret;
69d30ea906Sjfb8856606 uint8_t channel_index;
702bfe3f2eSlogwang
712bfe3f2eSlogwang if (unlikely(!DPAA2_PER_LCORE_DPIO)) {
72d30ea906Sjfb8856606 /* Affine current thread context to a qman portal */
732bfe3f2eSlogwang ret = dpaa2_affine_qbman_swp();
74d30ea906Sjfb8856606 if (ret < 0) {
75*2d9fd380Sjfb8856606 DPAA2_EVENTDEV_ERR(
76*2d9fd380Sjfb8856606 "Failed to allocate IO portal, tid: %d\n",
77*2d9fd380Sjfb8856606 rte_gettid());
782bfe3f2eSlogwang return 0;
792bfe3f2eSlogwang }
802bfe3f2eSlogwang }
81d30ea906Sjfb8856606 /* todo - dpaa2_portal shall have dpio_dev - no per thread variable */
82d30ea906Sjfb8856606 dpio_dev = DPAA2_PER_LCORE_DPIO;
832bfe3f2eSlogwang swp = DPAA2_PER_LCORE_PORTAL;
842bfe3f2eSlogwang
85d30ea906Sjfb8856606 if (likely(dpaa2_portal->is_port_linked))
86d30ea906Sjfb8856606 goto skip_linking;
87d30ea906Sjfb8856606
88d30ea906Sjfb8856606 /* Create mapping between portal and channel to receive packets */
89d30ea906Sjfb8856606 for (i = 0; i < DPAA2_EVENT_MAX_QUEUES; i++) {
90d30ea906Sjfb8856606 evq_info = &dpaa2_portal->evq_info[i];
91d30ea906Sjfb8856606 if (!evq_info->event_port)
92d30ea906Sjfb8856606 continue;
93d30ea906Sjfb8856606
94d30ea906Sjfb8856606 ret = dpio_add_static_dequeue_channel(dpio_dev->dpio,
95d30ea906Sjfb8856606 CMD_PRI_LOW,
96d30ea906Sjfb8856606 dpio_dev->token,
97d30ea906Sjfb8856606 evq_info->dpcon->dpcon_id,
98d30ea906Sjfb8856606 &channel_index);
99d30ea906Sjfb8856606 if (ret < 0) {
100d30ea906Sjfb8856606 DPAA2_EVENTDEV_ERR(
101d30ea906Sjfb8856606 "Static dequeue config failed: err(%d)", ret);
102d30ea906Sjfb8856606 goto err;
103d30ea906Sjfb8856606 }
104d30ea906Sjfb8856606
105d30ea906Sjfb8856606 qbman_swp_push_set(swp, channel_index, 1);
106d30ea906Sjfb8856606 evq_info->dpcon->channel_index = channel_index;
107d30ea906Sjfb8856606 }
108d30ea906Sjfb8856606 dpaa2_portal->is_port_linked = true;
109d30ea906Sjfb8856606
110d30ea906Sjfb8856606 skip_linking:
111d30ea906Sjfb8856606 evq_info = &dpaa2_portal->evq_info[queue_id];
112d30ea906Sjfb8856606
1132bfe3f2eSlogwang while (nb_events) {
114d30ea906Sjfb8856606 frames_to_send = (nb_events > dpaa2_eqcr_size) ?
115d30ea906Sjfb8856606 dpaa2_eqcr_size : nb_events;
1162bfe3f2eSlogwang
1172bfe3f2eSlogwang for (loop = 0; loop < frames_to_send; loop++) {
1182bfe3f2eSlogwang const struct rte_event *event = &ev[num_tx + loop];
1192bfe3f2eSlogwang
1202bfe3f2eSlogwang if (event->sched_type != RTE_SCHED_TYPE_ATOMIC)
121d30ea906Sjfb8856606 fqid = evq_info->dpci->rx_queue[
1222bfe3f2eSlogwang DPAA2_EVENT_DPCI_PARALLEL_QUEUE].fqid;
1232bfe3f2eSlogwang else
124d30ea906Sjfb8856606 fqid = evq_info->dpci->rx_queue[
1252bfe3f2eSlogwang DPAA2_EVENT_DPCI_ATOMIC_QUEUE].fqid;
1262bfe3f2eSlogwang
1272bfe3f2eSlogwang /* Prepare enqueue descriptor */
1282bfe3f2eSlogwang qbman_eq_desc_clear(&eqdesc[loop]);
1292bfe3f2eSlogwang qbman_eq_desc_set_fq(&eqdesc[loop], fqid);
1302bfe3f2eSlogwang qbman_eq_desc_set_no_orp(&eqdesc[loop], 0);
1312bfe3f2eSlogwang qbman_eq_desc_set_response(&eqdesc[loop], 0, 0);
1322bfe3f2eSlogwang
133d30ea906Sjfb8856606 if (event->sched_type == RTE_SCHED_TYPE_ATOMIC
134*2d9fd380Sjfb8856606 && *dpaa2_seqn(event->mbuf)) {
135*2d9fd380Sjfb8856606 uint8_t dqrr_index =
136*2d9fd380Sjfb8856606 *dpaa2_seqn(event->mbuf) - 1;
1372bfe3f2eSlogwang
1382bfe3f2eSlogwang qbman_eq_desc_set_dca(&eqdesc[loop], 1,
1392bfe3f2eSlogwang dqrr_index, 0);
140d30ea906Sjfb8856606 DPAA2_PER_LCORE_DQRR_SIZE--;
141d30ea906Sjfb8856606 DPAA2_PER_LCORE_DQRR_HELD &= ~(1 << dqrr_index);
1422bfe3f2eSlogwang }
1432bfe3f2eSlogwang
1442bfe3f2eSlogwang memset(&fd_arr[loop], 0, sizeof(struct qbman_fd));
1452bfe3f2eSlogwang
1462bfe3f2eSlogwang /*
1472bfe3f2eSlogwang * todo - need to align with hw context data
1482bfe3f2eSlogwang * to avoid copy
1492bfe3f2eSlogwang */
1502bfe3f2eSlogwang struct rte_event *ev_temp = rte_malloc(NULL,
1512bfe3f2eSlogwang sizeof(struct rte_event), 0);
1522bfe3f2eSlogwang
1532bfe3f2eSlogwang if (!ev_temp) {
1542bfe3f2eSlogwang if (!loop)
1552bfe3f2eSlogwang return num_tx;
1562bfe3f2eSlogwang frames_to_send = loop;
157d30ea906Sjfb8856606 DPAA2_EVENTDEV_ERR(
158d30ea906Sjfb8856606 "Unable to allocate event object");
1592bfe3f2eSlogwang goto send_partial;
1602bfe3f2eSlogwang }
1612bfe3f2eSlogwang rte_memcpy(ev_temp, event, sizeof(struct rte_event));
162d30ea906Sjfb8856606 DPAA2_SET_FD_ADDR((&fd_arr[loop]), (size_t)ev_temp);
1632bfe3f2eSlogwang DPAA2_SET_FD_LEN((&fd_arr[loop]),
1642bfe3f2eSlogwang sizeof(struct rte_event));
1652bfe3f2eSlogwang }
1662bfe3f2eSlogwang send_partial:
1672bfe3f2eSlogwang loop = 0;
1684418919fSjohnjiang retry_count = 0;
1692bfe3f2eSlogwang while (loop < frames_to_send) {
1704418919fSjohnjiang ret = qbman_swp_enqueue_multiple_desc(swp,
1712bfe3f2eSlogwang &eqdesc[loop], &fd_arr[loop],
1722bfe3f2eSlogwang frames_to_send - loop);
1734418919fSjohnjiang if (unlikely(ret < 0)) {
1744418919fSjohnjiang retry_count++;
1754418919fSjohnjiang if (retry_count > DPAA2_EV_TX_RETRY_COUNT) {
1764418919fSjohnjiang num_tx += loop;
1774418919fSjohnjiang nb_events -= loop;
1784418919fSjohnjiang return num_tx + loop;
1792bfe3f2eSlogwang }
1804418919fSjohnjiang } else {
1814418919fSjohnjiang loop += ret;
1824418919fSjohnjiang retry_count = 0;
1834418919fSjohnjiang }
1844418919fSjohnjiang }
1854418919fSjohnjiang num_tx += loop;
1864418919fSjohnjiang nb_events -= loop;
1872bfe3f2eSlogwang }
1882bfe3f2eSlogwang
1892bfe3f2eSlogwang return num_tx;
190d30ea906Sjfb8856606 err:
191d30ea906Sjfb8856606 for (n = 0; n < i; n++) {
192d30ea906Sjfb8856606 evq_info = &dpaa2_portal->evq_info[n];
193d30ea906Sjfb8856606 if (!evq_info->event_port)
194d30ea906Sjfb8856606 continue;
195d30ea906Sjfb8856606 qbman_swp_push_set(swp, evq_info->dpcon->channel_index, 0);
196d30ea906Sjfb8856606 dpio_remove_static_dequeue_channel(dpio_dev->dpio, 0,
197d30ea906Sjfb8856606 dpio_dev->token,
198d30ea906Sjfb8856606 evq_info->dpcon->dpcon_id);
199d30ea906Sjfb8856606 }
200d30ea906Sjfb8856606 return 0;
201d30ea906Sjfb8856606
2022bfe3f2eSlogwang }
2032bfe3f2eSlogwang
2042bfe3f2eSlogwang static uint16_t
dpaa2_eventdev_enqueue(void * port,const struct rte_event * ev)2052bfe3f2eSlogwang dpaa2_eventdev_enqueue(void *port, const struct rte_event *ev)
2062bfe3f2eSlogwang {
2072bfe3f2eSlogwang return dpaa2_eventdev_enqueue_burst(port, ev, 1);
2082bfe3f2eSlogwang }
2092bfe3f2eSlogwang
dpaa2_eventdev_dequeue_wait(uint64_t timeout_ticks)2102bfe3f2eSlogwang static void dpaa2_eventdev_dequeue_wait(uint64_t timeout_ticks)
2112bfe3f2eSlogwang {
2122bfe3f2eSlogwang struct epoll_event epoll_ev;
2132bfe3f2eSlogwang
2142bfe3f2eSlogwang qbman_swp_interrupt_clear_status(DPAA2_PER_LCORE_PORTAL,
2152bfe3f2eSlogwang QBMAN_SWP_INTERRUPT_DQRI);
2162bfe3f2eSlogwang
217d30ea906Sjfb8856606 epoll_wait(DPAA2_PER_LCORE_DPIO->epoll_fd,
2182bfe3f2eSlogwang &epoll_ev, 1, timeout_ticks);
2192bfe3f2eSlogwang }
2202bfe3f2eSlogwang
dpaa2_eventdev_process_parallel(struct qbman_swp * swp,const struct qbman_fd * fd,const struct qbman_result * dq,struct dpaa2_queue * rxq,struct rte_event * ev)2212bfe3f2eSlogwang static void dpaa2_eventdev_process_parallel(struct qbman_swp *swp,
2222bfe3f2eSlogwang const struct qbman_fd *fd,
2232bfe3f2eSlogwang const struct qbman_result *dq,
2242bfe3f2eSlogwang struct dpaa2_queue *rxq,
2252bfe3f2eSlogwang struct rte_event *ev)
2262bfe3f2eSlogwang {
2272bfe3f2eSlogwang struct rte_event *ev_temp =
228d30ea906Sjfb8856606 (struct rte_event *)(size_t)DPAA2_GET_FD_ADDR(fd);
2292bfe3f2eSlogwang
2302bfe3f2eSlogwang RTE_SET_USED(rxq);
2312bfe3f2eSlogwang
2322bfe3f2eSlogwang rte_memcpy(ev, ev_temp, sizeof(struct rte_event));
2332bfe3f2eSlogwang rte_free(ev_temp);
2342bfe3f2eSlogwang
2352bfe3f2eSlogwang qbman_swp_dqrr_consume(swp, dq);
2362bfe3f2eSlogwang }
2372bfe3f2eSlogwang
dpaa2_eventdev_process_atomic(struct qbman_swp * swp,const struct qbman_fd * fd,const struct qbman_result * dq,struct dpaa2_queue * rxq,struct rte_event * ev)2382bfe3f2eSlogwang static void dpaa2_eventdev_process_atomic(struct qbman_swp *swp,
2392bfe3f2eSlogwang const struct qbman_fd *fd,
2402bfe3f2eSlogwang const struct qbman_result *dq,
2412bfe3f2eSlogwang struct dpaa2_queue *rxq,
2422bfe3f2eSlogwang struct rte_event *ev)
2432bfe3f2eSlogwang {
2442bfe3f2eSlogwang struct rte_event *ev_temp =
245d30ea906Sjfb8856606 (struct rte_event *)(size_t)DPAA2_GET_FD_ADDR(fd);
2462bfe3f2eSlogwang uint8_t dqrr_index = qbman_get_dqrr_idx(dq);
2472bfe3f2eSlogwang
2482bfe3f2eSlogwang RTE_SET_USED(swp);
2492bfe3f2eSlogwang RTE_SET_USED(rxq);
2502bfe3f2eSlogwang
2512bfe3f2eSlogwang rte_memcpy(ev, ev_temp, sizeof(struct rte_event));
2522bfe3f2eSlogwang rte_free(ev_temp);
253*2d9fd380Sjfb8856606 *dpaa2_seqn(ev->mbuf) = dqrr_index + 1;
254d30ea906Sjfb8856606 DPAA2_PER_LCORE_DQRR_SIZE++;
255d30ea906Sjfb8856606 DPAA2_PER_LCORE_DQRR_HELD |= 1 << dqrr_index;
256d30ea906Sjfb8856606 DPAA2_PER_LCORE_DQRR_MBUF(dqrr_index) = ev->mbuf;
2572bfe3f2eSlogwang }
2582bfe3f2eSlogwang
2592bfe3f2eSlogwang static uint16_t
dpaa2_eventdev_dequeue_burst(void * port,struct rte_event ev[],uint16_t nb_events,uint64_t timeout_ticks)2602bfe3f2eSlogwang dpaa2_eventdev_dequeue_burst(void *port, struct rte_event ev[],
2612bfe3f2eSlogwang uint16_t nb_events, uint64_t timeout_ticks)
2622bfe3f2eSlogwang {
2632bfe3f2eSlogwang const struct qbman_result *dq;
264d30ea906Sjfb8856606 struct dpaa2_dpio_dev *dpio_dev = NULL;
265d30ea906Sjfb8856606 struct dpaa2_port *dpaa2_portal = port;
266d30ea906Sjfb8856606 struct dpaa2_eventq *evq_info;
2672bfe3f2eSlogwang struct qbman_swp *swp;
2682bfe3f2eSlogwang const struct qbman_fd *fd;
2692bfe3f2eSlogwang struct dpaa2_queue *rxq;
270d30ea906Sjfb8856606 int num_pkts = 0, ret, i = 0, n;
271d30ea906Sjfb8856606 uint8_t channel_index;
2722bfe3f2eSlogwang
2732bfe3f2eSlogwang if (unlikely(!DPAA2_PER_LCORE_DPIO)) {
274d30ea906Sjfb8856606 /* Affine current thread context to a qman portal */
2752bfe3f2eSlogwang ret = dpaa2_affine_qbman_swp();
276d30ea906Sjfb8856606 if (ret < 0) {
277*2d9fd380Sjfb8856606 DPAA2_EVENTDEV_ERR(
278*2d9fd380Sjfb8856606 "Failed to allocate IO portal, tid: %d\n",
279*2d9fd380Sjfb8856606 rte_gettid());
2802bfe3f2eSlogwang return 0;
2812bfe3f2eSlogwang }
2822bfe3f2eSlogwang }
2832bfe3f2eSlogwang
284d30ea906Sjfb8856606 dpio_dev = DPAA2_PER_LCORE_DPIO;
2852bfe3f2eSlogwang swp = DPAA2_PER_LCORE_PORTAL;
2862bfe3f2eSlogwang
287d30ea906Sjfb8856606 if (likely(dpaa2_portal->is_port_linked))
288d30ea906Sjfb8856606 goto skip_linking;
289d30ea906Sjfb8856606
290d30ea906Sjfb8856606 /* Create mapping between portal and channel to receive packets */
291d30ea906Sjfb8856606 for (i = 0; i < DPAA2_EVENT_MAX_QUEUES; i++) {
292d30ea906Sjfb8856606 evq_info = &dpaa2_portal->evq_info[i];
293d30ea906Sjfb8856606 if (!evq_info->event_port)
294d30ea906Sjfb8856606 continue;
295d30ea906Sjfb8856606
296d30ea906Sjfb8856606 ret = dpio_add_static_dequeue_channel(dpio_dev->dpio,
297d30ea906Sjfb8856606 CMD_PRI_LOW,
298d30ea906Sjfb8856606 dpio_dev->token,
299d30ea906Sjfb8856606 evq_info->dpcon->dpcon_id,
300d30ea906Sjfb8856606 &channel_index);
301d30ea906Sjfb8856606 if (ret < 0) {
302d30ea906Sjfb8856606 DPAA2_EVENTDEV_ERR(
303d30ea906Sjfb8856606 "Static dequeue config failed: err(%d)", ret);
304d30ea906Sjfb8856606 goto err;
305d30ea906Sjfb8856606 }
306d30ea906Sjfb8856606
307d30ea906Sjfb8856606 qbman_swp_push_set(swp, channel_index, 1);
308d30ea906Sjfb8856606 evq_info->dpcon->channel_index = channel_index;
309d30ea906Sjfb8856606 }
310d30ea906Sjfb8856606 dpaa2_portal->is_port_linked = true;
311d30ea906Sjfb8856606
312d30ea906Sjfb8856606 skip_linking:
3132bfe3f2eSlogwang /* Check if there are atomic contexts to be released */
314d30ea906Sjfb8856606 while (DPAA2_PER_LCORE_DQRR_SIZE) {
315d30ea906Sjfb8856606 if (DPAA2_PER_LCORE_DQRR_HELD & (1 << i)) {
316d30ea906Sjfb8856606 qbman_swp_dqrr_idx_consume(swp, i);
317d30ea906Sjfb8856606 DPAA2_PER_LCORE_DQRR_SIZE--;
318*2d9fd380Sjfb8856606 *dpaa2_seqn(DPAA2_PER_LCORE_DQRR_MBUF(i)) =
319d30ea906Sjfb8856606 DPAA2_INVALID_MBUF_SEQN;
3202bfe3f2eSlogwang }
3212bfe3f2eSlogwang i++;
3222bfe3f2eSlogwang }
323d30ea906Sjfb8856606 DPAA2_PER_LCORE_DQRR_HELD = 0;
3242bfe3f2eSlogwang
3252bfe3f2eSlogwang do {
3262bfe3f2eSlogwang dq = qbman_swp_dqrr_next(swp);
3272bfe3f2eSlogwang if (!dq) {
3282bfe3f2eSlogwang if (!num_pkts && timeout_ticks) {
3292bfe3f2eSlogwang dpaa2_eventdev_dequeue_wait(timeout_ticks);
3302bfe3f2eSlogwang timeout_ticks = 0;
3312bfe3f2eSlogwang continue;
3322bfe3f2eSlogwang }
3332bfe3f2eSlogwang return num_pkts;
3342bfe3f2eSlogwang }
335d30ea906Sjfb8856606 qbman_swp_prefetch_dqrr_next(swp);
3362bfe3f2eSlogwang
3372bfe3f2eSlogwang fd = qbman_result_DQ_fd(dq);
338d30ea906Sjfb8856606 rxq = (struct dpaa2_queue *)(size_t)qbman_result_DQ_fqd_ctx(dq);
3392bfe3f2eSlogwang if (rxq) {
3402bfe3f2eSlogwang rxq->cb(swp, fd, dq, rxq, &ev[num_pkts]);
3412bfe3f2eSlogwang } else {
3422bfe3f2eSlogwang qbman_swp_dqrr_consume(swp, dq);
343d30ea906Sjfb8856606 DPAA2_EVENTDEV_ERR("Null Return VQ received");
3442bfe3f2eSlogwang return 0;
3452bfe3f2eSlogwang }
3462bfe3f2eSlogwang
3472bfe3f2eSlogwang num_pkts++;
3482bfe3f2eSlogwang } while (num_pkts < nb_events);
3492bfe3f2eSlogwang
3502bfe3f2eSlogwang return num_pkts;
351d30ea906Sjfb8856606 err:
352d30ea906Sjfb8856606 for (n = 0; n < i; n++) {
353d30ea906Sjfb8856606 evq_info = &dpaa2_portal->evq_info[n];
354d30ea906Sjfb8856606 if (!evq_info->event_port)
355d30ea906Sjfb8856606 continue;
356d30ea906Sjfb8856606
357d30ea906Sjfb8856606 qbman_swp_push_set(swp, evq_info->dpcon->channel_index, 0);
358d30ea906Sjfb8856606 dpio_remove_static_dequeue_channel(dpio_dev->dpio, 0,
359d30ea906Sjfb8856606 dpio_dev->token,
360d30ea906Sjfb8856606 evq_info->dpcon->dpcon_id);
361d30ea906Sjfb8856606 }
362d30ea906Sjfb8856606 return 0;
3632bfe3f2eSlogwang }
3642bfe3f2eSlogwang
3652bfe3f2eSlogwang static uint16_t
dpaa2_eventdev_dequeue(void * port,struct rte_event * ev,uint64_t timeout_ticks)3662bfe3f2eSlogwang dpaa2_eventdev_dequeue(void *port, struct rte_event *ev,
3672bfe3f2eSlogwang uint64_t timeout_ticks)
3682bfe3f2eSlogwang {
3692bfe3f2eSlogwang return dpaa2_eventdev_dequeue_burst(port, ev, 1, timeout_ticks);
3702bfe3f2eSlogwang }
3712bfe3f2eSlogwang
3722bfe3f2eSlogwang static void
dpaa2_eventdev_info_get(struct rte_eventdev * dev,struct rte_event_dev_info * dev_info)3732bfe3f2eSlogwang dpaa2_eventdev_info_get(struct rte_eventdev *dev,
3742bfe3f2eSlogwang struct rte_event_dev_info *dev_info)
3752bfe3f2eSlogwang {
3762bfe3f2eSlogwang struct dpaa2_eventdev *priv = dev->data->dev_private;
3772bfe3f2eSlogwang
378d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
3792bfe3f2eSlogwang
3802bfe3f2eSlogwang RTE_SET_USED(dev);
3812bfe3f2eSlogwang
3822bfe3f2eSlogwang memset(dev_info, 0, sizeof(struct rte_event_dev_info));
3832bfe3f2eSlogwang dev_info->min_dequeue_timeout_ns =
3842bfe3f2eSlogwang DPAA2_EVENT_MIN_DEQUEUE_TIMEOUT;
3852bfe3f2eSlogwang dev_info->max_dequeue_timeout_ns =
3862bfe3f2eSlogwang DPAA2_EVENT_MAX_DEQUEUE_TIMEOUT;
3872bfe3f2eSlogwang dev_info->dequeue_timeout_ns =
388d30ea906Sjfb8856606 DPAA2_EVENT_PORT_DEQUEUE_TIMEOUT_NS;
3892bfe3f2eSlogwang dev_info->max_event_queues = priv->max_event_queues;
3902bfe3f2eSlogwang dev_info->max_event_queue_flows =
3912bfe3f2eSlogwang DPAA2_EVENT_MAX_QUEUE_FLOWS;
3922bfe3f2eSlogwang dev_info->max_event_queue_priority_levels =
3932bfe3f2eSlogwang DPAA2_EVENT_MAX_QUEUE_PRIORITY_LEVELS;
3942bfe3f2eSlogwang dev_info->max_event_priority_levels =
3952bfe3f2eSlogwang DPAA2_EVENT_MAX_EVENT_PRIORITY_LEVELS;
396d30ea906Sjfb8856606 dev_info->max_event_ports = rte_fslmc_get_device_count(DPAA2_IO);
397d30ea906Sjfb8856606 /* we only support dpio up to number of cores */
398d30ea906Sjfb8856606 if (dev_info->max_event_ports > rte_lcore_count())
399d30ea906Sjfb8856606 dev_info->max_event_ports = rte_lcore_count();
4002bfe3f2eSlogwang dev_info->max_event_port_dequeue_depth =
4012bfe3f2eSlogwang DPAA2_EVENT_MAX_PORT_DEQUEUE_DEPTH;
4022bfe3f2eSlogwang dev_info->max_event_port_enqueue_depth =
4032bfe3f2eSlogwang DPAA2_EVENT_MAX_PORT_ENQUEUE_DEPTH;
4042bfe3f2eSlogwang dev_info->max_num_events = DPAA2_EVENT_MAX_NUM_EVENTS;
4052bfe3f2eSlogwang dev_info->event_dev_cap = RTE_EVENT_DEV_CAP_DISTRIBUTED_SCHED |
406d30ea906Sjfb8856606 RTE_EVENT_DEV_CAP_BURST_MODE|
407d30ea906Sjfb8856606 RTE_EVENT_DEV_CAP_RUNTIME_PORT_LINK |
408d30ea906Sjfb8856606 RTE_EVENT_DEV_CAP_MULTIPLE_QUEUE_PORT |
4090c6bd470Sfengbojiang RTE_EVENT_DEV_CAP_NONSEQ_MODE |
410*2d9fd380Sjfb8856606 RTE_EVENT_DEV_CAP_QUEUE_ALL_TYPES |
411*2d9fd380Sjfb8856606 RTE_EVENT_DEV_CAP_CARRY_FLOW_ID;
412d30ea906Sjfb8856606
4132bfe3f2eSlogwang }
4142bfe3f2eSlogwang
4152bfe3f2eSlogwang static int
dpaa2_eventdev_configure(const struct rte_eventdev * dev)4162bfe3f2eSlogwang dpaa2_eventdev_configure(const struct rte_eventdev *dev)
4172bfe3f2eSlogwang {
4182bfe3f2eSlogwang struct dpaa2_eventdev *priv = dev->data->dev_private;
4192bfe3f2eSlogwang struct rte_event_dev_config *conf = &dev->data->dev_conf;
4202bfe3f2eSlogwang
421d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
4222bfe3f2eSlogwang
4232bfe3f2eSlogwang priv->nb_event_queues = conf->nb_event_queues;
4242bfe3f2eSlogwang priv->nb_event_ports = conf->nb_event_ports;
4252bfe3f2eSlogwang priv->nb_event_queue_flows = conf->nb_event_queue_flows;
4262bfe3f2eSlogwang priv->nb_event_port_dequeue_depth = conf->nb_event_port_dequeue_depth;
4272bfe3f2eSlogwang priv->nb_event_port_enqueue_depth = conf->nb_event_port_enqueue_depth;
4282bfe3f2eSlogwang priv->event_dev_cfg = conf->event_dev_cfg;
4292bfe3f2eSlogwang
430d30ea906Sjfb8856606 /* Check dequeue timeout method is per dequeue or global */
431d30ea906Sjfb8856606 if (priv->event_dev_cfg & RTE_EVENT_DEV_CFG_PER_DEQUEUE_TIMEOUT) {
432d30ea906Sjfb8856606 /*
433d30ea906Sjfb8856606 * Use timeout value as given in dequeue operation.
434d30ea906Sjfb8856606 * So invalidating this timeout value.
435d30ea906Sjfb8856606 */
436d30ea906Sjfb8856606 priv->dequeue_timeout_ns = 0;
437d30ea906Sjfb8856606
438d30ea906Sjfb8856606 } else if (conf->dequeue_timeout_ns == 0) {
439d30ea906Sjfb8856606 priv->dequeue_timeout_ns = DPAA2_EVENT_PORT_DEQUEUE_TIMEOUT_NS;
440d30ea906Sjfb8856606 } else {
441d30ea906Sjfb8856606 priv->dequeue_timeout_ns = conf->dequeue_timeout_ns;
442d30ea906Sjfb8856606 }
443d30ea906Sjfb8856606
444d30ea906Sjfb8856606 DPAA2_EVENTDEV_DEBUG("Configured eventdev devid=%d",
445d30ea906Sjfb8856606 dev->data->dev_id);
4462bfe3f2eSlogwang return 0;
4472bfe3f2eSlogwang }
4482bfe3f2eSlogwang
4492bfe3f2eSlogwang static int
dpaa2_eventdev_start(struct rte_eventdev * dev)4502bfe3f2eSlogwang dpaa2_eventdev_start(struct rte_eventdev *dev)
4512bfe3f2eSlogwang {
452d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
4532bfe3f2eSlogwang
4542bfe3f2eSlogwang RTE_SET_USED(dev);
4552bfe3f2eSlogwang
4562bfe3f2eSlogwang return 0;
4572bfe3f2eSlogwang }
4582bfe3f2eSlogwang
4592bfe3f2eSlogwang static void
dpaa2_eventdev_stop(struct rte_eventdev * dev)4602bfe3f2eSlogwang dpaa2_eventdev_stop(struct rte_eventdev *dev)
4612bfe3f2eSlogwang {
462d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
4632bfe3f2eSlogwang
4642bfe3f2eSlogwang RTE_SET_USED(dev);
4652bfe3f2eSlogwang }
4662bfe3f2eSlogwang
4672bfe3f2eSlogwang static int
dpaa2_eventdev_close(struct rte_eventdev * dev)4682bfe3f2eSlogwang dpaa2_eventdev_close(struct rte_eventdev *dev)
4692bfe3f2eSlogwang {
470d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
4712bfe3f2eSlogwang
4722bfe3f2eSlogwang RTE_SET_USED(dev);
4732bfe3f2eSlogwang
4742bfe3f2eSlogwang return 0;
4752bfe3f2eSlogwang }
4762bfe3f2eSlogwang
4772bfe3f2eSlogwang static void
dpaa2_eventdev_queue_def_conf(struct rte_eventdev * dev,uint8_t queue_id,struct rte_event_queue_conf * queue_conf)4782bfe3f2eSlogwang dpaa2_eventdev_queue_def_conf(struct rte_eventdev *dev, uint8_t queue_id,
4792bfe3f2eSlogwang struct rte_event_queue_conf *queue_conf)
4802bfe3f2eSlogwang {
481d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
4822bfe3f2eSlogwang
4832bfe3f2eSlogwang RTE_SET_USED(dev);
4842bfe3f2eSlogwang RTE_SET_USED(queue_id);
4852bfe3f2eSlogwang
4862bfe3f2eSlogwang queue_conf->nb_atomic_flows = DPAA2_EVENT_QUEUE_ATOMIC_FLOWS;
4874418919fSjohnjiang queue_conf->nb_atomic_order_sequences =
4884418919fSjohnjiang DPAA2_EVENT_QUEUE_ORDER_SEQUENCES;
4894418919fSjohnjiang queue_conf->schedule_type = RTE_SCHED_TYPE_PARALLEL;
4902bfe3f2eSlogwang queue_conf->priority = RTE_EVENT_DEV_PRIORITY_NORMAL;
4912bfe3f2eSlogwang }
4922bfe3f2eSlogwang
4932bfe3f2eSlogwang static int
dpaa2_eventdev_queue_setup(struct rte_eventdev * dev,uint8_t queue_id,const struct rte_event_queue_conf * queue_conf)4942bfe3f2eSlogwang dpaa2_eventdev_queue_setup(struct rte_eventdev *dev, uint8_t queue_id,
4952bfe3f2eSlogwang const struct rte_event_queue_conf *queue_conf)
4962bfe3f2eSlogwang {
4972bfe3f2eSlogwang struct dpaa2_eventdev *priv = dev->data->dev_private;
498d30ea906Sjfb8856606 struct dpaa2_eventq *evq_info = &priv->evq_info[queue_id];
4992bfe3f2eSlogwang
500d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
5012bfe3f2eSlogwang
502d30ea906Sjfb8856606 switch (queue_conf->schedule_type) {
503d30ea906Sjfb8856606 case RTE_SCHED_TYPE_PARALLEL:
504d30ea906Sjfb8856606 case RTE_SCHED_TYPE_ATOMIC:
505d30ea906Sjfb8856606 case RTE_SCHED_TYPE_ORDERED:
5064418919fSjohnjiang break;
5074418919fSjohnjiang default:
508d30ea906Sjfb8856606 DPAA2_EVENTDEV_ERR("Schedule type is not supported.");
509d30ea906Sjfb8856606 return -1;
510d30ea906Sjfb8856606 }
5112bfe3f2eSlogwang evq_info->event_queue_cfg = queue_conf->event_queue_cfg;
512d30ea906Sjfb8856606 evq_info->event_queue_id = queue_id;
5132bfe3f2eSlogwang
5142bfe3f2eSlogwang return 0;
5152bfe3f2eSlogwang }
5162bfe3f2eSlogwang
5172bfe3f2eSlogwang static void
dpaa2_eventdev_queue_release(struct rte_eventdev * dev,uint8_t queue_id)518d30ea906Sjfb8856606 dpaa2_eventdev_queue_release(struct rte_eventdev *dev, uint8_t queue_id)
519d30ea906Sjfb8856606 {
520d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
521d30ea906Sjfb8856606
522d30ea906Sjfb8856606 RTE_SET_USED(dev);
523d30ea906Sjfb8856606 RTE_SET_USED(queue_id);
524d30ea906Sjfb8856606 }
525d30ea906Sjfb8856606
526d30ea906Sjfb8856606 static void
dpaa2_eventdev_port_def_conf(struct rte_eventdev * dev,uint8_t port_id,struct rte_event_port_conf * port_conf)5272bfe3f2eSlogwang dpaa2_eventdev_port_def_conf(struct rte_eventdev *dev, uint8_t port_id,
5282bfe3f2eSlogwang struct rte_event_port_conf *port_conf)
5292bfe3f2eSlogwang {
530d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
5312bfe3f2eSlogwang
5322bfe3f2eSlogwang RTE_SET_USED(dev);
5332bfe3f2eSlogwang RTE_SET_USED(port_id);
5342bfe3f2eSlogwang
5352bfe3f2eSlogwang port_conf->new_event_threshold =
5362bfe3f2eSlogwang DPAA2_EVENT_MAX_NUM_EVENTS;
5372bfe3f2eSlogwang port_conf->dequeue_depth =
5382bfe3f2eSlogwang DPAA2_EVENT_MAX_PORT_DEQUEUE_DEPTH;
5392bfe3f2eSlogwang port_conf->enqueue_depth =
5402bfe3f2eSlogwang DPAA2_EVENT_MAX_PORT_ENQUEUE_DEPTH;
541*2d9fd380Sjfb8856606 port_conf->event_port_cfg = 0;
5422bfe3f2eSlogwang }
5432bfe3f2eSlogwang
5442bfe3f2eSlogwang static int
dpaa2_eventdev_port_setup(struct rte_eventdev * dev,uint8_t port_id,const struct rte_event_port_conf * port_conf)5452bfe3f2eSlogwang dpaa2_eventdev_port_setup(struct rte_eventdev *dev, uint8_t port_id,
5462bfe3f2eSlogwang const struct rte_event_port_conf *port_conf)
5472bfe3f2eSlogwang {
548d30ea906Sjfb8856606 char event_port_name[32];
549d30ea906Sjfb8856606 struct dpaa2_port *portal;
550d30ea906Sjfb8856606
551d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
5522bfe3f2eSlogwang
5532bfe3f2eSlogwang RTE_SET_USED(port_conf);
5542bfe3f2eSlogwang
555d30ea906Sjfb8856606 sprintf(event_port_name, "event-port-%d", port_id);
556d30ea906Sjfb8856606 portal = rte_malloc(event_port_name, sizeof(struct dpaa2_port), 0);
557d30ea906Sjfb8856606 if (!portal) {
558d30ea906Sjfb8856606 DPAA2_EVENTDEV_ERR("Memory allocation failure");
559d30ea906Sjfb8856606 return -ENOMEM;
5602bfe3f2eSlogwang }
5612bfe3f2eSlogwang
562d30ea906Sjfb8856606 memset(portal, 0, sizeof(struct dpaa2_port));
563d30ea906Sjfb8856606 dev->data->ports[port_id] = portal;
5642bfe3f2eSlogwang return 0;
5652bfe3f2eSlogwang }
5662bfe3f2eSlogwang
567d30ea906Sjfb8856606 static void
dpaa2_eventdev_port_release(void * port)568d30ea906Sjfb8856606 dpaa2_eventdev_port_release(void *port)
5692bfe3f2eSlogwang {
570d30ea906Sjfb8856606 struct dpaa2_port *portal = port;
5712bfe3f2eSlogwang
572d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
5732bfe3f2eSlogwang
5740c6bd470Sfengbojiang if (portal == NULL)
5750c6bd470Sfengbojiang return;
5760c6bd470Sfengbojiang
577d30ea906Sjfb8856606 /* TODO: Cleanup is required when ports are in linked state. */
578d30ea906Sjfb8856606 if (portal->is_port_linked)
579d30ea906Sjfb8856606 DPAA2_EVENTDEV_WARN("Event port must be unlinked before release");
5802bfe3f2eSlogwang
581d30ea906Sjfb8856606 rte_free(portal);
5822bfe3f2eSlogwang }
5832bfe3f2eSlogwang
5842bfe3f2eSlogwang static int
dpaa2_eventdev_port_link(struct rte_eventdev * dev,void * port,const uint8_t queues[],const uint8_t priorities[],uint16_t nb_links)5852bfe3f2eSlogwang dpaa2_eventdev_port_link(struct rte_eventdev *dev, void *port,
5862bfe3f2eSlogwang const uint8_t queues[], const uint8_t priorities[],
5872bfe3f2eSlogwang uint16_t nb_links)
5882bfe3f2eSlogwang {
5892bfe3f2eSlogwang struct dpaa2_eventdev *priv = dev->data->dev_private;
590d30ea906Sjfb8856606 struct dpaa2_port *dpaa2_portal = port;
591d30ea906Sjfb8856606 struct dpaa2_eventq *evq_info;
592d30ea906Sjfb8856606 uint16_t i;
5932bfe3f2eSlogwang
594d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
5955af785ecSfengbojiang(姜凤波)
5965af785ecSfengbojiang(姜凤波) RTE_SET_USED(priorities);
5975af785ecSfengbojiang(姜凤波)
598d30ea906Sjfb8856606 for (i = 0; i < nb_links; i++) {
599d30ea906Sjfb8856606 evq_info = &priv->evq_info[queues[i]];
600d30ea906Sjfb8856606 memcpy(&dpaa2_portal->evq_info[queues[i]], evq_info,
601d30ea906Sjfb8856606 sizeof(struct dpaa2_eventq));
602d30ea906Sjfb8856606 dpaa2_portal->evq_info[queues[i]].event_port = port;
603d30ea906Sjfb8856606 dpaa2_portal->num_linked_evq++;
604d30ea906Sjfb8856606 }
605d30ea906Sjfb8856606
6062bfe3f2eSlogwang return (int)nb_links;
607d30ea906Sjfb8856606 }
608d30ea906Sjfb8856606
609d30ea906Sjfb8856606 static int
dpaa2_eventdev_port_unlink(struct rte_eventdev * dev,void * port,uint8_t queues[],uint16_t nb_unlinks)610d30ea906Sjfb8856606 dpaa2_eventdev_port_unlink(struct rte_eventdev *dev, void *port,
611d30ea906Sjfb8856606 uint8_t queues[], uint16_t nb_unlinks)
612d30ea906Sjfb8856606 {
613d30ea906Sjfb8856606 struct dpaa2_port *dpaa2_portal = port;
614d30ea906Sjfb8856606 int i;
615d30ea906Sjfb8856606 struct dpaa2_dpio_dev *dpio_dev = NULL;
616d30ea906Sjfb8856606 struct dpaa2_eventq *evq_info;
617d30ea906Sjfb8856606 struct qbman_swp *swp;
618d30ea906Sjfb8856606
619d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
620d30ea906Sjfb8856606
621d30ea906Sjfb8856606 RTE_SET_USED(dev);
622d30ea906Sjfb8856606 RTE_SET_USED(queues);
623d30ea906Sjfb8856606
624d30ea906Sjfb8856606 for (i = 0; i < nb_unlinks; i++) {
625d30ea906Sjfb8856606 evq_info = &dpaa2_portal->evq_info[queues[i]];
626d30ea906Sjfb8856606
627d30ea906Sjfb8856606 if (DPAA2_PER_LCORE_DPIO && evq_info->dpcon) {
628d30ea906Sjfb8856606 /* todo dpaa2_portal shall have dpio_dev-no per lcore*/
629d30ea906Sjfb8856606 dpio_dev = DPAA2_PER_LCORE_DPIO;
630d30ea906Sjfb8856606 swp = DPAA2_PER_LCORE_PORTAL;
631d30ea906Sjfb8856606
632d30ea906Sjfb8856606 qbman_swp_push_set(swp,
6332bfe3f2eSlogwang evq_info->dpcon->channel_index, 0);
634d30ea906Sjfb8856606 dpio_remove_static_dequeue_channel(dpio_dev->dpio, 0,
635d30ea906Sjfb8856606 dpio_dev->token,
6362bfe3f2eSlogwang evq_info->dpcon->dpcon_id);
6372bfe3f2eSlogwang }
638d30ea906Sjfb8856606 memset(evq_info, 0, sizeof(struct dpaa2_eventq));
639d30ea906Sjfb8856606 if (dpaa2_portal->num_linked_evq)
640d30ea906Sjfb8856606 dpaa2_portal->num_linked_evq--;
6412bfe3f2eSlogwang }
6422bfe3f2eSlogwang
643d30ea906Sjfb8856606 if (!dpaa2_portal->num_linked_evq)
644d30ea906Sjfb8856606 dpaa2_portal->is_port_linked = false;
645d30ea906Sjfb8856606
646d30ea906Sjfb8856606 return (int)nb_unlinks;
647d30ea906Sjfb8856606 }
648d30ea906Sjfb8856606
649d30ea906Sjfb8856606
6502bfe3f2eSlogwang static int
dpaa2_eventdev_timeout_ticks(struct rte_eventdev * dev,uint64_t ns,uint64_t * timeout_ticks)6512bfe3f2eSlogwang dpaa2_eventdev_timeout_ticks(struct rte_eventdev *dev, uint64_t ns,
6522bfe3f2eSlogwang uint64_t *timeout_ticks)
6532bfe3f2eSlogwang {
654d30ea906Sjfb8856606 uint32_t scale = 1000*1000;
6552bfe3f2eSlogwang
656d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
6572bfe3f2eSlogwang
6582bfe3f2eSlogwang RTE_SET_USED(dev);
6594b05018fSfengbojiang *timeout_ticks = ns / scale;
6602bfe3f2eSlogwang
6612bfe3f2eSlogwang return 0;
6622bfe3f2eSlogwang }
6632bfe3f2eSlogwang
6642bfe3f2eSlogwang static void
dpaa2_eventdev_dump(struct rte_eventdev * dev,FILE * f)6652bfe3f2eSlogwang dpaa2_eventdev_dump(struct rte_eventdev *dev, FILE *f)
6662bfe3f2eSlogwang {
667d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
6682bfe3f2eSlogwang
6692bfe3f2eSlogwang RTE_SET_USED(dev);
6702bfe3f2eSlogwang RTE_SET_USED(f);
6712bfe3f2eSlogwang }
6722bfe3f2eSlogwang
6732bfe3f2eSlogwang static int
dpaa2_eventdev_eth_caps_get(const struct rte_eventdev * dev,const struct rte_eth_dev * eth_dev,uint32_t * caps)6742bfe3f2eSlogwang dpaa2_eventdev_eth_caps_get(const struct rte_eventdev *dev,
6752bfe3f2eSlogwang const struct rte_eth_dev *eth_dev,
6762bfe3f2eSlogwang uint32_t *caps)
6772bfe3f2eSlogwang {
6782bfe3f2eSlogwang const char *ethdev_driver = eth_dev->device->driver->name;
6792bfe3f2eSlogwang
680d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
6812bfe3f2eSlogwang
6822bfe3f2eSlogwang RTE_SET_USED(dev);
6832bfe3f2eSlogwang
6842bfe3f2eSlogwang if (!strcmp(ethdev_driver, "net_dpaa2"))
6852bfe3f2eSlogwang *caps = RTE_EVENT_ETH_RX_ADAPTER_DPAA2_CAP;
6862bfe3f2eSlogwang else
6872bfe3f2eSlogwang *caps = RTE_EVENT_ETH_RX_ADAPTER_SW_CAP;
6882bfe3f2eSlogwang
6892bfe3f2eSlogwang return 0;
6902bfe3f2eSlogwang }
6912bfe3f2eSlogwang
6922bfe3f2eSlogwang static int
dpaa2_eventdev_eth_queue_add_all(const struct rte_eventdev * dev,const struct rte_eth_dev * eth_dev,const struct rte_event_eth_rx_adapter_queue_conf * queue_conf)6932bfe3f2eSlogwang dpaa2_eventdev_eth_queue_add_all(const struct rte_eventdev *dev,
6942bfe3f2eSlogwang const struct rte_eth_dev *eth_dev,
6952bfe3f2eSlogwang const struct rte_event_eth_rx_adapter_queue_conf *queue_conf)
6962bfe3f2eSlogwang {
6972bfe3f2eSlogwang struct dpaa2_eventdev *priv = dev->data->dev_private;
6982bfe3f2eSlogwang uint8_t ev_qid = queue_conf->ev.queue_id;
6994418919fSjohnjiang struct dpaa2_dpcon_dev *dpcon = priv->evq_info[ev_qid].dpcon;
7002bfe3f2eSlogwang int i, ret;
7012bfe3f2eSlogwang
702d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
7032bfe3f2eSlogwang
7042bfe3f2eSlogwang for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
7052bfe3f2eSlogwang ret = dpaa2_eth_eventq_attach(eth_dev, i,
7064418919fSjohnjiang dpcon, queue_conf);
7072bfe3f2eSlogwang if (ret) {
708d30ea906Sjfb8856606 DPAA2_EVENTDEV_ERR(
709d30ea906Sjfb8856606 "Event queue attach failed: err(%d)", ret);
7102bfe3f2eSlogwang goto fail;
7112bfe3f2eSlogwang }
7122bfe3f2eSlogwang }
7132bfe3f2eSlogwang return 0;
7142bfe3f2eSlogwang fail:
7152bfe3f2eSlogwang for (i = (i - 1); i >= 0 ; i--)
7162bfe3f2eSlogwang dpaa2_eth_eventq_detach(eth_dev, i);
7172bfe3f2eSlogwang
7182bfe3f2eSlogwang return ret;
7192bfe3f2eSlogwang }
7202bfe3f2eSlogwang
7212bfe3f2eSlogwang static int
dpaa2_eventdev_eth_queue_add(const struct rte_eventdev * dev,const struct rte_eth_dev * eth_dev,int32_t rx_queue_id,const struct rte_event_eth_rx_adapter_queue_conf * queue_conf)7222bfe3f2eSlogwang dpaa2_eventdev_eth_queue_add(const struct rte_eventdev *dev,
7232bfe3f2eSlogwang const struct rte_eth_dev *eth_dev,
7242bfe3f2eSlogwang int32_t rx_queue_id,
7252bfe3f2eSlogwang const struct rte_event_eth_rx_adapter_queue_conf *queue_conf)
7262bfe3f2eSlogwang {
7272bfe3f2eSlogwang struct dpaa2_eventdev *priv = dev->data->dev_private;
7282bfe3f2eSlogwang uint8_t ev_qid = queue_conf->ev.queue_id;
7294418919fSjohnjiang struct dpaa2_dpcon_dev *dpcon = priv->evq_info[ev_qid].dpcon;
7302bfe3f2eSlogwang int ret;
7312bfe3f2eSlogwang
732d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
7332bfe3f2eSlogwang
7342bfe3f2eSlogwang if (rx_queue_id == -1)
7352bfe3f2eSlogwang return dpaa2_eventdev_eth_queue_add_all(dev,
7362bfe3f2eSlogwang eth_dev, queue_conf);
7372bfe3f2eSlogwang
7382bfe3f2eSlogwang ret = dpaa2_eth_eventq_attach(eth_dev, rx_queue_id,
7394418919fSjohnjiang dpcon, queue_conf);
7402bfe3f2eSlogwang if (ret) {
741d30ea906Sjfb8856606 DPAA2_EVENTDEV_ERR(
742d30ea906Sjfb8856606 "Event queue attach failed: err(%d)", ret);
7432bfe3f2eSlogwang return ret;
7442bfe3f2eSlogwang }
7452bfe3f2eSlogwang return 0;
7462bfe3f2eSlogwang }
7472bfe3f2eSlogwang
7482bfe3f2eSlogwang static int
dpaa2_eventdev_eth_queue_del_all(const struct rte_eventdev * dev,const struct rte_eth_dev * eth_dev)7492bfe3f2eSlogwang dpaa2_eventdev_eth_queue_del_all(const struct rte_eventdev *dev,
7502bfe3f2eSlogwang const struct rte_eth_dev *eth_dev)
7512bfe3f2eSlogwang {
7522bfe3f2eSlogwang int i, ret;
7532bfe3f2eSlogwang
754d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
7552bfe3f2eSlogwang
7562bfe3f2eSlogwang RTE_SET_USED(dev);
7572bfe3f2eSlogwang
7582bfe3f2eSlogwang for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
7592bfe3f2eSlogwang ret = dpaa2_eth_eventq_detach(eth_dev, i);
7602bfe3f2eSlogwang if (ret) {
761d30ea906Sjfb8856606 DPAA2_EVENTDEV_ERR(
762d30ea906Sjfb8856606 "Event queue detach failed: err(%d)", ret);
7632bfe3f2eSlogwang return ret;
7642bfe3f2eSlogwang }
7652bfe3f2eSlogwang }
7662bfe3f2eSlogwang
7672bfe3f2eSlogwang return 0;
7682bfe3f2eSlogwang }
7692bfe3f2eSlogwang
7702bfe3f2eSlogwang static int
dpaa2_eventdev_eth_queue_del(const struct rte_eventdev * dev,const struct rte_eth_dev * eth_dev,int32_t rx_queue_id)7712bfe3f2eSlogwang dpaa2_eventdev_eth_queue_del(const struct rte_eventdev *dev,
7722bfe3f2eSlogwang const struct rte_eth_dev *eth_dev,
7732bfe3f2eSlogwang int32_t rx_queue_id)
7742bfe3f2eSlogwang {
7752bfe3f2eSlogwang int ret;
7762bfe3f2eSlogwang
777d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
7782bfe3f2eSlogwang
7792bfe3f2eSlogwang if (rx_queue_id == -1)
7802bfe3f2eSlogwang return dpaa2_eventdev_eth_queue_del_all(dev, eth_dev);
7812bfe3f2eSlogwang
7822bfe3f2eSlogwang ret = dpaa2_eth_eventq_detach(eth_dev, rx_queue_id);
7832bfe3f2eSlogwang if (ret) {
784d30ea906Sjfb8856606 DPAA2_EVENTDEV_ERR(
785d30ea906Sjfb8856606 "Event queue detach failed: err(%d)", ret);
7862bfe3f2eSlogwang return ret;
7872bfe3f2eSlogwang }
7882bfe3f2eSlogwang
7892bfe3f2eSlogwang return 0;
7902bfe3f2eSlogwang }
7912bfe3f2eSlogwang
7922bfe3f2eSlogwang static int
dpaa2_eventdev_eth_start(const struct rte_eventdev * dev,const struct rte_eth_dev * eth_dev)7932bfe3f2eSlogwang dpaa2_eventdev_eth_start(const struct rte_eventdev *dev,
7942bfe3f2eSlogwang const struct rte_eth_dev *eth_dev)
7952bfe3f2eSlogwang {
796d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
7972bfe3f2eSlogwang
7982bfe3f2eSlogwang RTE_SET_USED(dev);
7992bfe3f2eSlogwang RTE_SET_USED(eth_dev);
8002bfe3f2eSlogwang
8012bfe3f2eSlogwang return 0;
8022bfe3f2eSlogwang }
8032bfe3f2eSlogwang
8042bfe3f2eSlogwang static int
dpaa2_eventdev_eth_stop(const struct rte_eventdev * dev,const struct rte_eth_dev * eth_dev)8052bfe3f2eSlogwang dpaa2_eventdev_eth_stop(const struct rte_eventdev *dev,
8062bfe3f2eSlogwang const struct rte_eth_dev *eth_dev)
8072bfe3f2eSlogwang {
808d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
8092bfe3f2eSlogwang
8102bfe3f2eSlogwang RTE_SET_USED(dev);
8112bfe3f2eSlogwang RTE_SET_USED(eth_dev);
8122bfe3f2eSlogwang
8132bfe3f2eSlogwang return 0;
8142bfe3f2eSlogwang }
8152bfe3f2eSlogwang
816d30ea906Sjfb8856606 static int
dpaa2_eventdev_crypto_caps_get(const struct rte_eventdev * dev,const struct rte_cryptodev * cdev,uint32_t * caps)817d30ea906Sjfb8856606 dpaa2_eventdev_crypto_caps_get(const struct rte_eventdev *dev,
818d30ea906Sjfb8856606 const struct rte_cryptodev *cdev,
819d30ea906Sjfb8856606 uint32_t *caps)
820d30ea906Sjfb8856606 {
821d30ea906Sjfb8856606 const char *name = cdev->data->name;
822d30ea906Sjfb8856606
823d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
824d30ea906Sjfb8856606
825d30ea906Sjfb8856606 RTE_SET_USED(dev);
826d30ea906Sjfb8856606
827d30ea906Sjfb8856606 if (!strncmp(name, "dpsec-", 6))
828d30ea906Sjfb8856606 *caps = RTE_EVENT_CRYPTO_ADAPTER_DPAA2_CAP;
829d30ea906Sjfb8856606 else
830d30ea906Sjfb8856606 return -1;
831d30ea906Sjfb8856606
832d30ea906Sjfb8856606 return 0;
833d30ea906Sjfb8856606 }
834d30ea906Sjfb8856606
835d30ea906Sjfb8856606 static int
dpaa2_eventdev_crypto_queue_add_all(const struct rte_eventdev * dev,const struct rte_cryptodev * cryptodev,const struct rte_event * ev)836d30ea906Sjfb8856606 dpaa2_eventdev_crypto_queue_add_all(const struct rte_eventdev *dev,
837d30ea906Sjfb8856606 const struct rte_cryptodev *cryptodev,
838d30ea906Sjfb8856606 const struct rte_event *ev)
839d30ea906Sjfb8856606 {
840d30ea906Sjfb8856606 struct dpaa2_eventdev *priv = dev->data->dev_private;
841d30ea906Sjfb8856606 uint8_t ev_qid = ev->queue_id;
8424418919fSjohnjiang struct dpaa2_dpcon_dev *dpcon = priv->evq_info[ev_qid].dpcon;
843d30ea906Sjfb8856606 int i, ret;
844d30ea906Sjfb8856606
845d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
846d30ea906Sjfb8856606
847d30ea906Sjfb8856606 for (i = 0; i < cryptodev->data->nb_queue_pairs; i++) {
8484418919fSjohnjiang ret = dpaa2_sec_eventq_attach(cryptodev, i, dpcon, ev);
849d30ea906Sjfb8856606 if (ret) {
850d30ea906Sjfb8856606 DPAA2_EVENTDEV_ERR("dpaa2_sec_eventq_attach failed: ret %d\n",
851d30ea906Sjfb8856606 ret);
852d30ea906Sjfb8856606 goto fail;
853d30ea906Sjfb8856606 }
854d30ea906Sjfb8856606 }
855d30ea906Sjfb8856606 return 0;
856d30ea906Sjfb8856606 fail:
857d30ea906Sjfb8856606 for (i = (i - 1); i >= 0 ; i--)
858d30ea906Sjfb8856606 dpaa2_sec_eventq_detach(cryptodev, i);
859d30ea906Sjfb8856606
860d30ea906Sjfb8856606 return ret;
861d30ea906Sjfb8856606 }
862d30ea906Sjfb8856606
863d30ea906Sjfb8856606 static int
dpaa2_eventdev_crypto_queue_add(const struct rte_eventdev * dev,const struct rte_cryptodev * cryptodev,int32_t rx_queue_id,const struct rte_event * ev)864d30ea906Sjfb8856606 dpaa2_eventdev_crypto_queue_add(const struct rte_eventdev *dev,
865d30ea906Sjfb8856606 const struct rte_cryptodev *cryptodev,
866d30ea906Sjfb8856606 int32_t rx_queue_id,
867d30ea906Sjfb8856606 const struct rte_event *ev)
868d30ea906Sjfb8856606 {
869d30ea906Sjfb8856606 struct dpaa2_eventdev *priv = dev->data->dev_private;
870d30ea906Sjfb8856606 uint8_t ev_qid = ev->queue_id;
8714418919fSjohnjiang struct dpaa2_dpcon_dev *dpcon = priv->evq_info[ev_qid].dpcon;
872d30ea906Sjfb8856606 int ret;
873d30ea906Sjfb8856606
874d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
875d30ea906Sjfb8856606
876d30ea906Sjfb8856606 if (rx_queue_id == -1)
877d30ea906Sjfb8856606 return dpaa2_eventdev_crypto_queue_add_all(dev,
878d30ea906Sjfb8856606 cryptodev, ev);
879d30ea906Sjfb8856606
880d30ea906Sjfb8856606 ret = dpaa2_sec_eventq_attach(cryptodev, rx_queue_id,
8814418919fSjohnjiang dpcon, ev);
882d30ea906Sjfb8856606 if (ret) {
883d30ea906Sjfb8856606 DPAA2_EVENTDEV_ERR(
884d30ea906Sjfb8856606 "dpaa2_sec_eventq_attach failed: ret: %d\n", ret);
885d30ea906Sjfb8856606 return ret;
886d30ea906Sjfb8856606 }
887d30ea906Sjfb8856606 return 0;
888d30ea906Sjfb8856606 }
889d30ea906Sjfb8856606
890d30ea906Sjfb8856606 static int
dpaa2_eventdev_crypto_queue_del_all(const struct rte_eventdev * dev,const struct rte_cryptodev * cdev)891d30ea906Sjfb8856606 dpaa2_eventdev_crypto_queue_del_all(const struct rte_eventdev *dev,
892d30ea906Sjfb8856606 const struct rte_cryptodev *cdev)
893d30ea906Sjfb8856606 {
894d30ea906Sjfb8856606 int i, ret;
895d30ea906Sjfb8856606
896d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
897d30ea906Sjfb8856606
898d30ea906Sjfb8856606 RTE_SET_USED(dev);
899d30ea906Sjfb8856606
900d30ea906Sjfb8856606 for (i = 0; i < cdev->data->nb_queue_pairs; i++) {
901d30ea906Sjfb8856606 ret = dpaa2_sec_eventq_detach(cdev, i);
902d30ea906Sjfb8856606 if (ret) {
903d30ea906Sjfb8856606 DPAA2_EVENTDEV_ERR(
904d30ea906Sjfb8856606 "dpaa2_sec_eventq_detach failed:ret %d\n", ret);
905d30ea906Sjfb8856606 return ret;
906d30ea906Sjfb8856606 }
907d30ea906Sjfb8856606 }
908d30ea906Sjfb8856606
909d30ea906Sjfb8856606 return 0;
910d30ea906Sjfb8856606 }
911d30ea906Sjfb8856606
912d30ea906Sjfb8856606 static int
dpaa2_eventdev_crypto_queue_del(const struct rte_eventdev * dev,const struct rte_cryptodev * cryptodev,int32_t rx_queue_id)913d30ea906Sjfb8856606 dpaa2_eventdev_crypto_queue_del(const struct rte_eventdev *dev,
914d30ea906Sjfb8856606 const struct rte_cryptodev *cryptodev,
915d30ea906Sjfb8856606 int32_t rx_queue_id)
916d30ea906Sjfb8856606 {
917d30ea906Sjfb8856606 int ret;
918d30ea906Sjfb8856606
919d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
920d30ea906Sjfb8856606
921d30ea906Sjfb8856606 if (rx_queue_id == -1)
922d30ea906Sjfb8856606 return dpaa2_eventdev_crypto_queue_del_all(dev, cryptodev);
923d30ea906Sjfb8856606
924d30ea906Sjfb8856606 ret = dpaa2_sec_eventq_detach(cryptodev, rx_queue_id);
925d30ea906Sjfb8856606 if (ret) {
926d30ea906Sjfb8856606 DPAA2_EVENTDEV_ERR(
927d30ea906Sjfb8856606 "dpaa2_sec_eventq_detach failed: ret: %d\n", ret);
928d30ea906Sjfb8856606 return ret;
929d30ea906Sjfb8856606 }
930d30ea906Sjfb8856606
931d30ea906Sjfb8856606 return 0;
932d30ea906Sjfb8856606 }
933d30ea906Sjfb8856606
934d30ea906Sjfb8856606 static int
dpaa2_eventdev_crypto_start(const struct rte_eventdev * dev,const struct rte_cryptodev * cryptodev)935d30ea906Sjfb8856606 dpaa2_eventdev_crypto_start(const struct rte_eventdev *dev,
936d30ea906Sjfb8856606 const struct rte_cryptodev *cryptodev)
937d30ea906Sjfb8856606 {
938d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
939d30ea906Sjfb8856606
940d30ea906Sjfb8856606 RTE_SET_USED(dev);
941d30ea906Sjfb8856606 RTE_SET_USED(cryptodev);
942d30ea906Sjfb8856606
943d30ea906Sjfb8856606 return 0;
944d30ea906Sjfb8856606 }
945d30ea906Sjfb8856606
946d30ea906Sjfb8856606 static int
dpaa2_eventdev_crypto_stop(const struct rte_eventdev * dev,const struct rte_cryptodev * cryptodev)947d30ea906Sjfb8856606 dpaa2_eventdev_crypto_stop(const struct rte_eventdev *dev,
948d30ea906Sjfb8856606 const struct rte_cryptodev *cryptodev)
949d30ea906Sjfb8856606 {
950d30ea906Sjfb8856606 EVENTDEV_INIT_FUNC_TRACE();
951d30ea906Sjfb8856606
952d30ea906Sjfb8856606 RTE_SET_USED(dev);
953d30ea906Sjfb8856606 RTE_SET_USED(cryptodev);
954d30ea906Sjfb8856606
955d30ea906Sjfb8856606 return 0;
956d30ea906Sjfb8856606 }
9574418919fSjohnjiang
9584418919fSjohnjiang static int
dpaa2_eventdev_tx_adapter_create(uint8_t id,const struct rte_eventdev * dev)9594418919fSjohnjiang dpaa2_eventdev_tx_adapter_create(uint8_t id,
9604418919fSjohnjiang const struct rte_eventdev *dev)
9614418919fSjohnjiang {
9624418919fSjohnjiang RTE_SET_USED(id);
9634418919fSjohnjiang RTE_SET_USED(dev);
9644418919fSjohnjiang
9654418919fSjohnjiang /* Nothing to do. Simply return. */
9664418919fSjohnjiang return 0;
9674418919fSjohnjiang }
9684418919fSjohnjiang
9694418919fSjohnjiang static int
dpaa2_eventdev_tx_adapter_caps(const struct rte_eventdev * dev,const struct rte_eth_dev * eth_dev,uint32_t * caps)9704418919fSjohnjiang dpaa2_eventdev_tx_adapter_caps(const struct rte_eventdev *dev,
9714418919fSjohnjiang const struct rte_eth_dev *eth_dev,
9724418919fSjohnjiang uint32_t *caps)
9734418919fSjohnjiang {
9744418919fSjohnjiang RTE_SET_USED(dev);
9754418919fSjohnjiang RTE_SET_USED(eth_dev);
9764418919fSjohnjiang
9774418919fSjohnjiang *caps = RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT;
9784418919fSjohnjiang return 0;
9794418919fSjohnjiang }
9804418919fSjohnjiang
9814418919fSjohnjiang static uint16_t
dpaa2_eventdev_txa_enqueue_same_dest(void * port,struct rte_event ev[],uint16_t nb_events)9824418919fSjohnjiang dpaa2_eventdev_txa_enqueue_same_dest(void *port,
9834418919fSjohnjiang struct rte_event ev[],
9844418919fSjohnjiang uint16_t nb_events)
9854418919fSjohnjiang {
9864418919fSjohnjiang struct rte_mbuf *m[DPAA2_EVENT_MAX_PORT_ENQUEUE_DEPTH], *m0;
9874418919fSjohnjiang uint8_t qid, i;
9884418919fSjohnjiang
9894418919fSjohnjiang RTE_SET_USED(port);
9904418919fSjohnjiang
9914418919fSjohnjiang m0 = (struct rte_mbuf *)ev[0].mbuf;
9924418919fSjohnjiang qid = rte_event_eth_tx_adapter_txq_get(m0);
9934418919fSjohnjiang
9944418919fSjohnjiang for (i = 0; i < nb_events; i++)
9954418919fSjohnjiang m[i] = (struct rte_mbuf *)ev[i].mbuf;
9964418919fSjohnjiang
9974418919fSjohnjiang return rte_eth_tx_burst(m0->port, qid, m, nb_events);
9984418919fSjohnjiang }
9994418919fSjohnjiang
10004418919fSjohnjiang static uint16_t
dpaa2_eventdev_txa_enqueue(void * port,struct rte_event ev[],uint16_t nb_events)10014418919fSjohnjiang dpaa2_eventdev_txa_enqueue(void *port,
10024418919fSjohnjiang struct rte_event ev[],
10034418919fSjohnjiang uint16_t nb_events)
10044418919fSjohnjiang {
10054418919fSjohnjiang struct rte_mbuf *m = (struct rte_mbuf *)ev[0].mbuf;
10064418919fSjohnjiang uint8_t qid, i;
10074418919fSjohnjiang
10084418919fSjohnjiang RTE_SET_USED(port);
10094418919fSjohnjiang
10104418919fSjohnjiang for (i = 0; i < nb_events; i++) {
10114418919fSjohnjiang qid = rte_event_eth_tx_adapter_txq_get(m);
10124418919fSjohnjiang rte_eth_tx_burst(m->port, qid, &m, 1);
10134418919fSjohnjiang }
10144418919fSjohnjiang
10154418919fSjohnjiang return nb_events;
10164418919fSjohnjiang }
1017d30ea906Sjfb8856606
1018d30ea906Sjfb8856606 static struct rte_eventdev_ops dpaa2_eventdev_ops = {
10192bfe3f2eSlogwang .dev_infos_get = dpaa2_eventdev_info_get,
10202bfe3f2eSlogwang .dev_configure = dpaa2_eventdev_configure,
10212bfe3f2eSlogwang .dev_start = dpaa2_eventdev_start,
10222bfe3f2eSlogwang .dev_stop = dpaa2_eventdev_stop,
10232bfe3f2eSlogwang .dev_close = dpaa2_eventdev_close,
10242bfe3f2eSlogwang .queue_def_conf = dpaa2_eventdev_queue_def_conf,
10252bfe3f2eSlogwang .queue_setup = dpaa2_eventdev_queue_setup,
10262bfe3f2eSlogwang .queue_release = dpaa2_eventdev_queue_release,
10272bfe3f2eSlogwang .port_def_conf = dpaa2_eventdev_port_def_conf,
10282bfe3f2eSlogwang .port_setup = dpaa2_eventdev_port_setup,
10292bfe3f2eSlogwang .port_release = dpaa2_eventdev_port_release,
10302bfe3f2eSlogwang .port_link = dpaa2_eventdev_port_link,
10312bfe3f2eSlogwang .port_unlink = dpaa2_eventdev_port_unlink,
10322bfe3f2eSlogwang .timeout_ticks = dpaa2_eventdev_timeout_ticks,
10332bfe3f2eSlogwang .dump = dpaa2_eventdev_dump,
10344418919fSjohnjiang .dev_selftest = test_eventdev_dpaa2,
10352bfe3f2eSlogwang .eth_rx_adapter_caps_get = dpaa2_eventdev_eth_caps_get,
10362bfe3f2eSlogwang .eth_rx_adapter_queue_add = dpaa2_eventdev_eth_queue_add,
10372bfe3f2eSlogwang .eth_rx_adapter_queue_del = dpaa2_eventdev_eth_queue_del,
10382bfe3f2eSlogwang .eth_rx_adapter_start = dpaa2_eventdev_eth_start,
10392bfe3f2eSlogwang .eth_rx_adapter_stop = dpaa2_eventdev_eth_stop,
10404418919fSjohnjiang .eth_tx_adapter_caps_get = dpaa2_eventdev_tx_adapter_caps,
10414418919fSjohnjiang .eth_tx_adapter_create = dpaa2_eventdev_tx_adapter_create,
1042d30ea906Sjfb8856606 .crypto_adapter_caps_get = dpaa2_eventdev_crypto_caps_get,
1043d30ea906Sjfb8856606 .crypto_adapter_queue_pair_add = dpaa2_eventdev_crypto_queue_add,
1044d30ea906Sjfb8856606 .crypto_adapter_queue_pair_del = dpaa2_eventdev_crypto_queue_del,
1045d30ea906Sjfb8856606 .crypto_adapter_start = dpaa2_eventdev_crypto_start,
1046d30ea906Sjfb8856606 .crypto_adapter_stop = dpaa2_eventdev_crypto_stop,
10472bfe3f2eSlogwang };
10482bfe3f2eSlogwang
10492bfe3f2eSlogwang static int
dpaa2_eventdev_setup_dpci(struct dpaa2_dpci_dev * dpci_dev,struct dpaa2_dpcon_dev * dpcon_dev)10502bfe3f2eSlogwang dpaa2_eventdev_setup_dpci(struct dpaa2_dpci_dev *dpci_dev,
10512bfe3f2eSlogwang struct dpaa2_dpcon_dev *dpcon_dev)
10522bfe3f2eSlogwang {
10532bfe3f2eSlogwang struct dpci_rx_queue_cfg rx_queue_cfg;
10542bfe3f2eSlogwang int ret, i;
10552bfe3f2eSlogwang
10562bfe3f2eSlogwang /*Do settings to get the frame on a DPCON object*/
10572bfe3f2eSlogwang rx_queue_cfg.options = DPCI_QUEUE_OPT_DEST |
10582bfe3f2eSlogwang DPCI_QUEUE_OPT_USER_CTX;
10592bfe3f2eSlogwang rx_queue_cfg.dest_cfg.dest_type = DPCI_DEST_DPCON;
10602bfe3f2eSlogwang rx_queue_cfg.dest_cfg.dest_id = dpcon_dev->dpcon_id;
10612bfe3f2eSlogwang rx_queue_cfg.dest_cfg.priority = DPAA2_EVENT_DEFAULT_DPCI_PRIO;
10622bfe3f2eSlogwang
1063d30ea906Sjfb8856606 dpci_dev->rx_queue[DPAA2_EVENT_DPCI_PARALLEL_QUEUE].cb =
10642bfe3f2eSlogwang dpaa2_eventdev_process_parallel;
1065d30ea906Sjfb8856606 dpci_dev->rx_queue[DPAA2_EVENT_DPCI_ATOMIC_QUEUE].cb =
10662bfe3f2eSlogwang dpaa2_eventdev_process_atomic;
10672bfe3f2eSlogwang
10682bfe3f2eSlogwang for (i = 0 ; i < DPAA2_EVENT_DPCI_MAX_QUEUES; i++) {
1069d30ea906Sjfb8856606 rx_queue_cfg.user_ctx = (size_t)(&dpci_dev->rx_queue[i]);
10702bfe3f2eSlogwang ret = dpci_set_rx_queue(&dpci_dev->dpci,
10712bfe3f2eSlogwang CMD_PRI_LOW,
10722bfe3f2eSlogwang dpci_dev->token, i,
10732bfe3f2eSlogwang &rx_queue_cfg);
10742bfe3f2eSlogwang if (ret) {
1075d30ea906Sjfb8856606 DPAA2_EVENTDEV_ERR(
1076d30ea906Sjfb8856606 "DPCI Rx queue setup failed: err(%d)",
1077d30ea906Sjfb8856606 ret);
10782bfe3f2eSlogwang return ret;
10792bfe3f2eSlogwang }
10802bfe3f2eSlogwang }
10812bfe3f2eSlogwang return 0;
10822bfe3f2eSlogwang }
10832bfe3f2eSlogwang
10842bfe3f2eSlogwang static int
dpaa2_eventdev_create(const char * name)10852bfe3f2eSlogwang dpaa2_eventdev_create(const char *name)
10862bfe3f2eSlogwang {
10872bfe3f2eSlogwang struct rte_eventdev *eventdev;
10882bfe3f2eSlogwang struct dpaa2_eventdev *priv;
10892bfe3f2eSlogwang struct dpaa2_dpcon_dev *dpcon_dev = NULL;
10902bfe3f2eSlogwang struct dpaa2_dpci_dev *dpci_dev = NULL;
10912bfe3f2eSlogwang int ret;
10922bfe3f2eSlogwang
10932bfe3f2eSlogwang eventdev = rte_event_pmd_vdev_init(name,
10942bfe3f2eSlogwang sizeof(struct dpaa2_eventdev),
10952bfe3f2eSlogwang rte_socket_id());
10962bfe3f2eSlogwang if (eventdev == NULL) {
1097d30ea906Sjfb8856606 DPAA2_EVENTDEV_ERR("Failed to create Event device %s", name);
10982bfe3f2eSlogwang goto fail;
10992bfe3f2eSlogwang }
11002bfe3f2eSlogwang
11012bfe3f2eSlogwang eventdev->dev_ops = &dpaa2_eventdev_ops;
11022bfe3f2eSlogwang eventdev->enqueue = dpaa2_eventdev_enqueue;
11032bfe3f2eSlogwang eventdev->enqueue_burst = dpaa2_eventdev_enqueue_burst;
11042bfe3f2eSlogwang eventdev->enqueue_new_burst = dpaa2_eventdev_enqueue_burst;
11052bfe3f2eSlogwang eventdev->enqueue_forward_burst = dpaa2_eventdev_enqueue_burst;
11062bfe3f2eSlogwang eventdev->dequeue = dpaa2_eventdev_dequeue;
11072bfe3f2eSlogwang eventdev->dequeue_burst = dpaa2_eventdev_dequeue_burst;
11084418919fSjohnjiang eventdev->txa_enqueue = dpaa2_eventdev_txa_enqueue;
11094418919fSjohnjiang eventdev->txa_enqueue_same_dest = dpaa2_eventdev_txa_enqueue_same_dest;
11102bfe3f2eSlogwang
11112bfe3f2eSlogwang /* For secondary processes, the primary has done all the work */
11122bfe3f2eSlogwang if (rte_eal_process_type() != RTE_PROC_PRIMARY)
11132bfe3f2eSlogwang return 0;
11142bfe3f2eSlogwang
11152bfe3f2eSlogwang priv = eventdev->data->dev_private;
11162bfe3f2eSlogwang priv->max_event_queues = 0;
11172bfe3f2eSlogwang
11182bfe3f2eSlogwang do {
11192bfe3f2eSlogwang dpcon_dev = rte_dpaa2_alloc_dpcon_dev();
11202bfe3f2eSlogwang if (!dpcon_dev)
11212bfe3f2eSlogwang break;
11222bfe3f2eSlogwang priv->evq_info[priv->max_event_queues].dpcon = dpcon_dev;
11232bfe3f2eSlogwang
11242bfe3f2eSlogwang dpci_dev = rte_dpaa2_alloc_dpci_dev();
11252bfe3f2eSlogwang if (!dpci_dev) {
11262bfe3f2eSlogwang rte_dpaa2_free_dpcon_dev(dpcon_dev);
11272bfe3f2eSlogwang break;
11282bfe3f2eSlogwang }
11292bfe3f2eSlogwang priv->evq_info[priv->max_event_queues].dpci = dpci_dev;
11302bfe3f2eSlogwang
11312bfe3f2eSlogwang ret = dpaa2_eventdev_setup_dpci(dpci_dev, dpcon_dev);
11322bfe3f2eSlogwang if (ret) {
1133d30ea906Sjfb8856606 DPAA2_EVENTDEV_ERR(
1134d30ea906Sjfb8856606 "DPCI setup failed: err(%d)", ret);
11352bfe3f2eSlogwang return ret;
11362bfe3f2eSlogwang }
11372bfe3f2eSlogwang priv->max_event_queues++;
11382bfe3f2eSlogwang } while (dpcon_dev && dpci_dev);
11392bfe3f2eSlogwang
1140d30ea906Sjfb8856606 RTE_LOG(INFO, PMD, "%s eventdev created\n", name);
1141d30ea906Sjfb8856606
11422bfe3f2eSlogwang return 0;
11432bfe3f2eSlogwang fail:
11442bfe3f2eSlogwang return -EFAULT;
11452bfe3f2eSlogwang }
11462bfe3f2eSlogwang
11472bfe3f2eSlogwang static int
dpaa2_eventdev_destroy(const char * name)11484418919fSjohnjiang dpaa2_eventdev_destroy(const char *name)
11494418919fSjohnjiang {
11504418919fSjohnjiang struct rte_eventdev *eventdev;
11514418919fSjohnjiang struct dpaa2_eventdev *priv;
11524418919fSjohnjiang int i;
11534418919fSjohnjiang
11544418919fSjohnjiang eventdev = rte_event_pmd_get_named_dev(name);
11554418919fSjohnjiang if (eventdev == NULL) {
11564418919fSjohnjiang RTE_EDEV_LOG_ERR("eventdev with name %s not allocated", name);
11574418919fSjohnjiang return -1;
11584418919fSjohnjiang }
11594418919fSjohnjiang
11604418919fSjohnjiang /* For secondary processes, the primary has done all the work */
11614418919fSjohnjiang if (rte_eal_process_type() != RTE_PROC_PRIMARY)
11624418919fSjohnjiang return 0;
11634418919fSjohnjiang
11644418919fSjohnjiang priv = eventdev->data->dev_private;
11654418919fSjohnjiang for (i = 0; i < priv->max_event_queues; i++) {
11664418919fSjohnjiang if (priv->evq_info[i].dpcon)
11674418919fSjohnjiang rte_dpaa2_free_dpcon_dev(priv->evq_info[i].dpcon);
11684418919fSjohnjiang
11694418919fSjohnjiang if (priv->evq_info[i].dpci)
11704418919fSjohnjiang rte_dpaa2_free_dpci_dev(priv->evq_info[i].dpci);
11714418919fSjohnjiang
11724418919fSjohnjiang }
11734418919fSjohnjiang priv->max_event_queues = 0;
11744418919fSjohnjiang
11754418919fSjohnjiang RTE_LOG(INFO, PMD, "%s eventdev cleaned\n", name);
11764418919fSjohnjiang return 0;
11774418919fSjohnjiang }
11784418919fSjohnjiang
11794418919fSjohnjiang
11804418919fSjohnjiang static int
dpaa2_eventdev_probe(struct rte_vdev_device * vdev)11812bfe3f2eSlogwang dpaa2_eventdev_probe(struct rte_vdev_device *vdev)
11822bfe3f2eSlogwang {
11832bfe3f2eSlogwang const char *name;
11842bfe3f2eSlogwang
11852bfe3f2eSlogwang name = rte_vdev_device_name(vdev);
1186d30ea906Sjfb8856606 DPAA2_EVENTDEV_INFO("Initializing %s", name);
11872bfe3f2eSlogwang return dpaa2_eventdev_create(name);
11882bfe3f2eSlogwang }
11892bfe3f2eSlogwang
11902bfe3f2eSlogwang static int
dpaa2_eventdev_remove(struct rte_vdev_device * vdev)11912bfe3f2eSlogwang dpaa2_eventdev_remove(struct rte_vdev_device *vdev)
11922bfe3f2eSlogwang {
11932bfe3f2eSlogwang const char *name;
11942bfe3f2eSlogwang
11952bfe3f2eSlogwang name = rte_vdev_device_name(vdev);
1196d30ea906Sjfb8856606 DPAA2_EVENTDEV_INFO("Closing %s", name);
11972bfe3f2eSlogwang
11984418919fSjohnjiang dpaa2_eventdev_destroy(name);
11994418919fSjohnjiang
12002bfe3f2eSlogwang return rte_event_pmd_vdev_uninit(name);
12012bfe3f2eSlogwang }
12022bfe3f2eSlogwang
12032bfe3f2eSlogwang static struct rte_vdev_driver vdev_eventdev_dpaa2_pmd = {
12042bfe3f2eSlogwang .probe = dpaa2_eventdev_probe,
12052bfe3f2eSlogwang .remove = dpaa2_eventdev_remove
12062bfe3f2eSlogwang };
12072bfe3f2eSlogwang
12082bfe3f2eSlogwang RTE_PMD_REGISTER_VDEV(EVENTDEV_NAME_DPAA2_PMD, vdev_eventdev_dpaa2_pmd);
1209*2d9fd380Sjfb8856606 RTE_LOG_REGISTER(dpaa2_logtype_event, pmd.event.dpaa2, NOTICE);
1210