1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (C) 2020 Marvell International Ltd.
4 #include <rte_ethdev.h>
5 #include <rte_eventdev.h>
7 #include "event_helper.h"
10 eh_set_default_conf_eventdev(struct eventmode_conf *em_conf)
12 int lcore_count, nb_eventdev, nb_eth_dev, ret;
13 struct eventdev_params *eventdev_config;
14 struct rte_event_dev_info dev_info;
16 /* Get the number of event devices */
17 nb_eventdev = rte_event_dev_count();
18 if (nb_eventdev == 0) {
19 EH_LOG_ERR("No event devices detected");
23 if (nb_eventdev != 1) {
24 EH_LOG_ERR("Event mode does not support multiple event devices. "
25 "Please provide only one event device.");
29 /* Get the number of eth devs */
30 nb_eth_dev = rte_eth_dev_count_avail();
31 if (nb_eth_dev == 0) {
32 EH_LOG_ERR("No eth devices detected");
36 /* Get the number of lcores */
37 lcore_count = rte_lcore_count();
39 /* Read event device info */
40 ret = rte_event_dev_info_get(0, &dev_info);
42 EH_LOG_ERR("Failed to read event device info %d", ret);
46 /* Check if enough ports are available */
47 if (dev_info.max_event_ports < 2) {
48 EH_LOG_ERR("Not enough event ports available");
52 /* Get the first event dev conf */
53 eventdev_config = &(em_conf->eventdev_config[0]);
55 /* Save number of queues & ports available */
56 eventdev_config->eventdev_id = 0;
57 eventdev_config->nb_eventqueue = dev_info.max_event_queues;
58 eventdev_config->nb_eventport = dev_info.max_event_ports;
59 eventdev_config->ev_queue_mode = RTE_EVENT_QUEUE_CFG_ALL_TYPES;
61 /* Check if there are more queues than required */
62 if (eventdev_config->nb_eventqueue > nb_eth_dev + 1) {
63 /* One queue is reserved for Tx */
64 eventdev_config->nb_eventqueue = nb_eth_dev + 1;
67 /* Check if there are more ports than required */
68 if (eventdev_config->nb_eventport > lcore_count) {
69 /* One port per lcore is enough */
70 eventdev_config->nb_eventport = lcore_count;
73 /* Update the number of event devices */
74 em_conf->nb_eventdev++;
80 eh_validate_conf(struct eventmode_conf *em_conf)
85 * Check if event devs are specified. Else probe the event devices
86 * and initialize the config with all ports & queues available
88 if (em_conf->nb_eventdev == 0) {
89 ret = eh_set_default_conf_eventdev(em_conf);
98 eh_initialize_eventdev(struct eventmode_conf *em_conf)
100 struct rte_event_queue_conf eventq_conf = {0};
101 struct rte_event_dev_info evdev_default_conf;
102 struct rte_event_dev_config eventdev_conf;
103 struct eventdev_params *eventdev_config;
104 int nb_eventdev = em_conf->nb_eventdev;
110 for (i = 0; i < nb_eventdev; i++) {
112 /* Get eventdev config */
113 eventdev_config = &(em_conf->eventdev_config[i]);
115 /* Get event dev ID */
116 eventdev_id = eventdev_config->eventdev_id;
118 /* Get the number of queues */
119 nb_eventqueue = eventdev_config->nb_eventqueue;
121 /* Reset the default conf */
122 memset(&evdev_default_conf, 0,
123 sizeof(struct rte_event_dev_info));
125 /* Get default conf of eventdev */
126 ret = rte_event_dev_info_get(eventdev_id, &evdev_default_conf);
129 "Error in getting event device info[devID:%d]",
134 memset(&eventdev_conf, 0, sizeof(struct rte_event_dev_config));
135 eventdev_conf.nb_events_limit =
136 evdev_default_conf.max_num_events;
137 eventdev_conf.nb_event_queues = nb_eventqueue;
138 eventdev_conf.nb_event_ports =
139 eventdev_config->nb_eventport;
140 eventdev_conf.nb_event_queue_flows =
141 evdev_default_conf.max_event_queue_flows;
142 eventdev_conf.nb_event_port_dequeue_depth =
143 evdev_default_conf.max_event_port_dequeue_depth;
144 eventdev_conf.nb_event_port_enqueue_depth =
145 evdev_default_conf.max_event_port_enqueue_depth;
147 /* Configure event device */
148 ret = rte_event_dev_configure(eventdev_id, &eventdev_conf);
150 EH_LOG_ERR("Error in configuring event device");
154 /* Configure event queues */
155 for (j = 0; j < nb_eventqueue; j++) {
157 memset(&eventq_conf, 0,
158 sizeof(struct rte_event_queue_conf));
160 /* Per event dev queues can be ATQ or SINGLE LINK */
161 eventq_conf.event_queue_cfg =
162 eventdev_config->ev_queue_mode;
164 * All queues need to be set with sched_type as
165 * schedule type for the application stage. One queue
166 * would be reserved for the final eth tx stage. This
167 * will be an atomic queue.
169 if (j == nb_eventqueue-1) {
170 eventq_conf.schedule_type =
171 RTE_SCHED_TYPE_ATOMIC;
173 eventq_conf.schedule_type =
174 em_conf->ext_params.sched_type;
177 /* Set max atomic flows to 1024 */
178 eventq_conf.nb_atomic_flows = 1024;
179 eventq_conf.nb_atomic_order_sequences = 1024;
181 /* Setup the queue */
182 ret = rte_event_queue_setup(eventdev_id, j,
185 EH_LOG_ERR("Failed to setup event queue %d",
191 /* Configure event ports */
192 for (j = 0; j < eventdev_config->nb_eventport; j++) {
193 ret = rte_event_port_setup(eventdev_id, j, NULL);
195 EH_LOG_ERR("Failed to setup event port %d",
202 /* Start event devices */
203 for (i = 0; i < nb_eventdev; i++) {
205 /* Get eventdev config */
206 eventdev_config = &(em_conf->eventdev_config[i]);
208 ret = rte_event_dev_start(eventdev_config->eventdev_id);
210 EH_LOG_ERR("Failed to start event device %d, %d",
219 eh_devs_init(struct eh_conf *conf)
221 struct eventmode_conf *em_conf;
226 EH_LOG_ERR("Invalid event helper configuration");
230 if (conf->mode != EH_PKT_TRANSFER_MODE_EVENT)
233 if (conf->mode_params == NULL) {
234 EH_LOG_ERR("Invalid event mode parameters");
238 /* Get eventmode conf */
239 em_conf = conf->mode_params;
241 /* Validate the requested config */
242 ret = eh_validate_conf(em_conf);
244 EH_LOG_ERR("Failed to validate the requested config %d", ret);
248 /* Stop eth devices before setting up adapter */
249 RTE_ETH_FOREACH_DEV(port_id) {
251 /* Use only the ports enabled */
252 if ((conf->eth_portmask & (1 << port_id)) == 0)
255 rte_eth_dev_stop(port_id);
259 ret = eh_initialize_eventdev(em_conf);
261 EH_LOG_ERR("Failed to initialize event dev %d", ret);
265 /* Start eth devices after setting up adapter */
266 RTE_ETH_FOREACH_DEV(port_id) {
268 /* Use only the ports enabled */
269 if ((conf->eth_portmask & (1 << port_id)) == 0)
272 ret = rte_eth_dev_start(port_id);
274 EH_LOG_ERR("Failed to start eth dev %d, %d",
284 eh_devs_uninit(struct eh_conf *conf)
286 struct eventmode_conf *em_conf;
291 EH_LOG_ERR("Invalid event helper configuration");
295 if (conf->mode != EH_PKT_TRANSFER_MODE_EVENT)
298 if (conf->mode_params == NULL) {
299 EH_LOG_ERR("Invalid event mode parameters");
303 /* Get eventmode conf */
304 em_conf = conf->mode_params;
306 /* Stop and release event devices */
307 for (i = 0; i < em_conf->nb_eventdev; i++) {
309 id = em_conf->eventdev_config[i].eventdev_id;
310 rte_event_dev_stop(id);
312 ret = rte_event_dev_close(id);
314 EH_LOG_ERR("Failed to close event dev %d, %d", id, ret);