examples/l3fwd: add event device configuration
[dpdk.git] / examples / l3fwd / l3fwd_event.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2019 Marvell International Ltd.
3  */
4
5 #include <stdbool.h>
6 #include <getopt.h>
7
8 #include <rte_malloc.h>
9
10 #include "l3fwd.h"
11 #include "l3fwd_event.h"
12
13 struct l3fwd_event_resources *
14 l3fwd_get_eventdev_rsrc(void)
15 {
16         static struct l3fwd_event_resources *rsrc;
17
18         if (rsrc != NULL)
19                 return rsrc;
20
21         rsrc = rte_zmalloc("l3fwd", sizeof(struct l3fwd_event_resources), 0);
22         if (rsrc != NULL) {
23                 rsrc->sched_type = RTE_SCHED_TYPE_ATOMIC;
24                 rsrc->eth_rx_queues = 1;
25                 return rsrc;
26         }
27
28         rte_exit(EXIT_FAILURE, "Unable to allocate memory for eventdev cfg\n");
29
30         return NULL;
31 }
32
33 static void
34 l3fwd_event_capability_setup(void)
35 {
36         struct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();
37         uint32_t caps = 0;
38         uint16_t i;
39         int ret;
40
41         RTE_ETH_FOREACH_DEV(i) {
42                 ret = rte_event_eth_tx_adapter_caps_get(0, i, &caps);
43                 if (ret)
44                         rte_exit(EXIT_FAILURE,
45                                  "Invalid capability for Tx adptr port %d\n",
46                                  i);
47
48                 evt_rsrc->tx_mode_q |= !(caps &
49                                    RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT);
50         }
51
52         if (evt_rsrc->tx_mode_q)
53                 l3fwd_event_set_generic_ops(&evt_rsrc->ops);
54         else
55                 l3fwd_event_set_internal_port_ops(&evt_rsrc->ops);
56 }
57
58 void
59 l3fwd_event_resource_setup(void)
60 {
61         struct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();
62
63         if (!evt_rsrc->enabled)
64                 return;
65
66         if (!rte_event_dev_count())
67                 rte_exit(EXIT_FAILURE, "No Eventdev found");
68
69         /* Setup eventdev capability callbacks */
70         l3fwd_event_capability_setup();
71
72         /* Event device configuration */
73         evt_rsrc->ops.event_device_setup();
74 }