1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2016-2020 Intel Corporation
13 #include <sys/fcntl.h>
17 #include <rte_common.h>
18 #include <rte_config.h>
19 #include <rte_cycles.h>
20 #include <rte_debug.h>
22 #include <rte_errno.h>
24 #include <rte_kvargs.h>
26 #include <rte_malloc.h>
28 #include <rte_prefetch.h>
30 #include <rte_string_fns.h>
32 #include <rte_eventdev.h>
33 #include <rte_eventdev_pmd.h>
36 #include "dlb_inline_fns.h"
39 * Resources exposed to eventdev.
41 #if (RTE_EVENT_MAX_QUEUES_PER_DEV > UINT8_MAX)
42 #error "RTE_EVENT_MAX_QUEUES_PER_DEV cannot fit in member max_event_queues"
45 struct process_local_port_data
46 dlb_port[DLB_MAX_NUM_PORTS][NUM_DLB_PORT_TYPES];
48 /* Wrapper for string to int conversion. Substituted for atoi(...), which is
51 #define DLB_BASE_10 10
54 dlb_string_to_int(int *result, const char *str)
59 if (str == NULL || result == NULL)
63 ret = strtol(str, &endstr, DLB_BASE_10);
67 /* long int and int may be different width for some architectures */
68 if (ret < INT_MIN || ret > INT_MAX || endstr == str)
76 set_numa_node(const char *key __rte_unused, const char *value, void *opaque)
78 int *socket_id = opaque;
81 ret = dlb_string_to_int(socket_id, value);
85 if (*socket_id > RTE_MAX_NUMA_NODES)
92 set_max_num_events(const char *key __rte_unused,
96 int *max_num_events = opaque;
99 if (value == NULL || opaque == NULL) {
100 DLB_LOG_ERR("NULL pointer\n");
104 ret = dlb_string_to_int(max_num_events, value);
108 if (*max_num_events < 0 || *max_num_events > DLB_MAX_NUM_LDB_CREDITS) {
109 DLB_LOG_ERR("dlb: max_num_events must be between 0 and %d\n",
110 DLB_MAX_NUM_LDB_CREDITS);
118 set_num_dir_credits(const char *key __rte_unused,
122 int *num_dir_credits = opaque;
125 if (value == NULL || opaque == NULL) {
126 DLB_LOG_ERR("NULL pointer\n");
130 ret = dlb_string_to_int(num_dir_credits, value);
134 if (*num_dir_credits < 0 ||
135 *num_dir_credits > DLB_MAX_NUM_DIR_CREDITS) {
136 DLB_LOG_ERR("dlb: num_dir_credits must be between 0 and %d\n",
137 DLB_MAX_NUM_DIR_CREDITS);
145 set_dev_id(const char *key __rte_unused,
149 int *dev_id = opaque;
152 if (value == NULL || opaque == NULL) {
153 DLB_LOG_ERR("NULL pointer\n");
157 ret = dlb_string_to_int(dev_id, value);
165 set_defer_sched(const char *key __rte_unused,
169 int *defer_sched = opaque;
171 if (value == NULL || opaque == NULL) {
172 DLB_LOG_ERR("NULL pointer\n");
176 if (strncmp(value, "on", 2) != 0) {
177 DLB_LOG_ERR("Invalid defer_sched argument \"%s\" (expected \"on\")\n",
188 set_num_atm_inflights(const char *key __rte_unused,
192 int *num_atm_inflights = opaque;
195 if (value == NULL || opaque == NULL) {
196 DLB_LOG_ERR("NULL pointer\n");
200 ret = dlb_string_to_int(num_atm_inflights, value);
204 if (*num_atm_inflights < 0 ||
205 *num_atm_inflights > DLB_MAX_NUM_ATM_INFLIGHTS) {
206 DLB_LOG_ERR("dlb: atm_inflights must be between 0 and %d\n",
207 DLB_MAX_NUM_ATM_INFLIGHTS);
215 dlb_entry_points_init(struct rte_eventdev *dev)
217 static struct rte_eventdev_ops dlb_eventdev_entry_ops = {
220 /* Expose PMD's eventdev interface */
221 dev->dev_ops = &dlb_eventdev_entry_ops;
225 dlb_primary_eventdev_probe(struct rte_eventdev *dev,
227 struct dlb_devargs *dlb_args)
231 RTE_SET_USED(dlb_args);
237 dlb_secondary_eventdev_probe(struct rte_eventdev *dev,
247 dlb_parse_params(const char *params,
249 struct dlb_devargs *dlb_args)
252 static const char * const args[] = { NUMA_NODE_ARG,
257 DLB_NUM_ATM_INFLIGHTS_ARG,
260 if (params && params[0] != '\0') {
261 struct rte_kvargs *kvlist = rte_kvargs_parse(params, args);
263 if (kvlist == NULL) {
264 DLB_LOG_INFO("Ignoring unsupported parameters when creating device '%s'\n",
267 int ret = rte_kvargs_process(kvlist, NUMA_NODE_ARG,
269 &dlb_args->socket_id);
271 DLB_LOG_ERR("%s: Error parsing numa node parameter",
273 rte_kvargs_free(kvlist);
277 ret = rte_kvargs_process(kvlist, DLB_MAX_NUM_EVENTS,
279 &dlb_args->max_num_events);
281 DLB_LOG_ERR("%s: Error parsing max_num_events parameter",
283 rte_kvargs_free(kvlist);
287 ret = rte_kvargs_process(kvlist,
290 &dlb_args->num_dir_credits_override);
292 DLB_LOG_ERR("%s: Error parsing num_dir_credits parameter",
294 rte_kvargs_free(kvlist);
298 ret = rte_kvargs_process(kvlist, DEV_ID_ARG,
302 DLB_LOG_ERR("%s: Error parsing dev_id parameter",
304 rte_kvargs_free(kvlist);
308 ret = rte_kvargs_process(kvlist, DLB_DEFER_SCHED_ARG,
310 &dlb_args->defer_sched);
312 DLB_LOG_ERR("%s: Error parsing defer_sched parameter",
314 rte_kvargs_free(kvlist);
318 ret = rte_kvargs_process(kvlist,
319 DLB_NUM_ATM_INFLIGHTS_ARG,
320 set_num_atm_inflights,
321 &dlb_args->num_atm_inflights);
323 DLB_LOG_ERR("%s: Error parsing atm_inflights parameter",
325 rte_kvargs_free(kvlist);
329 rte_kvargs_free(kvlist);
334 RTE_LOG_REGISTER(eventdev_dlb_log_level, pmd.event.dlb, NOTICE);