1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606 * Copyright(c) 2016 Cavium, Inc
32bfe3f2eSlogwang */
42bfe3f2eSlogwang
52bfe3f2eSlogwang #include <ctype.h>
62bfe3f2eSlogwang #include <stdio.h>
72bfe3f2eSlogwang #include <stdlib.h>
82bfe3f2eSlogwang #include <string.h>
92bfe3f2eSlogwang #include <stdarg.h>
102bfe3f2eSlogwang #include <errno.h>
112bfe3f2eSlogwang #include <stdint.h>
122bfe3f2eSlogwang #include <inttypes.h>
132bfe3f2eSlogwang #include <sys/types.h>
142bfe3f2eSlogwang #include <sys/queue.h>
152bfe3f2eSlogwang
164418919fSjohnjiang #include <rte_string_fns.h>
172bfe3f2eSlogwang #include <rte_byteorder.h>
182bfe3f2eSlogwang #include <rte_log.h>
192bfe3f2eSlogwang #include <rte_debug.h>
202bfe3f2eSlogwang #include <rte_dev.h>
212bfe3f2eSlogwang #include <rte_memory.h>
222bfe3f2eSlogwang #include <rte_memcpy.h>
232bfe3f2eSlogwang #include <rte_memzone.h>
242bfe3f2eSlogwang #include <rte_eal.h>
252bfe3f2eSlogwang #include <rte_per_lcore.h>
262bfe3f2eSlogwang #include <rte_lcore.h>
272bfe3f2eSlogwang #include <rte_atomic.h>
282bfe3f2eSlogwang #include <rte_branch_prediction.h>
292bfe3f2eSlogwang #include <rte_common.h>
302bfe3f2eSlogwang #include <rte_malloc.h>
312bfe3f2eSlogwang #include <rte_errno.h>
322bfe3f2eSlogwang #include <rte_ethdev.h>
33d30ea906Sjfb8856606 #include <rte_cryptodev.h>
34d30ea906Sjfb8856606 #include <rte_cryptodev_pmd.h>
35*2d9fd380Sjfb8856606 #include <rte_telemetry.h>
362bfe3f2eSlogwang
372bfe3f2eSlogwang #include "rte_eventdev.h"
382bfe3f2eSlogwang #include "rte_eventdev_pmd.h"
39*2d9fd380Sjfb8856606 #include "rte_eventdev_trace.h"
402bfe3f2eSlogwang
41d30ea906Sjfb8856606 static struct rte_eventdev rte_event_devices[RTE_EVENT_MAX_DEVS];
422bfe3f2eSlogwang
43d30ea906Sjfb8856606 struct rte_eventdev *rte_eventdevs = rte_event_devices;
442bfe3f2eSlogwang
452bfe3f2eSlogwang static struct rte_eventdev_global eventdev_globals = {
462bfe3f2eSlogwang .nb_devs = 0
472bfe3f2eSlogwang };
482bfe3f2eSlogwang
492bfe3f2eSlogwang /* Event dev north bound API implementation */
502bfe3f2eSlogwang
512bfe3f2eSlogwang uint8_t
rte_event_dev_count(void)522bfe3f2eSlogwang rte_event_dev_count(void)
532bfe3f2eSlogwang {
54d30ea906Sjfb8856606 return eventdev_globals.nb_devs;
552bfe3f2eSlogwang }
562bfe3f2eSlogwang
572bfe3f2eSlogwang int
rte_event_dev_get_dev_id(const char * name)582bfe3f2eSlogwang rte_event_dev_get_dev_id(const char *name)
592bfe3f2eSlogwang {
602bfe3f2eSlogwang int i;
61d30ea906Sjfb8856606 uint8_t cmp;
622bfe3f2eSlogwang
632bfe3f2eSlogwang if (!name)
642bfe3f2eSlogwang return -EINVAL;
652bfe3f2eSlogwang
66d30ea906Sjfb8856606 for (i = 0; i < eventdev_globals.nb_devs; i++) {
67d30ea906Sjfb8856606 cmp = (strncmp(rte_event_devices[i].data->name, name,
68d30ea906Sjfb8856606 RTE_EVENTDEV_NAME_MAX_LEN) == 0) ||
69d30ea906Sjfb8856606 (rte_event_devices[i].dev ? (strncmp(
70d30ea906Sjfb8856606 rte_event_devices[i].dev->driver->name, name,
71d30ea906Sjfb8856606 RTE_EVENTDEV_NAME_MAX_LEN) == 0) : 0);
72d30ea906Sjfb8856606 if (cmp && (rte_event_devices[i].attached ==
732bfe3f2eSlogwang RTE_EVENTDEV_ATTACHED))
742bfe3f2eSlogwang return i;
75d30ea906Sjfb8856606 }
762bfe3f2eSlogwang return -ENODEV;
772bfe3f2eSlogwang }
782bfe3f2eSlogwang
792bfe3f2eSlogwang int
rte_event_dev_socket_id(uint8_t dev_id)802bfe3f2eSlogwang rte_event_dev_socket_id(uint8_t dev_id)
812bfe3f2eSlogwang {
822bfe3f2eSlogwang struct rte_eventdev *dev;
832bfe3f2eSlogwang
842bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
852bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
862bfe3f2eSlogwang
872bfe3f2eSlogwang return dev->data->socket_id;
882bfe3f2eSlogwang }
892bfe3f2eSlogwang
902bfe3f2eSlogwang int
rte_event_dev_info_get(uint8_t dev_id,struct rte_event_dev_info * dev_info)912bfe3f2eSlogwang rte_event_dev_info_get(uint8_t dev_id, struct rte_event_dev_info *dev_info)
922bfe3f2eSlogwang {
932bfe3f2eSlogwang struct rte_eventdev *dev;
942bfe3f2eSlogwang
952bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
962bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
972bfe3f2eSlogwang
982bfe3f2eSlogwang if (dev_info == NULL)
992bfe3f2eSlogwang return -EINVAL;
1002bfe3f2eSlogwang
1012bfe3f2eSlogwang memset(dev_info, 0, sizeof(struct rte_event_dev_info));
1022bfe3f2eSlogwang
1032bfe3f2eSlogwang RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_infos_get, -ENOTSUP);
1042bfe3f2eSlogwang (*dev->dev_ops->dev_infos_get)(dev, dev_info);
1052bfe3f2eSlogwang
1062bfe3f2eSlogwang dev_info->dequeue_timeout_ns = dev->data->dev_conf.dequeue_timeout_ns;
1072bfe3f2eSlogwang
1082bfe3f2eSlogwang dev_info->dev = dev->dev;
1092bfe3f2eSlogwang return 0;
1102bfe3f2eSlogwang }
1112bfe3f2eSlogwang
1122bfe3f2eSlogwang int
rte_event_eth_rx_adapter_caps_get(uint8_t dev_id,uint16_t eth_port_id,uint32_t * caps)113d30ea906Sjfb8856606 rte_event_eth_rx_adapter_caps_get(uint8_t dev_id, uint16_t eth_port_id,
1142bfe3f2eSlogwang uint32_t *caps)
1152bfe3f2eSlogwang {
1162bfe3f2eSlogwang struct rte_eventdev *dev;
1172bfe3f2eSlogwang
1182bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
1192bfe3f2eSlogwang RTE_ETH_VALID_PORTID_OR_ERR_RET(eth_port_id, -EINVAL);
1202bfe3f2eSlogwang
1212bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
1222bfe3f2eSlogwang
1232bfe3f2eSlogwang if (caps == NULL)
1242bfe3f2eSlogwang return -EINVAL;
1252bfe3f2eSlogwang *caps = 0;
1262bfe3f2eSlogwang
1272bfe3f2eSlogwang return dev->dev_ops->eth_rx_adapter_caps_get ?
1282bfe3f2eSlogwang (*dev->dev_ops->eth_rx_adapter_caps_get)(dev,
1292bfe3f2eSlogwang &rte_eth_devices[eth_port_id],
1302bfe3f2eSlogwang caps)
1312bfe3f2eSlogwang : 0;
1322bfe3f2eSlogwang }
1332bfe3f2eSlogwang
1344418919fSjohnjiang int
rte_event_timer_adapter_caps_get(uint8_t dev_id,uint32_t * caps)135d30ea906Sjfb8856606 rte_event_timer_adapter_caps_get(uint8_t dev_id, uint32_t *caps)
136d30ea906Sjfb8856606 {
137d30ea906Sjfb8856606 struct rte_eventdev *dev;
138d30ea906Sjfb8856606 const struct rte_event_timer_adapter_ops *ops;
139d30ea906Sjfb8856606
140d30ea906Sjfb8856606 RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
141d30ea906Sjfb8856606
142d30ea906Sjfb8856606 dev = &rte_eventdevs[dev_id];
143d30ea906Sjfb8856606
144d30ea906Sjfb8856606 if (caps == NULL)
145d30ea906Sjfb8856606 return -EINVAL;
146d30ea906Sjfb8856606 *caps = 0;
147d30ea906Sjfb8856606
148d30ea906Sjfb8856606 return dev->dev_ops->timer_adapter_caps_get ?
149d30ea906Sjfb8856606 (*dev->dev_ops->timer_adapter_caps_get)(dev,
150d30ea906Sjfb8856606 0,
151d30ea906Sjfb8856606 caps,
152d30ea906Sjfb8856606 &ops)
153d30ea906Sjfb8856606 : 0;
154d30ea906Sjfb8856606 }
155d30ea906Sjfb8856606
1564418919fSjohnjiang int
rte_event_crypto_adapter_caps_get(uint8_t dev_id,uint8_t cdev_id,uint32_t * caps)157d30ea906Sjfb8856606 rte_event_crypto_adapter_caps_get(uint8_t dev_id, uint8_t cdev_id,
158d30ea906Sjfb8856606 uint32_t *caps)
159d30ea906Sjfb8856606 {
160d30ea906Sjfb8856606 struct rte_eventdev *dev;
161d30ea906Sjfb8856606 struct rte_cryptodev *cdev;
162d30ea906Sjfb8856606
163d30ea906Sjfb8856606 RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
164d30ea906Sjfb8856606 if (!rte_cryptodev_pmd_is_valid_dev(cdev_id))
165d30ea906Sjfb8856606 return -EINVAL;
166d30ea906Sjfb8856606
167d30ea906Sjfb8856606 dev = &rte_eventdevs[dev_id];
168d30ea906Sjfb8856606 cdev = rte_cryptodev_pmd_get_dev(cdev_id);
169d30ea906Sjfb8856606
170d30ea906Sjfb8856606 if (caps == NULL)
171d30ea906Sjfb8856606 return -EINVAL;
172d30ea906Sjfb8856606 *caps = 0;
173d30ea906Sjfb8856606
174d30ea906Sjfb8856606 return dev->dev_ops->crypto_adapter_caps_get ?
175d30ea906Sjfb8856606 (*dev->dev_ops->crypto_adapter_caps_get)
176d30ea906Sjfb8856606 (dev, cdev, caps) : -ENOTSUP;
177d30ea906Sjfb8856606 }
178d30ea906Sjfb8856606
1794418919fSjohnjiang int
rte_event_eth_tx_adapter_caps_get(uint8_t dev_id,uint16_t eth_port_id,uint32_t * caps)180d30ea906Sjfb8856606 rte_event_eth_tx_adapter_caps_get(uint8_t dev_id, uint16_t eth_port_id,
181d30ea906Sjfb8856606 uint32_t *caps)
182d30ea906Sjfb8856606 {
183d30ea906Sjfb8856606 struct rte_eventdev *dev;
184d30ea906Sjfb8856606 struct rte_eth_dev *eth_dev;
185d30ea906Sjfb8856606
186d30ea906Sjfb8856606 RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
187d30ea906Sjfb8856606 RTE_ETH_VALID_PORTID_OR_ERR_RET(eth_port_id, -EINVAL);
188d30ea906Sjfb8856606
189d30ea906Sjfb8856606 dev = &rte_eventdevs[dev_id];
190d30ea906Sjfb8856606 eth_dev = &rte_eth_devices[eth_port_id];
191d30ea906Sjfb8856606
192d30ea906Sjfb8856606 if (caps == NULL)
193d30ea906Sjfb8856606 return -EINVAL;
194d30ea906Sjfb8856606
195d30ea906Sjfb8856606 *caps = 0;
196d30ea906Sjfb8856606
197d30ea906Sjfb8856606 return dev->dev_ops->eth_tx_adapter_caps_get ?
198d30ea906Sjfb8856606 (*dev->dev_ops->eth_tx_adapter_caps_get)(dev,
199d30ea906Sjfb8856606 eth_dev,
200d30ea906Sjfb8856606 caps)
201d30ea906Sjfb8856606 : 0;
202d30ea906Sjfb8856606 }
203d30ea906Sjfb8856606
2042bfe3f2eSlogwang static inline int
rte_event_dev_queue_config(struct rte_eventdev * dev,uint8_t nb_queues)2052bfe3f2eSlogwang rte_event_dev_queue_config(struct rte_eventdev *dev, uint8_t nb_queues)
2062bfe3f2eSlogwang {
2072bfe3f2eSlogwang uint8_t old_nb_queues = dev->data->nb_queues;
2082bfe3f2eSlogwang struct rte_event_queue_conf *queues_cfg;
2092bfe3f2eSlogwang unsigned int i;
2102bfe3f2eSlogwang
2112bfe3f2eSlogwang RTE_EDEV_LOG_DEBUG("Setup %d queues on device %u", nb_queues,
2122bfe3f2eSlogwang dev->data->dev_id);
2132bfe3f2eSlogwang
2142bfe3f2eSlogwang /* First time configuration */
2152bfe3f2eSlogwang if (dev->data->queues_cfg == NULL && nb_queues != 0) {
2162bfe3f2eSlogwang /* Allocate memory to store queue configuration */
2172bfe3f2eSlogwang dev->data->queues_cfg = rte_zmalloc_socket(
2182bfe3f2eSlogwang "eventdev->data->queues_cfg",
2192bfe3f2eSlogwang sizeof(dev->data->queues_cfg[0]) * nb_queues,
2202bfe3f2eSlogwang RTE_CACHE_LINE_SIZE, dev->data->socket_id);
2212bfe3f2eSlogwang if (dev->data->queues_cfg == NULL) {
2222bfe3f2eSlogwang dev->data->nb_queues = 0;
2232bfe3f2eSlogwang RTE_EDEV_LOG_ERR("failed to get mem for queue cfg,"
2242bfe3f2eSlogwang "nb_queues %u", nb_queues);
2252bfe3f2eSlogwang return -(ENOMEM);
2262bfe3f2eSlogwang }
2272bfe3f2eSlogwang /* Re-configure */
2282bfe3f2eSlogwang } else if (dev->data->queues_cfg != NULL && nb_queues != 0) {
2292bfe3f2eSlogwang RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->queue_release, -ENOTSUP);
2302bfe3f2eSlogwang
2312bfe3f2eSlogwang for (i = nb_queues; i < old_nb_queues; i++)
2322bfe3f2eSlogwang (*dev->dev_ops->queue_release)(dev, i);
2332bfe3f2eSlogwang
2342bfe3f2eSlogwang /* Re allocate memory to store queue configuration */
2352bfe3f2eSlogwang queues_cfg = dev->data->queues_cfg;
2362bfe3f2eSlogwang queues_cfg = rte_realloc(queues_cfg,
2372bfe3f2eSlogwang sizeof(queues_cfg[0]) * nb_queues,
2382bfe3f2eSlogwang RTE_CACHE_LINE_SIZE);
2392bfe3f2eSlogwang if (queues_cfg == NULL) {
2402bfe3f2eSlogwang RTE_EDEV_LOG_ERR("failed to realloc queue cfg memory,"
2412bfe3f2eSlogwang " nb_queues %u", nb_queues);
2422bfe3f2eSlogwang return -(ENOMEM);
2432bfe3f2eSlogwang }
2442bfe3f2eSlogwang dev->data->queues_cfg = queues_cfg;
2452bfe3f2eSlogwang
2462bfe3f2eSlogwang if (nb_queues > old_nb_queues) {
2472bfe3f2eSlogwang uint8_t new_qs = nb_queues - old_nb_queues;
2482bfe3f2eSlogwang
2492bfe3f2eSlogwang memset(queues_cfg + old_nb_queues, 0,
2502bfe3f2eSlogwang sizeof(queues_cfg[0]) * new_qs);
2512bfe3f2eSlogwang }
2522bfe3f2eSlogwang } else if (dev->data->queues_cfg != NULL && nb_queues == 0) {
2532bfe3f2eSlogwang RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->queue_release, -ENOTSUP);
2542bfe3f2eSlogwang
2552bfe3f2eSlogwang for (i = nb_queues; i < old_nb_queues; i++)
2562bfe3f2eSlogwang (*dev->dev_ops->queue_release)(dev, i);
2572bfe3f2eSlogwang }
2582bfe3f2eSlogwang
2592bfe3f2eSlogwang dev->data->nb_queues = nb_queues;
2602bfe3f2eSlogwang return 0;
2612bfe3f2eSlogwang }
2622bfe3f2eSlogwang
2632bfe3f2eSlogwang #define EVENT_QUEUE_SERVICE_PRIORITY_INVALID (0xdead)
2642bfe3f2eSlogwang
2652bfe3f2eSlogwang static inline int
rte_event_dev_port_config(struct rte_eventdev * dev,uint8_t nb_ports)2662bfe3f2eSlogwang rte_event_dev_port_config(struct rte_eventdev *dev, uint8_t nb_ports)
2672bfe3f2eSlogwang {
2682bfe3f2eSlogwang uint8_t old_nb_ports = dev->data->nb_ports;
2692bfe3f2eSlogwang void **ports;
2702bfe3f2eSlogwang uint16_t *links_map;
2712bfe3f2eSlogwang struct rte_event_port_conf *ports_cfg;
2722bfe3f2eSlogwang unsigned int i;
2732bfe3f2eSlogwang
2742bfe3f2eSlogwang RTE_EDEV_LOG_DEBUG("Setup %d ports on device %u", nb_ports,
2752bfe3f2eSlogwang dev->data->dev_id);
2762bfe3f2eSlogwang
2772bfe3f2eSlogwang /* First time configuration */
2782bfe3f2eSlogwang if (dev->data->ports == NULL && nb_ports != 0) {
2792bfe3f2eSlogwang dev->data->ports = rte_zmalloc_socket("eventdev->data->ports",
2802bfe3f2eSlogwang sizeof(dev->data->ports[0]) * nb_ports,
2812bfe3f2eSlogwang RTE_CACHE_LINE_SIZE, dev->data->socket_id);
2822bfe3f2eSlogwang if (dev->data->ports == NULL) {
2832bfe3f2eSlogwang dev->data->nb_ports = 0;
2842bfe3f2eSlogwang RTE_EDEV_LOG_ERR("failed to get mem for port meta data,"
2852bfe3f2eSlogwang "nb_ports %u", nb_ports);
2862bfe3f2eSlogwang return -(ENOMEM);
2872bfe3f2eSlogwang }
2882bfe3f2eSlogwang
2892bfe3f2eSlogwang /* Allocate memory to store port configurations */
2902bfe3f2eSlogwang dev->data->ports_cfg =
2912bfe3f2eSlogwang rte_zmalloc_socket("eventdev->ports_cfg",
2922bfe3f2eSlogwang sizeof(dev->data->ports_cfg[0]) * nb_ports,
2932bfe3f2eSlogwang RTE_CACHE_LINE_SIZE, dev->data->socket_id);
2942bfe3f2eSlogwang if (dev->data->ports_cfg == NULL) {
2952bfe3f2eSlogwang dev->data->nb_ports = 0;
2962bfe3f2eSlogwang RTE_EDEV_LOG_ERR("failed to get mem for port cfg,"
2972bfe3f2eSlogwang "nb_ports %u", nb_ports);
2982bfe3f2eSlogwang return -(ENOMEM);
2992bfe3f2eSlogwang }
3002bfe3f2eSlogwang
3012bfe3f2eSlogwang /* Allocate memory to store queue to port link connection */
3022bfe3f2eSlogwang dev->data->links_map =
3032bfe3f2eSlogwang rte_zmalloc_socket("eventdev->links_map",
3042bfe3f2eSlogwang sizeof(dev->data->links_map[0]) * nb_ports *
3052bfe3f2eSlogwang RTE_EVENT_MAX_QUEUES_PER_DEV,
3062bfe3f2eSlogwang RTE_CACHE_LINE_SIZE, dev->data->socket_id);
3072bfe3f2eSlogwang if (dev->data->links_map == NULL) {
3082bfe3f2eSlogwang dev->data->nb_ports = 0;
3092bfe3f2eSlogwang RTE_EDEV_LOG_ERR("failed to get mem for port_map area,"
3102bfe3f2eSlogwang "nb_ports %u", nb_ports);
3112bfe3f2eSlogwang return -(ENOMEM);
3122bfe3f2eSlogwang }
3132bfe3f2eSlogwang for (i = 0; i < nb_ports * RTE_EVENT_MAX_QUEUES_PER_DEV; i++)
3142bfe3f2eSlogwang dev->data->links_map[i] =
3152bfe3f2eSlogwang EVENT_QUEUE_SERVICE_PRIORITY_INVALID;
3162bfe3f2eSlogwang } else if (dev->data->ports != NULL && nb_ports != 0) {/* re-config */
3172bfe3f2eSlogwang RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->port_release, -ENOTSUP);
3182bfe3f2eSlogwang
3192bfe3f2eSlogwang ports = dev->data->ports;
3202bfe3f2eSlogwang ports_cfg = dev->data->ports_cfg;
3212bfe3f2eSlogwang links_map = dev->data->links_map;
3222bfe3f2eSlogwang
3232bfe3f2eSlogwang for (i = nb_ports; i < old_nb_ports; i++)
3242bfe3f2eSlogwang (*dev->dev_ops->port_release)(ports[i]);
3252bfe3f2eSlogwang
3262bfe3f2eSlogwang /* Realloc memory for ports */
3272bfe3f2eSlogwang ports = rte_realloc(ports, sizeof(ports[0]) * nb_ports,
3282bfe3f2eSlogwang RTE_CACHE_LINE_SIZE);
3292bfe3f2eSlogwang if (ports == NULL) {
3302bfe3f2eSlogwang RTE_EDEV_LOG_ERR("failed to realloc port meta data,"
3312bfe3f2eSlogwang " nb_ports %u", nb_ports);
3322bfe3f2eSlogwang return -(ENOMEM);
3332bfe3f2eSlogwang }
3342bfe3f2eSlogwang
3352bfe3f2eSlogwang /* Realloc memory for ports_cfg */
3362bfe3f2eSlogwang ports_cfg = rte_realloc(ports_cfg,
3372bfe3f2eSlogwang sizeof(ports_cfg[0]) * nb_ports,
3382bfe3f2eSlogwang RTE_CACHE_LINE_SIZE);
3392bfe3f2eSlogwang if (ports_cfg == NULL) {
3402bfe3f2eSlogwang RTE_EDEV_LOG_ERR("failed to realloc port cfg mem,"
3412bfe3f2eSlogwang " nb_ports %u", nb_ports);
3422bfe3f2eSlogwang return -(ENOMEM);
3432bfe3f2eSlogwang }
3442bfe3f2eSlogwang
3452bfe3f2eSlogwang /* Realloc memory to store queue to port link connection */
3462bfe3f2eSlogwang links_map = rte_realloc(links_map,
3472bfe3f2eSlogwang sizeof(dev->data->links_map[0]) * nb_ports *
3482bfe3f2eSlogwang RTE_EVENT_MAX_QUEUES_PER_DEV,
3492bfe3f2eSlogwang RTE_CACHE_LINE_SIZE);
3502bfe3f2eSlogwang if (links_map == NULL) {
3512bfe3f2eSlogwang dev->data->nb_ports = 0;
3522bfe3f2eSlogwang RTE_EDEV_LOG_ERR("failed to realloc mem for port_map,"
3532bfe3f2eSlogwang "nb_ports %u", nb_ports);
3542bfe3f2eSlogwang return -(ENOMEM);
3552bfe3f2eSlogwang }
3562bfe3f2eSlogwang
3572bfe3f2eSlogwang if (nb_ports > old_nb_ports) {
3582bfe3f2eSlogwang uint8_t new_ps = nb_ports - old_nb_ports;
3592bfe3f2eSlogwang unsigned int old_links_map_end =
3602bfe3f2eSlogwang old_nb_ports * RTE_EVENT_MAX_QUEUES_PER_DEV;
3612bfe3f2eSlogwang unsigned int links_map_end =
3622bfe3f2eSlogwang nb_ports * RTE_EVENT_MAX_QUEUES_PER_DEV;
3632bfe3f2eSlogwang
3642bfe3f2eSlogwang memset(ports + old_nb_ports, 0,
3652bfe3f2eSlogwang sizeof(ports[0]) * new_ps);
3662bfe3f2eSlogwang memset(ports_cfg + old_nb_ports, 0,
3672bfe3f2eSlogwang sizeof(ports_cfg[0]) * new_ps);
3682bfe3f2eSlogwang for (i = old_links_map_end; i < links_map_end; i++)
3692bfe3f2eSlogwang links_map[i] =
3702bfe3f2eSlogwang EVENT_QUEUE_SERVICE_PRIORITY_INVALID;
3712bfe3f2eSlogwang }
3722bfe3f2eSlogwang
3732bfe3f2eSlogwang dev->data->ports = ports;
3742bfe3f2eSlogwang dev->data->ports_cfg = ports_cfg;
3752bfe3f2eSlogwang dev->data->links_map = links_map;
3762bfe3f2eSlogwang } else if (dev->data->ports != NULL && nb_ports == 0) {
3772bfe3f2eSlogwang RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->port_release, -ENOTSUP);
3782bfe3f2eSlogwang
3792bfe3f2eSlogwang ports = dev->data->ports;
3802bfe3f2eSlogwang for (i = nb_ports; i < old_nb_ports; i++)
3812bfe3f2eSlogwang (*dev->dev_ops->port_release)(ports[i]);
3822bfe3f2eSlogwang }
3832bfe3f2eSlogwang
3842bfe3f2eSlogwang dev->data->nb_ports = nb_ports;
3852bfe3f2eSlogwang return 0;
3862bfe3f2eSlogwang }
3872bfe3f2eSlogwang
3882bfe3f2eSlogwang int
rte_event_dev_configure(uint8_t dev_id,const struct rte_event_dev_config * dev_conf)3892bfe3f2eSlogwang rte_event_dev_configure(uint8_t dev_id,
3902bfe3f2eSlogwang const struct rte_event_dev_config *dev_conf)
3912bfe3f2eSlogwang {
3922bfe3f2eSlogwang struct rte_eventdev *dev;
3932bfe3f2eSlogwang struct rte_event_dev_info info;
3942bfe3f2eSlogwang int diag;
3952bfe3f2eSlogwang
3962bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
3972bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
3982bfe3f2eSlogwang
3992bfe3f2eSlogwang RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_infos_get, -ENOTSUP);
4002bfe3f2eSlogwang RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_configure, -ENOTSUP);
4012bfe3f2eSlogwang
4022bfe3f2eSlogwang if (dev->data->dev_started) {
4032bfe3f2eSlogwang RTE_EDEV_LOG_ERR(
4042bfe3f2eSlogwang "device %d must be stopped to allow configuration", dev_id);
4052bfe3f2eSlogwang return -EBUSY;
4062bfe3f2eSlogwang }
4072bfe3f2eSlogwang
4082bfe3f2eSlogwang if (dev_conf == NULL)
4092bfe3f2eSlogwang return -EINVAL;
4102bfe3f2eSlogwang
4112bfe3f2eSlogwang (*dev->dev_ops->dev_infos_get)(dev, &info);
4122bfe3f2eSlogwang
4132bfe3f2eSlogwang /* Check dequeue_timeout_ns value is in limit */
4142bfe3f2eSlogwang if (!(dev_conf->event_dev_cfg & RTE_EVENT_DEV_CFG_PER_DEQUEUE_TIMEOUT)) {
4152bfe3f2eSlogwang if (dev_conf->dequeue_timeout_ns &&
4162bfe3f2eSlogwang (dev_conf->dequeue_timeout_ns < info.min_dequeue_timeout_ns
4172bfe3f2eSlogwang || dev_conf->dequeue_timeout_ns >
4182bfe3f2eSlogwang info.max_dequeue_timeout_ns)) {
4192bfe3f2eSlogwang RTE_EDEV_LOG_ERR("dev%d invalid dequeue_timeout_ns=%d"
4202bfe3f2eSlogwang " min_dequeue_timeout_ns=%d max_dequeue_timeout_ns=%d",
4212bfe3f2eSlogwang dev_id, dev_conf->dequeue_timeout_ns,
4222bfe3f2eSlogwang info.min_dequeue_timeout_ns,
4232bfe3f2eSlogwang info.max_dequeue_timeout_ns);
4242bfe3f2eSlogwang return -EINVAL;
4252bfe3f2eSlogwang }
4262bfe3f2eSlogwang }
4272bfe3f2eSlogwang
4282bfe3f2eSlogwang /* Check nb_events_limit is in limit */
4292bfe3f2eSlogwang if (dev_conf->nb_events_limit > info.max_num_events) {
4302bfe3f2eSlogwang RTE_EDEV_LOG_ERR("dev%d nb_events_limit=%d > max_num_events=%d",
4312bfe3f2eSlogwang dev_id, dev_conf->nb_events_limit, info.max_num_events);
4322bfe3f2eSlogwang return -EINVAL;
4332bfe3f2eSlogwang }
4342bfe3f2eSlogwang
4352bfe3f2eSlogwang /* Check nb_event_queues is in limit */
4362bfe3f2eSlogwang if (!dev_conf->nb_event_queues) {
4372bfe3f2eSlogwang RTE_EDEV_LOG_ERR("dev%d nb_event_queues cannot be zero",
4382bfe3f2eSlogwang dev_id);
4392bfe3f2eSlogwang return -EINVAL;
4402bfe3f2eSlogwang }
441*2d9fd380Sjfb8856606 if (dev_conf->nb_event_queues > info.max_event_queues +
442*2d9fd380Sjfb8856606 info.max_single_link_event_port_queue_pairs) {
443*2d9fd380Sjfb8856606 RTE_EDEV_LOG_ERR("%d nb_event_queues=%d > max_event_queues=%d + max_single_link_event_port_queue_pairs=%d",
444*2d9fd380Sjfb8856606 dev_id, dev_conf->nb_event_queues,
445*2d9fd380Sjfb8856606 info.max_event_queues,
446*2d9fd380Sjfb8856606 info.max_single_link_event_port_queue_pairs);
447*2d9fd380Sjfb8856606 return -EINVAL;
448*2d9fd380Sjfb8856606 }
449*2d9fd380Sjfb8856606 if (dev_conf->nb_event_queues -
450*2d9fd380Sjfb8856606 dev_conf->nb_single_link_event_port_queues >
451*2d9fd380Sjfb8856606 info.max_event_queues) {
452*2d9fd380Sjfb8856606 RTE_EDEV_LOG_ERR("id%d nb_event_queues=%d - nb_single_link_event_port_queues=%d > max_event_queues=%d",
453*2d9fd380Sjfb8856606 dev_id, dev_conf->nb_event_queues,
454*2d9fd380Sjfb8856606 dev_conf->nb_single_link_event_port_queues,
455*2d9fd380Sjfb8856606 info.max_event_queues);
456*2d9fd380Sjfb8856606 return -EINVAL;
457*2d9fd380Sjfb8856606 }
458*2d9fd380Sjfb8856606 if (dev_conf->nb_single_link_event_port_queues >
459*2d9fd380Sjfb8856606 dev_conf->nb_event_queues) {
460*2d9fd380Sjfb8856606 RTE_EDEV_LOG_ERR("dev%d nb_single_link_event_port_queues=%d > nb_event_queues=%d",
461*2d9fd380Sjfb8856606 dev_id,
462*2d9fd380Sjfb8856606 dev_conf->nb_single_link_event_port_queues,
463*2d9fd380Sjfb8856606 dev_conf->nb_event_queues);
4642bfe3f2eSlogwang return -EINVAL;
4652bfe3f2eSlogwang }
4662bfe3f2eSlogwang
4672bfe3f2eSlogwang /* Check nb_event_ports is in limit */
4682bfe3f2eSlogwang if (!dev_conf->nb_event_ports) {
4692bfe3f2eSlogwang RTE_EDEV_LOG_ERR("dev%d nb_event_ports cannot be zero", dev_id);
4702bfe3f2eSlogwang return -EINVAL;
4712bfe3f2eSlogwang }
472*2d9fd380Sjfb8856606 if (dev_conf->nb_event_ports > info.max_event_ports +
473*2d9fd380Sjfb8856606 info.max_single_link_event_port_queue_pairs) {
474*2d9fd380Sjfb8856606 RTE_EDEV_LOG_ERR("id%d nb_event_ports=%d > max_event_ports=%d + max_single_link_event_port_queue_pairs=%d",
475*2d9fd380Sjfb8856606 dev_id, dev_conf->nb_event_ports,
476*2d9fd380Sjfb8856606 info.max_event_ports,
477*2d9fd380Sjfb8856606 info.max_single_link_event_port_queue_pairs);
478*2d9fd380Sjfb8856606 return -EINVAL;
479*2d9fd380Sjfb8856606 }
480*2d9fd380Sjfb8856606 if (dev_conf->nb_event_ports -
481*2d9fd380Sjfb8856606 dev_conf->nb_single_link_event_port_queues
482*2d9fd380Sjfb8856606 > info.max_event_ports) {
483*2d9fd380Sjfb8856606 RTE_EDEV_LOG_ERR("id%d nb_event_ports=%d - nb_single_link_event_port_queues=%d > max_event_ports=%d",
484*2d9fd380Sjfb8856606 dev_id, dev_conf->nb_event_ports,
485*2d9fd380Sjfb8856606 dev_conf->nb_single_link_event_port_queues,
486*2d9fd380Sjfb8856606 info.max_event_ports);
487*2d9fd380Sjfb8856606 return -EINVAL;
488*2d9fd380Sjfb8856606 }
489*2d9fd380Sjfb8856606
490*2d9fd380Sjfb8856606 if (dev_conf->nb_single_link_event_port_queues >
491*2d9fd380Sjfb8856606 dev_conf->nb_event_ports) {
492*2d9fd380Sjfb8856606 RTE_EDEV_LOG_ERR(
493*2d9fd380Sjfb8856606 "dev%d nb_single_link_event_port_queues=%d > nb_event_ports=%d",
494*2d9fd380Sjfb8856606 dev_id,
495*2d9fd380Sjfb8856606 dev_conf->nb_single_link_event_port_queues,
496*2d9fd380Sjfb8856606 dev_conf->nb_event_ports);
4972bfe3f2eSlogwang return -EINVAL;
4982bfe3f2eSlogwang }
4992bfe3f2eSlogwang
5002bfe3f2eSlogwang /* Check nb_event_queue_flows is in limit */
5012bfe3f2eSlogwang if (!dev_conf->nb_event_queue_flows) {
5022bfe3f2eSlogwang RTE_EDEV_LOG_ERR("dev%d nb_flows cannot be zero", dev_id);
5032bfe3f2eSlogwang return -EINVAL;
5042bfe3f2eSlogwang }
5052bfe3f2eSlogwang if (dev_conf->nb_event_queue_flows > info.max_event_queue_flows) {
5062bfe3f2eSlogwang RTE_EDEV_LOG_ERR("dev%d nb_flows=%x > max_flows=%x",
5072bfe3f2eSlogwang dev_id, dev_conf->nb_event_queue_flows,
5082bfe3f2eSlogwang info.max_event_queue_flows);
5092bfe3f2eSlogwang return -EINVAL;
5102bfe3f2eSlogwang }
5112bfe3f2eSlogwang
5122bfe3f2eSlogwang /* Check nb_event_port_dequeue_depth is in limit */
5132bfe3f2eSlogwang if (!dev_conf->nb_event_port_dequeue_depth) {
5142bfe3f2eSlogwang RTE_EDEV_LOG_ERR("dev%d nb_dequeue_depth cannot be zero",
5152bfe3f2eSlogwang dev_id);
5162bfe3f2eSlogwang return -EINVAL;
5172bfe3f2eSlogwang }
5182bfe3f2eSlogwang if ((info.event_dev_cap & RTE_EVENT_DEV_CAP_BURST_MODE) &&
5192bfe3f2eSlogwang (dev_conf->nb_event_port_dequeue_depth >
5202bfe3f2eSlogwang info.max_event_port_dequeue_depth)) {
5212bfe3f2eSlogwang RTE_EDEV_LOG_ERR("dev%d nb_dq_depth=%d > max_dq_depth=%d",
5222bfe3f2eSlogwang dev_id, dev_conf->nb_event_port_dequeue_depth,
5232bfe3f2eSlogwang info.max_event_port_dequeue_depth);
5242bfe3f2eSlogwang return -EINVAL;
5252bfe3f2eSlogwang }
5262bfe3f2eSlogwang
5272bfe3f2eSlogwang /* Check nb_event_port_enqueue_depth is in limit */
5282bfe3f2eSlogwang if (!dev_conf->nb_event_port_enqueue_depth) {
5292bfe3f2eSlogwang RTE_EDEV_LOG_ERR("dev%d nb_enqueue_depth cannot be zero",
5302bfe3f2eSlogwang dev_id);
5312bfe3f2eSlogwang return -EINVAL;
5322bfe3f2eSlogwang }
5332bfe3f2eSlogwang if ((info.event_dev_cap & RTE_EVENT_DEV_CAP_BURST_MODE) &&
5342bfe3f2eSlogwang (dev_conf->nb_event_port_enqueue_depth >
5352bfe3f2eSlogwang info.max_event_port_enqueue_depth)) {
5362bfe3f2eSlogwang RTE_EDEV_LOG_ERR("dev%d nb_enq_depth=%d > max_enq_depth=%d",
5372bfe3f2eSlogwang dev_id, dev_conf->nb_event_port_enqueue_depth,
5382bfe3f2eSlogwang info.max_event_port_enqueue_depth);
5392bfe3f2eSlogwang return -EINVAL;
5402bfe3f2eSlogwang }
5412bfe3f2eSlogwang
5422bfe3f2eSlogwang /* Copy the dev_conf parameter into the dev structure */
5432bfe3f2eSlogwang memcpy(&dev->data->dev_conf, dev_conf, sizeof(dev->data->dev_conf));
5442bfe3f2eSlogwang
5452bfe3f2eSlogwang /* Setup new number of queues and reconfigure device. */
5462bfe3f2eSlogwang diag = rte_event_dev_queue_config(dev, dev_conf->nb_event_queues);
5472bfe3f2eSlogwang if (diag != 0) {
5482bfe3f2eSlogwang RTE_EDEV_LOG_ERR("dev%d rte_event_dev_queue_config = %d",
5492bfe3f2eSlogwang dev_id, diag);
5502bfe3f2eSlogwang return diag;
5512bfe3f2eSlogwang }
5522bfe3f2eSlogwang
5532bfe3f2eSlogwang /* Setup new number of ports and reconfigure device. */
5542bfe3f2eSlogwang diag = rte_event_dev_port_config(dev, dev_conf->nb_event_ports);
5552bfe3f2eSlogwang if (diag != 0) {
5562bfe3f2eSlogwang rte_event_dev_queue_config(dev, 0);
5572bfe3f2eSlogwang RTE_EDEV_LOG_ERR("dev%d rte_event_dev_port_config = %d",
5582bfe3f2eSlogwang dev_id, diag);
5592bfe3f2eSlogwang return diag;
5602bfe3f2eSlogwang }
5612bfe3f2eSlogwang
5622bfe3f2eSlogwang /* Configure the device */
5632bfe3f2eSlogwang diag = (*dev->dev_ops->dev_configure)(dev);
5642bfe3f2eSlogwang if (diag != 0) {
5652bfe3f2eSlogwang RTE_EDEV_LOG_ERR("dev%d dev_configure = %d", dev_id, diag);
5662bfe3f2eSlogwang rte_event_dev_queue_config(dev, 0);
5672bfe3f2eSlogwang rte_event_dev_port_config(dev, 0);
5682bfe3f2eSlogwang }
5692bfe3f2eSlogwang
5702bfe3f2eSlogwang dev->data->event_dev_cap = info.event_dev_cap;
571*2d9fd380Sjfb8856606 rte_eventdev_trace_configure(dev_id, dev_conf, diag);
5722bfe3f2eSlogwang return diag;
5732bfe3f2eSlogwang }
5742bfe3f2eSlogwang
5752bfe3f2eSlogwang static inline int
is_valid_queue(struct rte_eventdev * dev,uint8_t queue_id)5762bfe3f2eSlogwang is_valid_queue(struct rte_eventdev *dev, uint8_t queue_id)
5772bfe3f2eSlogwang {
5782bfe3f2eSlogwang if (queue_id < dev->data->nb_queues && queue_id <
5792bfe3f2eSlogwang RTE_EVENT_MAX_QUEUES_PER_DEV)
5802bfe3f2eSlogwang return 1;
5812bfe3f2eSlogwang else
5822bfe3f2eSlogwang return 0;
5832bfe3f2eSlogwang }
5842bfe3f2eSlogwang
5852bfe3f2eSlogwang int
rte_event_queue_default_conf_get(uint8_t dev_id,uint8_t queue_id,struct rte_event_queue_conf * queue_conf)5862bfe3f2eSlogwang rte_event_queue_default_conf_get(uint8_t dev_id, uint8_t queue_id,
5872bfe3f2eSlogwang struct rte_event_queue_conf *queue_conf)
5882bfe3f2eSlogwang {
5892bfe3f2eSlogwang struct rte_eventdev *dev;
5902bfe3f2eSlogwang
5912bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
5922bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
5932bfe3f2eSlogwang
5942bfe3f2eSlogwang if (queue_conf == NULL)
5952bfe3f2eSlogwang return -EINVAL;
5962bfe3f2eSlogwang
5972bfe3f2eSlogwang if (!is_valid_queue(dev, queue_id)) {
5982bfe3f2eSlogwang RTE_EDEV_LOG_ERR("Invalid queue_id=%" PRIu8, queue_id);
5992bfe3f2eSlogwang return -EINVAL;
6002bfe3f2eSlogwang }
6012bfe3f2eSlogwang
6022bfe3f2eSlogwang RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->queue_def_conf, -ENOTSUP);
6032bfe3f2eSlogwang memset(queue_conf, 0, sizeof(struct rte_event_queue_conf));
6042bfe3f2eSlogwang (*dev->dev_ops->queue_def_conf)(dev, queue_id, queue_conf);
6052bfe3f2eSlogwang return 0;
6062bfe3f2eSlogwang }
6072bfe3f2eSlogwang
6082bfe3f2eSlogwang static inline int
is_valid_atomic_queue_conf(const struct rte_event_queue_conf * queue_conf)6092bfe3f2eSlogwang is_valid_atomic_queue_conf(const struct rte_event_queue_conf *queue_conf)
6102bfe3f2eSlogwang {
6112bfe3f2eSlogwang if (queue_conf &&
6122bfe3f2eSlogwang !(queue_conf->event_queue_cfg &
6132bfe3f2eSlogwang RTE_EVENT_QUEUE_CFG_SINGLE_LINK) &&
6142bfe3f2eSlogwang ((queue_conf->event_queue_cfg &
6152bfe3f2eSlogwang RTE_EVENT_QUEUE_CFG_ALL_TYPES) ||
6162bfe3f2eSlogwang (queue_conf->schedule_type
6172bfe3f2eSlogwang == RTE_SCHED_TYPE_ATOMIC)
6182bfe3f2eSlogwang ))
6192bfe3f2eSlogwang return 1;
6202bfe3f2eSlogwang else
6212bfe3f2eSlogwang return 0;
6222bfe3f2eSlogwang }
6232bfe3f2eSlogwang
6242bfe3f2eSlogwang static inline int
is_valid_ordered_queue_conf(const struct rte_event_queue_conf * queue_conf)6252bfe3f2eSlogwang is_valid_ordered_queue_conf(const struct rte_event_queue_conf *queue_conf)
6262bfe3f2eSlogwang {
6272bfe3f2eSlogwang if (queue_conf &&
6282bfe3f2eSlogwang !(queue_conf->event_queue_cfg &
6292bfe3f2eSlogwang RTE_EVENT_QUEUE_CFG_SINGLE_LINK) &&
6302bfe3f2eSlogwang ((queue_conf->event_queue_cfg &
6312bfe3f2eSlogwang RTE_EVENT_QUEUE_CFG_ALL_TYPES) ||
6322bfe3f2eSlogwang (queue_conf->schedule_type
6332bfe3f2eSlogwang == RTE_SCHED_TYPE_ORDERED)
6342bfe3f2eSlogwang ))
6352bfe3f2eSlogwang return 1;
6362bfe3f2eSlogwang else
6372bfe3f2eSlogwang return 0;
6382bfe3f2eSlogwang }
6392bfe3f2eSlogwang
6402bfe3f2eSlogwang
6412bfe3f2eSlogwang int
rte_event_queue_setup(uint8_t dev_id,uint8_t queue_id,const struct rte_event_queue_conf * queue_conf)6422bfe3f2eSlogwang rte_event_queue_setup(uint8_t dev_id, uint8_t queue_id,
6432bfe3f2eSlogwang const struct rte_event_queue_conf *queue_conf)
6442bfe3f2eSlogwang {
6452bfe3f2eSlogwang struct rte_eventdev *dev;
6462bfe3f2eSlogwang struct rte_event_queue_conf def_conf;
6472bfe3f2eSlogwang
6482bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
6492bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
6502bfe3f2eSlogwang
6512bfe3f2eSlogwang if (!is_valid_queue(dev, queue_id)) {
6522bfe3f2eSlogwang RTE_EDEV_LOG_ERR("Invalid queue_id=%" PRIu8, queue_id);
6532bfe3f2eSlogwang return -EINVAL;
6542bfe3f2eSlogwang }
6552bfe3f2eSlogwang
6562bfe3f2eSlogwang /* Check nb_atomic_flows limit */
6572bfe3f2eSlogwang if (is_valid_atomic_queue_conf(queue_conf)) {
6582bfe3f2eSlogwang if (queue_conf->nb_atomic_flows == 0 ||
6592bfe3f2eSlogwang queue_conf->nb_atomic_flows >
6602bfe3f2eSlogwang dev->data->dev_conf.nb_event_queue_flows) {
6612bfe3f2eSlogwang RTE_EDEV_LOG_ERR(
6622bfe3f2eSlogwang "dev%d queue%d Invalid nb_atomic_flows=%d max_flows=%d",
6632bfe3f2eSlogwang dev_id, queue_id, queue_conf->nb_atomic_flows,
6642bfe3f2eSlogwang dev->data->dev_conf.nb_event_queue_flows);
6652bfe3f2eSlogwang return -EINVAL;
6662bfe3f2eSlogwang }
6672bfe3f2eSlogwang }
6682bfe3f2eSlogwang
6692bfe3f2eSlogwang /* Check nb_atomic_order_sequences limit */
6702bfe3f2eSlogwang if (is_valid_ordered_queue_conf(queue_conf)) {
6712bfe3f2eSlogwang if (queue_conf->nb_atomic_order_sequences == 0 ||
6722bfe3f2eSlogwang queue_conf->nb_atomic_order_sequences >
6732bfe3f2eSlogwang dev->data->dev_conf.nb_event_queue_flows) {
6742bfe3f2eSlogwang RTE_EDEV_LOG_ERR(
6752bfe3f2eSlogwang "dev%d queue%d Invalid nb_atomic_order_seq=%d max_flows=%d",
6762bfe3f2eSlogwang dev_id, queue_id, queue_conf->nb_atomic_order_sequences,
6772bfe3f2eSlogwang dev->data->dev_conf.nb_event_queue_flows);
6782bfe3f2eSlogwang return -EINVAL;
6792bfe3f2eSlogwang }
6802bfe3f2eSlogwang }
6812bfe3f2eSlogwang
6822bfe3f2eSlogwang if (dev->data->dev_started) {
6832bfe3f2eSlogwang RTE_EDEV_LOG_ERR(
6842bfe3f2eSlogwang "device %d must be stopped to allow queue setup", dev_id);
6852bfe3f2eSlogwang return -EBUSY;
6862bfe3f2eSlogwang }
6872bfe3f2eSlogwang
6882bfe3f2eSlogwang RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->queue_setup, -ENOTSUP);
6892bfe3f2eSlogwang
6902bfe3f2eSlogwang if (queue_conf == NULL) {
6912bfe3f2eSlogwang RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->queue_def_conf,
6922bfe3f2eSlogwang -ENOTSUP);
6932bfe3f2eSlogwang (*dev->dev_ops->queue_def_conf)(dev, queue_id, &def_conf);
6942bfe3f2eSlogwang queue_conf = &def_conf;
6952bfe3f2eSlogwang }
6962bfe3f2eSlogwang
6972bfe3f2eSlogwang dev->data->queues_cfg[queue_id] = *queue_conf;
698*2d9fd380Sjfb8856606 rte_eventdev_trace_queue_setup(dev_id, queue_id, queue_conf);
6992bfe3f2eSlogwang return (*dev->dev_ops->queue_setup)(dev, queue_id, queue_conf);
7002bfe3f2eSlogwang }
7012bfe3f2eSlogwang
7022bfe3f2eSlogwang static inline int
is_valid_port(struct rte_eventdev * dev,uint8_t port_id)7032bfe3f2eSlogwang is_valid_port(struct rte_eventdev *dev, uint8_t port_id)
7042bfe3f2eSlogwang {
7052bfe3f2eSlogwang if (port_id < dev->data->nb_ports)
7062bfe3f2eSlogwang return 1;
7072bfe3f2eSlogwang else
7082bfe3f2eSlogwang return 0;
7092bfe3f2eSlogwang }
7102bfe3f2eSlogwang
7112bfe3f2eSlogwang int
rte_event_port_default_conf_get(uint8_t dev_id,uint8_t port_id,struct rte_event_port_conf * port_conf)7122bfe3f2eSlogwang rte_event_port_default_conf_get(uint8_t dev_id, uint8_t port_id,
7132bfe3f2eSlogwang struct rte_event_port_conf *port_conf)
7142bfe3f2eSlogwang {
7152bfe3f2eSlogwang struct rte_eventdev *dev;
7162bfe3f2eSlogwang
7172bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
7182bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
7192bfe3f2eSlogwang
7202bfe3f2eSlogwang if (port_conf == NULL)
7212bfe3f2eSlogwang return -EINVAL;
7222bfe3f2eSlogwang
7232bfe3f2eSlogwang if (!is_valid_port(dev, port_id)) {
7242bfe3f2eSlogwang RTE_EDEV_LOG_ERR("Invalid port_id=%" PRIu8, port_id);
7252bfe3f2eSlogwang return -EINVAL;
7262bfe3f2eSlogwang }
7272bfe3f2eSlogwang
7282bfe3f2eSlogwang RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->port_def_conf, -ENOTSUP);
7292bfe3f2eSlogwang memset(port_conf, 0, sizeof(struct rte_event_port_conf));
7302bfe3f2eSlogwang (*dev->dev_ops->port_def_conf)(dev, port_id, port_conf);
7312bfe3f2eSlogwang return 0;
7322bfe3f2eSlogwang }
7332bfe3f2eSlogwang
7342bfe3f2eSlogwang int
rte_event_port_setup(uint8_t dev_id,uint8_t port_id,const struct rte_event_port_conf * port_conf)7352bfe3f2eSlogwang rte_event_port_setup(uint8_t dev_id, uint8_t port_id,
7362bfe3f2eSlogwang const struct rte_event_port_conf *port_conf)
7372bfe3f2eSlogwang {
7382bfe3f2eSlogwang struct rte_eventdev *dev;
7392bfe3f2eSlogwang struct rte_event_port_conf def_conf;
7402bfe3f2eSlogwang int diag;
7412bfe3f2eSlogwang
7422bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
7432bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
7442bfe3f2eSlogwang
7452bfe3f2eSlogwang if (!is_valid_port(dev, port_id)) {
7462bfe3f2eSlogwang RTE_EDEV_LOG_ERR("Invalid port_id=%" PRIu8, port_id);
7472bfe3f2eSlogwang return -EINVAL;
7482bfe3f2eSlogwang }
7492bfe3f2eSlogwang
7502bfe3f2eSlogwang /* Check new_event_threshold limit */
7512bfe3f2eSlogwang if ((port_conf && !port_conf->new_event_threshold) ||
7522bfe3f2eSlogwang (port_conf && port_conf->new_event_threshold >
7532bfe3f2eSlogwang dev->data->dev_conf.nb_events_limit)) {
7542bfe3f2eSlogwang RTE_EDEV_LOG_ERR(
7552bfe3f2eSlogwang "dev%d port%d Invalid event_threshold=%d nb_events_limit=%d",
7562bfe3f2eSlogwang dev_id, port_id, port_conf->new_event_threshold,
7572bfe3f2eSlogwang dev->data->dev_conf.nb_events_limit);
7582bfe3f2eSlogwang return -EINVAL;
7592bfe3f2eSlogwang }
7602bfe3f2eSlogwang
7612bfe3f2eSlogwang /* Check dequeue_depth limit */
7622bfe3f2eSlogwang if ((port_conf && !port_conf->dequeue_depth) ||
7632bfe3f2eSlogwang (port_conf && port_conf->dequeue_depth >
7642bfe3f2eSlogwang dev->data->dev_conf.nb_event_port_dequeue_depth)) {
7652bfe3f2eSlogwang RTE_EDEV_LOG_ERR(
7662bfe3f2eSlogwang "dev%d port%d Invalid dequeue depth=%d max_dequeue_depth=%d",
7672bfe3f2eSlogwang dev_id, port_id, port_conf->dequeue_depth,
7682bfe3f2eSlogwang dev->data->dev_conf.nb_event_port_dequeue_depth);
7692bfe3f2eSlogwang return -EINVAL;
7702bfe3f2eSlogwang }
7712bfe3f2eSlogwang
7722bfe3f2eSlogwang /* Check enqueue_depth limit */
7732bfe3f2eSlogwang if ((port_conf && !port_conf->enqueue_depth) ||
7742bfe3f2eSlogwang (port_conf && port_conf->enqueue_depth >
7752bfe3f2eSlogwang dev->data->dev_conf.nb_event_port_enqueue_depth)) {
7762bfe3f2eSlogwang RTE_EDEV_LOG_ERR(
7772bfe3f2eSlogwang "dev%d port%d Invalid enqueue depth=%d max_enqueue_depth=%d",
7782bfe3f2eSlogwang dev_id, port_id, port_conf->enqueue_depth,
7792bfe3f2eSlogwang dev->data->dev_conf.nb_event_port_enqueue_depth);
7802bfe3f2eSlogwang return -EINVAL;
7812bfe3f2eSlogwang }
7822bfe3f2eSlogwang
783*2d9fd380Sjfb8856606 if (port_conf &&
784*2d9fd380Sjfb8856606 (port_conf->event_port_cfg & RTE_EVENT_PORT_CFG_DISABLE_IMPL_REL) &&
785d30ea906Sjfb8856606 !(dev->data->event_dev_cap &
786d30ea906Sjfb8856606 RTE_EVENT_DEV_CAP_IMPLICIT_RELEASE_DISABLE)) {
787d30ea906Sjfb8856606 RTE_EDEV_LOG_ERR(
788d30ea906Sjfb8856606 "dev%d port%d Implicit release disable not supported",
789d30ea906Sjfb8856606 dev_id, port_id);
790d30ea906Sjfb8856606 return -EINVAL;
791d30ea906Sjfb8856606 }
792d30ea906Sjfb8856606
7932bfe3f2eSlogwang if (dev->data->dev_started) {
7942bfe3f2eSlogwang RTE_EDEV_LOG_ERR(
7952bfe3f2eSlogwang "device %d must be stopped to allow port setup", dev_id);
7962bfe3f2eSlogwang return -EBUSY;
7972bfe3f2eSlogwang }
7982bfe3f2eSlogwang
7992bfe3f2eSlogwang RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->port_setup, -ENOTSUP);
8002bfe3f2eSlogwang
8012bfe3f2eSlogwang if (port_conf == NULL) {
8022bfe3f2eSlogwang RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->port_def_conf,
8032bfe3f2eSlogwang -ENOTSUP);
8042bfe3f2eSlogwang (*dev->dev_ops->port_def_conf)(dev, port_id, &def_conf);
8052bfe3f2eSlogwang port_conf = &def_conf;
8062bfe3f2eSlogwang }
8072bfe3f2eSlogwang
8082bfe3f2eSlogwang dev->data->ports_cfg[port_id] = *port_conf;
8092bfe3f2eSlogwang
8102bfe3f2eSlogwang diag = (*dev->dev_ops->port_setup)(dev, port_id, port_conf);
8112bfe3f2eSlogwang
8122bfe3f2eSlogwang /* Unlink all the queues from this port(default state after setup) */
8132bfe3f2eSlogwang if (!diag)
8142bfe3f2eSlogwang diag = rte_event_port_unlink(dev_id, port_id, NULL, 0);
8152bfe3f2eSlogwang
816*2d9fd380Sjfb8856606 rte_eventdev_trace_port_setup(dev_id, port_id, port_conf, diag);
8172bfe3f2eSlogwang if (diag < 0)
8182bfe3f2eSlogwang return diag;
8192bfe3f2eSlogwang
8202bfe3f2eSlogwang return 0;
8212bfe3f2eSlogwang }
8222bfe3f2eSlogwang
8232bfe3f2eSlogwang int
rte_event_dev_attr_get(uint8_t dev_id,uint32_t attr_id,uint32_t * attr_value)8242bfe3f2eSlogwang rte_event_dev_attr_get(uint8_t dev_id, uint32_t attr_id,
8252bfe3f2eSlogwang uint32_t *attr_value)
8262bfe3f2eSlogwang {
8272bfe3f2eSlogwang struct rte_eventdev *dev;
8282bfe3f2eSlogwang
8292bfe3f2eSlogwang if (!attr_value)
8302bfe3f2eSlogwang return -EINVAL;
8312bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
8322bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
8332bfe3f2eSlogwang
8342bfe3f2eSlogwang switch (attr_id) {
8352bfe3f2eSlogwang case RTE_EVENT_DEV_ATTR_PORT_COUNT:
8362bfe3f2eSlogwang *attr_value = dev->data->nb_ports;
8372bfe3f2eSlogwang break;
8382bfe3f2eSlogwang case RTE_EVENT_DEV_ATTR_QUEUE_COUNT:
8392bfe3f2eSlogwang *attr_value = dev->data->nb_queues;
8402bfe3f2eSlogwang break;
8412bfe3f2eSlogwang case RTE_EVENT_DEV_ATTR_STARTED:
8422bfe3f2eSlogwang *attr_value = dev->data->dev_started;
8432bfe3f2eSlogwang break;
8442bfe3f2eSlogwang default:
8452bfe3f2eSlogwang return -EINVAL;
8462bfe3f2eSlogwang }
8472bfe3f2eSlogwang
8482bfe3f2eSlogwang return 0;
8492bfe3f2eSlogwang }
8502bfe3f2eSlogwang
8512bfe3f2eSlogwang int
rte_event_port_attr_get(uint8_t dev_id,uint8_t port_id,uint32_t attr_id,uint32_t * attr_value)8522bfe3f2eSlogwang rte_event_port_attr_get(uint8_t dev_id, uint8_t port_id, uint32_t attr_id,
8532bfe3f2eSlogwang uint32_t *attr_value)
8542bfe3f2eSlogwang {
8552bfe3f2eSlogwang struct rte_eventdev *dev;
8562bfe3f2eSlogwang
8572bfe3f2eSlogwang if (!attr_value)
8582bfe3f2eSlogwang return -EINVAL;
8592bfe3f2eSlogwang
8602bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
8612bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
8622bfe3f2eSlogwang if (!is_valid_port(dev, port_id)) {
8632bfe3f2eSlogwang RTE_EDEV_LOG_ERR("Invalid port_id=%" PRIu8, port_id);
8642bfe3f2eSlogwang return -EINVAL;
8652bfe3f2eSlogwang }
8662bfe3f2eSlogwang
8672bfe3f2eSlogwang switch (attr_id) {
8682bfe3f2eSlogwang case RTE_EVENT_PORT_ATTR_ENQ_DEPTH:
8692bfe3f2eSlogwang *attr_value = dev->data->ports_cfg[port_id].enqueue_depth;
8702bfe3f2eSlogwang break;
8712bfe3f2eSlogwang case RTE_EVENT_PORT_ATTR_DEQ_DEPTH:
8722bfe3f2eSlogwang *attr_value = dev->data->ports_cfg[port_id].dequeue_depth;
8732bfe3f2eSlogwang break;
8742bfe3f2eSlogwang case RTE_EVENT_PORT_ATTR_NEW_EVENT_THRESHOLD:
8752bfe3f2eSlogwang *attr_value = dev->data->ports_cfg[port_id].new_event_threshold;
8762bfe3f2eSlogwang break;
877*2d9fd380Sjfb8856606 case RTE_EVENT_PORT_ATTR_IMPLICIT_RELEASE_DISABLE:
878*2d9fd380Sjfb8856606 {
879*2d9fd380Sjfb8856606 uint32_t config;
880*2d9fd380Sjfb8856606
881*2d9fd380Sjfb8856606 config = dev->data->ports_cfg[port_id].event_port_cfg;
882*2d9fd380Sjfb8856606 *attr_value = !!(config & RTE_EVENT_PORT_CFG_DISABLE_IMPL_REL);
883*2d9fd380Sjfb8856606 break;
884*2d9fd380Sjfb8856606 }
8852bfe3f2eSlogwang default:
8862bfe3f2eSlogwang return -EINVAL;
8872bfe3f2eSlogwang };
8882bfe3f2eSlogwang return 0;
8892bfe3f2eSlogwang }
8902bfe3f2eSlogwang
8912bfe3f2eSlogwang int
rte_event_queue_attr_get(uint8_t dev_id,uint8_t queue_id,uint32_t attr_id,uint32_t * attr_value)8922bfe3f2eSlogwang rte_event_queue_attr_get(uint8_t dev_id, uint8_t queue_id, uint32_t attr_id,
8932bfe3f2eSlogwang uint32_t *attr_value)
8942bfe3f2eSlogwang {
8952bfe3f2eSlogwang struct rte_event_queue_conf *conf;
8962bfe3f2eSlogwang struct rte_eventdev *dev;
8972bfe3f2eSlogwang
8982bfe3f2eSlogwang if (!attr_value)
8992bfe3f2eSlogwang return -EINVAL;
9002bfe3f2eSlogwang
9012bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
9022bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
9032bfe3f2eSlogwang if (!is_valid_queue(dev, queue_id)) {
9042bfe3f2eSlogwang RTE_EDEV_LOG_ERR("Invalid queue_id=%" PRIu8, queue_id);
9052bfe3f2eSlogwang return -EINVAL;
9062bfe3f2eSlogwang }
9072bfe3f2eSlogwang
9082bfe3f2eSlogwang conf = &dev->data->queues_cfg[queue_id];
9092bfe3f2eSlogwang
9102bfe3f2eSlogwang switch (attr_id) {
9112bfe3f2eSlogwang case RTE_EVENT_QUEUE_ATTR_PRIORITY:
9122bfe3f2eSlogwang *attr_value = RTE_EVENT_DEV_PRIORITY_NORMAL;
9132bfe3f2eSlogwang if (dev->data->event_dev_cap & RTE_EVENT_DEV_CAP_QUEUE_QOS)
9142bfe3f2eSlogwang *attr_value = conf->priority;
9152bfe3f2eSlogwang break;
9162bfe3f2eSlogwang case RTE_EVENT_QUEUE_ATTR_NB_ATOMIC_FLOWS:
9172bfe3f2eSlogwang *attr_value = conf->nb_atomic_flows;
9182bfe3f2eSlogwang break;
9192bfe3f2eSlogwang case RTE_EVENT_QUEUE_ATTR_NB_ATOMIC_ORDER_SEQUENCES:
9202bfe3f2eSlogwang *attr_value = conf->nb_atomic_order_sequences;
9212bfe3f2eSlogwang break;
9222bfe3f2eSlogwang case RTE_EVENT_QUEUE_ATTR_EVENT_QUEUE_CFG:
9232bfe3f2eSlogwang *attr_value = conf->event_queue_cfg;
9242bfe3f2eSlogwang break;
9252bfe3f2eSlogwang case RTE_EVENT_QUEUE_ATTR_SCHEDULE_TYPE:
9262bfe3f2eSlogwang if (conf->event_queue_cfg & RTE_EVENT_QUEUE_CFG_ALL_TYPES)
9272bfe3f2eSlogwang return -EOVERFLOW;
9282bfe3f2eSlogwang
9292bfe3f2eSlogwang *attr_value = conf->schedule_type;
9302bfe3f2eSlogwang break;
9312bfe3f2eSlogwang default:
9322bfe3f2eSlogwang return -EINVAL;
9332bfe3f2eSlogwang };
9342bfe3f2eSlogwang return 0;
9352bfe3f2eSlogwang }
9362bfe3f2eSlogwang
9372bfe3f2eSlogwang int
rte_event_port_link(uint8_t dev_id,uint8_t port_id,const uint8_t queues[],const uint8_t priorities[],uint16_t nb_links)9382bfe3f2eSlogwang rte_event_port_link(uint8_t dev_id, uint8_t port_id,
9392bfe3f2eSlogwang const uint8_t queues[], const uint8_t priorities[],
9402bfe3f2eSlogwang uint16_t nb_links)
9412bfe3f2eSlogwang {
9422bfe3f2eSlogwang struct rte_eventdev *dev;
9432bfe3f2eSlogwang uint8_t queues_list[RTE_EVENT_MAX_QUEUES_PER_DEV];
9442bfe3f2eSlogwang uint8_t priorities_list[RTE_EVENT_MAX_QUEUES_PER_DEV];
9452bfe3f2eSlogwang uint16_t *links_map;
9462bfe3f2eSlogwang int i, diag;
9472bfe3f2eSlogwang
9484b05018fSfengbojiang RTE_EVENTDEV_VALID_DEVID_OR_ERRNO_RET(dev_id, EINVAL, 0);
9492bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
9502bfe3f2eSlogwang
9512bfe3f2eSlogwang if (*dev->dev_ops->port_link == NULL) {
9524418919fSjohnjiang RTE_EDEV_LOG_ERR("Function not supported\n");
9534b05018fSfengbojiang rte_errno = ENOTSUP;
9542bfe3f2eSlogwang return 0;
9552bfe3f2eSlogwang }
9562bfe3f2eSlogwang
9572bfe3f2eSlogwang if (!is_valid_port(dev, port_id)) {
9582bfe3f2eSlogwang RTE_EDEV_LOG_ERR("Invalid port_id=%" PRIu8, port_id);
9594b05018fSfengbojiang rte_errno = EINVAL;
9602bfe3f2eSlogwang return 0;
9612bfe3f2eSlogwang }
9622bfe3f2eSlogwang
9632bfe3f2eSlogwang if (queues == NULL) {
9642bfe3f2eSlogwang for (i = 0; i < dev->data->nb_queues; i++)
9652bfe3f2eSlogwang queues_list[i] = i;
9662bfe3f2eSlogwang
9672bfe3f2eSlogwang queues = queues_list;
9682bfe3f2eSlogwang nb_links = dev->data->nb_queues;
9692bfe3f2eSlogwang }
9702bfe3f2eSlogwang
9712bfe3f2eSlogwang if (priorities == NULL) {
9722bfe3f2eSlogwang for (i = 0; i < nb_links; i++)
9732bfe3f2eSlogwang priorities_list[i] = RTE_EVENT_DEV_PRIORITY_NORMAL;
9742bfe3f2eSlogwang
9752bfe3f2eSlogwang priorities = priorities_list;
9762bfe3f2eSlogwang }
9772bfe3f2eSlogwang
9782bfe3f2eSlogwang for (i = 0; i < nb_links; i++)
9792bfe3f2eSlogwang if (queues[i] >= dev->data->nb_queues) {
9804b05018fSfengbojiang rte_errno = EINVAL;
9812bfe3f2eSlogwang return 0;
9822bfe3f2eSlogwang }
9832bfe3f2eSlogwang
9842bfe3f2eSlogwang diag = (*dev->dev_ops->port_link)(dev, dev->data->ports[port_id],
9852bfe3f2eSlogwang queues, priorities, nb_links);
9862bfe3f2eSlogwang if (diag < 0)
9872bfe3f2eSlogwang return diag;
9882bfe3f2eSlogwang
9892bfe3f2eSlogwang links_map = dev->data->links_map;
9902bfe3f2eSlogwang /* Point links_map to this port specific area */
9912bfe3f2eSlogwang links_map += (port_id * RTE_EVENT_MAX_QUEUES_PER_DEV);
9922bfe3f2eSlogwang for (i = 0; i < diag; i++)
9932bfe3f2eSlogwang links_map[queues[i]] = (uint8_t)priorities[i];
9942bfe3f2eSlogwang
995*2d9fd380Sjfb8856606 rte_eventdev_trace_port_link(dev_id, port_id, nb_links, diag);
9962bfe3f2eSlogwang return diag;
9972bfe3f2eSlogwang }
9982bfe3f2eSlogwang
9992bfe3f2eSlogwang int
rte_event_port_unlink(uint8_t dev_id,uint8_t port_id,uint8_t queues[],uint16_t nb_unlinks)10002bfe3f2eSlogwang rte_event_port_unlink(uint8_t dev_id, uint8_t port_id,
10012bfe3f2eSlogwang uint8_t queues[], uint16_t nb_unlinks)
10022bfe3f2eSlogwang {
10032bfe3f2eSlogwang struct rte_eventdev *dev;
10042bfe3f2eSlogwang uint8_t all_queues[RTE_EVENT_MAX_QUEUES_PER_DEV];
1005d30ea906Sjfb8856606 int i, diag, j;
10062bfe3f2eSlogwang uint16_t *links_map;
10072bfe3f2eSlogwang
10084b05018fSfengbojiang RTE_EVENTDEV_VALID_DEVID_OR_ERRNO_RET(dev_id, EINVAL, 0);
10092bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
10102bfe3f2eSlogwang
10112bfe3f2eSlogwang if (*dev->dev_ops->port_unlink == NULL) {
10124418919fSjohnjiang RTE_EDEV_LOG_ERR("Function not supported");
10134b05018fSfengbojiang rte_errno = ENOTSUP;
10142bfe3f2eSlogwang return 0;
10152bfe3f2eSlogwang }
10162bfe3f2eSlogwang
10172bfe3f2eSlogwang if (!is_valid_port(dev, port_id)) {
10182bfe3f2eSlogwang RTE_EDEV_LOG_ERR("Invalid port_id=%" PRIu8, port_id);
10194b05018fSfengbojiang rte_errno = EINVAL;
10202bfe3f2eSlogwang return 0;
10212bfe3f2eSlogwang }
10222bfe3f2eSlogwang
1023d30ea906Sjfb8856606 links_map = dev->data->links_map;
1024d30ea906Sjfb8856606 /* Point links_map to this port specific area */
1025d30ea906Sjfb8856606 links_map += (port_id * RTE_EVENT_MAX_QUEUES_PER_DEV);
1026d30ea906Sjfb8856606
10272bfe3f2eSlogwang if (queues == NULL) {
1028d30ea906Sjfb8856606 j = 0;
1029d30ea906Sjfb8856606 for (i = 0; i < dev->data->nb_queues; i++) {
1030d30ea906Sjfb8856606 if (links_map[i] !=
1031d30ea906Sjfb8856606 EVENT_QUEUE_SERVICE_PRIORITY_INVALID) {
1032d30ea906Sjfb8856606 all_queues[j] = i;
1033d30ea906Sjfb8856606 j++;
1034d30ea906Sjfb8856606 }
1035d30ea906Sjfb8856606 }
10362bfe3f2eSlogwang queues = all_queues;
1037d30ea906Sjfb8856606 } else {
1038d30ea906Sjfb8856606 for (j = 0; j < nb_unlinks; j++) {
1039d30ea906Sjfb8856606 if (links_map[queues[j]] ==
1040d30ea906Sjfb8856606 EVENT_QUEUE_SERVICE_PRIORITY_INVALID)
1041d30ea906Sjfb8856606 break;
1042d30ea906Sjfb8856606 }
10432bfe3f2eSlogwang }
10442bfe3f2eSlogwang
1045d30ea906Sjfb8856606 nb_unlinks = j;
10462bfe3f2eSlogwang for (i = 0; i < nb_unlinks; i++)
10472bfe3f2eSlogwang if (queues[i] >= dev->data->nb_queues) {
10484b05018fSfengbojiang rte_errno = EINVAL;
10492bfe3f2eSlogwang return 0;
10502bfe3f2eSlogwang }
10512bfe3f2eSlogwang
10522bfe3f2eSlogwang diag = (*dev->dev_ops->port_unlink)(dev, dev->data->ports[port_id],
10532bfe3f2eSlogwang queues, nb_unlinks);
10542bfe3f2eSlogwang
10552bfe3f2eSlogwang if (diag < 0)
10562bfe3f2eSlogwang return diag;
10572bfe3f2eSlogwang
10582bfe3f2eSlogwang for (i = 0; i < diag; i++)
10592bfe3f2eSlogwang links_map[queues[i]] = EVENT_QUEUE_SERVICE_PRIORITY_INVALID;
10602bfe3f2eSlogwang
1061*2d9fd380Sjfb8856606 rte_eventdev_trace_port_unlink(dev_id, port_id, nb_unlinks, diag);
10622bfe3f2eSlogwang return diag;
10632bfe3f2eSlogwang }
10642bfe3f2eSlogwang
10654418919fSjohnjiang int
rte_event_port_unlinks_in_progress(uint8_t dev_id,uint8_t port_id)1066d30ea906Sjfb8856606 rte_event_port_unlinks_in_progress(uint8_t dev_id, uint8_t port_id)
1067d30ea906Sjfb8856606 {
1068d30ea906Sjfb8856606 struct rte_eventdev *dev;
1069d30ea906Sjfb8856606
1070d30ea906Sjfb8856606 RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
1071d30ea906Sjfb8856606 dev = &rte_eventdevs[dev_id];
1072d30ea906Sjfb8856606 if (!is_valid_port(dev, port_id)) {
1073d30ea906Sjfb8856606 RTE_EDEV_LOG_ERR("Invalid port_id=%" PRIu8, port_id);
1074d30ea906Sjfb8856606 return -EINVAL;
1075d30ea906Sjfb8856606 }
1076d30ea906Sjfb8856606
1077d30ea906Sjfb8856606 /* Return 0 if the PMD does not implement unlinks in progress.
1078d30ea906Sjfb8856606 * This allows PMDs which handle unlink synchronously to not implement
1079d30ea906Sjfb8856606 * this function at all.
1080d30ea906Sjfb8856606 */
1081d30ea906Sjfb8856606 RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->port_unlinks_in_progress, 0);
1082d30ea906Sjfb8856606
1083d30ea906Sjfb8856606 return (*dev->dev_ops->port_unlinks_in_progress)(dev,
1084d30ea906Sjfb8856606 dev->data->ports[port_id]);
1085d30ea906Sjfb8856606 }
1086d30ea906Sjfb8856606
10872bfe3f2eSlogwang int
rte_event_port_links_get(uint8_t dev_id,uint8_t port_id,uint8_t queues[],uint8_t priorities[])10882bfe3f2eSlogwang rte_event_port_links_get(uint8_t dev_id, uint8_t port_id,
10892bfe3f2eSlogwang uint8_t queues[], uint8_t priorities[])
10902bfe3f2eSlogwang {
10912bfe3f2eSlogwang struct rte_eventdev *dev;
10922bfe3f2eSlogwang uint16_t *links_map;
10932bfe3f2eSlogwang int i, count = 0;
10942bfe3f2eSlogwang
10952bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
10962bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
10972bfe3f2eSlogwang if (!is_valid_port(dev, port_id)) {
10982bfe3f2eSlogwang RTE_EDEV_LOG_ERR("Invalid port_id=%" PRIu8, port_id);
10992bfe3f2eSlogwang return -EINVAL;
11002bfe3f2eSlogwang }
11012bfe3f2eSlogwang
11022bfe3f2eSlogwang links_map = dev->data->links_map;
11032bfe3f2eSlogwang /* Point links_map to this port specific area */
11042bfe3f2eSlogwang links_map += (port_id * RTE_EVENT_MAX_QUEUES_PER_DEV);
11052bfe3f2eSlogwang for (i = 0; i < dev->data->nb_queues; i++) {
11062bfe3f2eSlogwang if (links_map[i] != EVENT_QUEUE_SERVICE_PRIORITY_INVALID) {
11072bfe3f2eSlogwang queues[count] = i;
11082bfe3f2eSlogwang priorities[count] = (uint8_t)links_map[i];
11092bfe3f2eSlogwang ++count;
11102bfe3f2eSlogwang }
11112bfe3f2eSlogwang }
11122bfe3f2eSlogwang return count;
11132bfe3f2eSlogwang }
11142bfe3f2eSlogwang
11152bfe3f2eSlogwang int
rte_event_dequeue_timeout_ticks(uint8_t dev_id,uint64_t ns,uint64_t * timeout_ticks)11162bfe3f2eSlogwang rte_event_dequeue_timeout_ticks(uint8_t dev_id, uint64_t ns,
11172bfe3f2eSlogwang uint64_t *timeout_ticks)
11182bfe3f2eSlogwang {
11192bfe3f2eSlogwang struct rte_eventdev *dev;
11202bfe3f2eSlogwang
11212bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
11222bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
11232bfe3f2eSlogwang RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->timeout_ticks, -ENOTSUP);
11242bfe3f2eSlogwang
11252bfe3f2eSlogwang if (timeout_ticks == NULL)
11262bfe3f2eSlogwang return -EINVAL;
11272bfe3f2eSlogwang
11282bfe3f2eSlogwang return (*dev->dev_ops->timeout_ticks)(dev, ns, timeout_ticks);
11292bfe3f2eSlogwang }
11302bfe3f2eSlogwang
11312bfe3f2eSlogwang int
rte_event_dev_service_id_get(uint8_t dev_id,uint32_t * service_id)11322bfe3f2eSlogwang rte_event_dev_service_id_get(uint8_t dev_id, uint32_t *service_id)
11332bfe3f2eSlogwang {
11342bfe3f2eSlogwang struct rte_eventdev *dev;
11352bfe3f2eSlogwang
11362bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
11372bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
11382bfe3f2eSlogwang
11392bfe3f2eSlogwang if (service_id == NULL)
11402bfe3f2eSlogwang return -EINVAL;
11412bfe3f2eSlogwang
11422bfe3f2eSlogwang if (dev->data->service_inited)
11432bfe3f2eSlogwang *service_id = dev->data->service_id;
11442bfe3f2eSlogwang
11452bfe3f2eSlogwang return dev->data->service_inited ? 0 : -ESRCH;
11462bfe3f2eSlogwang }
11472bfe3f2eSlogwang
11482bfe3f2eSlogwang int
rte_event_dev_dump(uint8_t dev_id,FILE * f)11492bfe3f2eSlogwang rte_event_dev_dump(uint8_t dev_id, FILE *f)
11502bfe3f2eSlogwang {
11512bfe3f2eSlogwang struct rte_eventdev *dev;
11522bfe3f2eSlogwang
11532bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
11542bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
11552bfe3f2eSlogwang RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dump, -ENOTSUP);
1156*2d9fd380Sjfb8856606 if (f == NULL)
1157*2d9fd380Sjfb8856606 return -EINVAL;
11582bfe3f2eSlogwang
11592bfe3f2eSlogwang (*dev->dev_ops->dump)(dev, f);
11602bfe3f2eSlogwang return 0;
11612bfe3f2eSlogwang
11622bfe3f2eSlogwang }
11632bfe3f2eSlogwang
11642bfe3f2eSlogwang static int
xstats_get_count(uint8_t dev_id,enum rte_event_dev_xstats_mode mode,uint8_t queue_port_id)11652bfe3f2eSlogwang xstats_get_count(uint8_t dev_id, enum rte_event_dev_xstats_mode mode,
11662bfe3f2eSlogwang uint8_t queue_port_id)
11672bfe3f2eSlogwang {
11682bfe3f2eSlogwang struct rte_eventdev *dev = &rte_eventdevs[dev_id];
11692bfe3f2eSlogwang if (dev->dev_ops->xstats_get_names != NULL)
11702bfe3f2eSlogwang return (*dev->dev_ops->xstats_get_names)(dev, mode,
11712bfe3f2eSlogwang queue_port_id,
11722bfe3f2eSlogwang NULL, NULL, 0);
11732bfe3f2eSlogwang return 0;
11742bfe3f2eSlogwang }
11752bfe3f2eSlogwang
11762bfe3f2eSlogwang int
rte_event_dev_xstats_names_get(uint8_t dev_id,enum rte_event_dev_xstats_mode mode,uint8_t queue_port_id,struct rte_event_dev_xstats_name * xstats_names,unsigned int * ids,unsigned int size)11772bfe3f2eSlogwang rte_event_dev_xstats_names_get(uint8_t dev_id,
11782bfe3f2eSlogwang enum rte_event_dev_xstats_mode mode, uint8_t queue_port_id,
11792bfe3f2eSlogwang struct rte_event_dev_xstats_name *xstats_names,
11802bfe3f2eSlogwang unsigned int *ids, unsigned int size)
11812bfe3f2eSlogwang {
11822bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -ENODEV);
11832bfe3f2eSlogwang const int cnt_expected_entries = xstats_get_count(dev_id, mode,
11842bfe3f2eSlogwang queue_port_id);
11852bfe3f2eSlogwang if (xstats_names == NULL || cnt_expected_entries < 0 ||
11862bfe3f2eSlogwang (int)size < cnt_expected_entries)
11872bfe3f2eSlogwang return cnt_expected_entries;
11882bfe3f2eSlogwang
11892bfe3f2eSlogwang /* dev_id checked above */
11902bfe3f2eSlogwang const struct rte_eventdev *dev = &rte_eventdevs[dev_id];
11912bfe3f2eSlogwang
11922bfe3f2eSlogwang if (dev->dev_ops->xstats_get_names != NULL)
11932bfe3f2eSlogwang return (*dev->dev_ops->xstats_get_names)(dev, mode,
11942bfe3f2eSlogwang queue_port_id, xstats_names, ids, size);
11952bfe3f2eSlogwang
11962bfe3f2eSlogwang return -ENOTSUP;
11972bfe3f2eSlogwang }
11982bfe3f2eSlogwang
11992bfe3f2eSlogwang /* retrieve eventdev extended statistics */
12002bfe3f2eSlogwang int
rte_event_dev_xstats_get(uint8_t dev_id,enum rte_event_dev_xstats_mode mode,uint8_t queue_port_id,const unsigned int ids[],uint64_t values[],unsigned int n)12012bfe3f2eSlogwang rte_event_dev_xstats_get(uint8_t dev_id, enum rte_event_dev_xstats_mode mode,
12022bfe3f2eSlogwang uint8_t queue_port_id, const unsigned int ids[],
12032bfe3f2eSlogwang uint64_t values[], unsigned int n)
12042bfe3f2eSlogwang {
12052bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -ENODEV);
12062bfe3f2eSlogwang const struct rte_eventdev *dev = &rte_eventdevs[dev_id];
12072bfe3f2eSlogwang
12082bfe3f2eSlogwang /* implemented by the driver */
12092bfe3f2eSlogwang if (dev->dev_ops->xstats_get != NULL)
12102bfe3f2eSlogwang return (*dev->dev_ops->xstats_get)(dev, mode, queue_port_id,
12112bfe3f2eSlogwang ids, values, n);
12122bfe3f2eSlogwang return -ENOTSUP;
12132bfe3f2eSlogwang }
12142bfe3f2eSlogwang
12152bfe3f2eSlogwang uint64_t
rte_event_dev_xstats_by_name_get(uint8_t dev_id,const char * name,unsigned int * id)12162bfe3f2eSlogwang rte_event_dev_xstats_by_name_get(uint8_t dev_id, const char *name,
12172bfe3f2eSlogwang unsigned int *id)
12182bfe3f2eSlogwang {
12192bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, 0);
12202bfe3f2eSlogwang const struct rte_eventdev *dev = &rte_eventdevs[dev_id];
12212bfe3f2eSlogwang unsigned int temp = -1;
12222bfe3f2eSlogwang
12232bfe3f2eSlogwang if (id != NULL)
12242bfe3f2eSlogwang *id = (unsigned int)-1;
12252bfe3f2eSlogwang else
12262bfe3f2eSlogwang id = &temp; /* ensure driver never gets a NULL value */
12272bfe3f2eSlogwang
12282bfe3f2eSlogwang /* implemented by driver */
12292bfe3f2eSlogwang if (dev->dev_ops->xstats_get_by_name != NULL)
12302bfe3f2eSlogwang return (*dev->dev_ops->xstats_get_by_name)(dev, name, id);
12312bfe3f2eSlogwang return -ENOTSUP;
12322bfe3f2eSlogwang }
12332bfe3f2eSlogwang
rte_event_dev_xstats_reset(uint8_t dev_id,enum rte_event_dev_xstats_mode mode,int16_t queue_port_id,const uint32_t ids[],uint32_t nb_ids)12342bfe3f2eSlogwang int rte_event_dev_xstats_reset(uint8_t dev_id,
12352bfe3f2eSlogwang enum rte_event_dev_xstats_mode mode, int16_t queue_port_id,
12362bfe3f2eSlogwang const uint32_t ids[], uint32_t nb_ids)
12372bfe3f2eSlogwang {
12382bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
12392bfe3f2eSlogwang struct rte_eventdev *dev = &rte_eventdevs[dev_id];
12402bfe3f2eSlogwang
12412bfe3f2eSlogwang if (dev->dev_ops->xstats_reset != NULL)
12422bfe3f2eSlogwang return (*dev->dev_ops->xstats_reset)(dev, mode, queue_port_id,
12432bfe3f2eSlogwang ids, nb_ids);
12442bfe3f2eSlogwang return -ENOTSUP;
12452bfe3f2eSlogwang }
12462bfe3f2eSlogwang
1247*2d9fd380Sjfb8856606 int rte_event_pmd_selftest_seqn_dynfield_offset = -1;
1248*2d9fd380Sjfb8856606
rte_event_dev_selftest(uint8_t dev_id)1249d30ea906Sjfb8856606 int rte_event_dev_selftest(uint8_t dev_id)
1250d30ea906Sjfb8856606 {
1251d30ea906Sjfb8856606 RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
1252*2d9fd380Sjfb8856606 static const struct rte_mbuf_dynfield test_seqn_dynfield_desc = {
1253*2d9fd380Sjfb8856606 .name = "rte_event_pmd_selftest_seqn_dynfield",
1254*2d9fd380Sjfb8856606 .size = sizeof(rte_event_pmd_selftest_seqn_t),
1255*2d9fd380Sjfb8856606 .align = __alignof__(rte_event_pmd_selftest_seqn_t),
1256*2d9fd380Sjfb8856606 };
1257d30ea906Sjfb8856606 struct rte_eventdev *dev = &rte_eventdevs[dev_id];
1258d30ea906Sjfb8856606
1259*2d9fd380Sjfb8856606 if (dev->dev_ops->dev_selftest != NULL) {
1260*2d9fd380Sjfb8856606 rte_event_pmd_selftest_seqn_dynfield_offset =
1261*2d9fd380Sjfb8856606 rte_mbuf_dynfield_register(&test_seqn_dynfield_desc);
1262*2d9fd380Sjfb8856606 if (rte_event_pmd_selftest_seqn_dynfield_offset < 0)
1263*2d9fd380Sjfb8856606 return -ENOMEM;
1264d30ea906Sjfb8856606 return (*dev->dev_ops->dev_selftest)();
1265*2d9fd380Sjfb8856606 }
1266d30ea906Sjfb8856606 return -ENOTSUP;
1267d30ea906Sjfb8856606 }
1268d30ea906Sjfb8856606
12692bfe3f2eSlogwang int
rte_event_dev_start(uint8_t dev_id)12702bfe3f2eSlogwang rte_event_dev_start(uint8_t dev_id)
12712bfe3f2eSlogwang {
12722bfe3f2eSlogwang struct rte_eventdev *dev;
12732bfe3f2eSlogwang int diag;
12742bfe3f2eSlogwang
12752bfe3f2eSlogwang RTE_EDEV_LOG_DEBUG("Start dev_id=%" PRIu8, dev_id);
12762bfe3f2eSlogwang
12772bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
12782bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
12792bfe3f2eSlogwang RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_start, -ENOTSUP);
12802bfe3f2eSlogwang
12812bfe3f2eSlogwang if (dev->data->dev_started != 0) {
12822bfe3f2eSlogwang RTE_EDEV_LOG_ERR("Device with dev_id=%" PRIu8 "already started",
12832bfe3f2eSlogwang dev_id);
12842bfe3f2eSlogwang return 0;
12852bfe3f2eSlogwang }
12862bfe3f2eSlogwang
12872bfe3f2eSlogwang diag = (*dev->dev_ops->dev_start)(dev);
1288*2d9fd380Sjfb8856606 rte_eventdev_trace_start(dev_id, diag);
12892bfe3f2eSlogwang if (diag == 0)
12902bfe3f2eSlogwang dev->data->dev_started = 1;
12912bfe3f2eSlogwang else
12922bfe3f2eSlogwang return diag;
12932bfe3f2eSlogwang
12942bfe3f2eSlogwang return 0;
12952bfe3f2eSlogwang }
12962bfe3f2eSlogwang
1297d30ea906Sjfb8856606 int
rte_event_dev_stop_flush_callback_register(uint8_t dev_id,eventdev_stop_flush_t callback,void * userdata)1298d30ea906Sjfb8856606 rte_event_dev_stop_flush_callback_register(uint8_t dev_id,
1299d30ea906Sjfb8856606 eventdev_stop_flush_t callback, void *userdata)
1300d30ea906Sjfb8856606 {
1301d30ea906Sjfb8856606 struct rte_eventdev *dev;
1302d30ea906Sjfb8856606
1303d30ea906Sjfb8856606 RTE_EDEV_LOG_DEBUG("Stop flush register dev_id=%" PRIu8, dev_id);
1304d30ea906Sjfb8856606
1305d30ea906Sjfb8856606 RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
1306d30ea906Sjfb8856606 dev = &rte_eventdevs[dev_id];
1307d30ea906Sjfb8856606
1308d30ea906Sjfb8856606 dev->dev_ops->dev_stop_flush = callback;
1309d30ea906Sjfb8856606 dev->data->dev_stop_flush_arg = userdata;
1310d30ea906Sjfb8856606
1311d30ea906Sjfb8856606 return 0;
1312d30ea906Sjfb8856606 }
1313d30ea906Sjfb8856606
13142bfe3f2eSlogwang void
rte_event_dev_stop(uint8_t dev_id)13152bfe3f2eSlogwang rte_event_dev_stop(uint8_t dev_id)
13162bfe3f2eSlogwang {
13172bfe3f2eSlogwang struct rte_eventdev *dev;
13182bfe3f2eSlogwang
13192bfe3f2eSlogwang RTE_EDEV_LOG_DEBUG("Stop dev_id=%" PRIu8, dev_id);
13202bfe3f2eSlogwang
13212bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_RET(dev_id);
13222bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
13232bfe3f2eSlogwang RTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_stop);
13242bfe3f2eSlogwang
13252bfe3f2eSlogwang if (dev->data->dev_started == 0) {
13262bfe3f2eSlogwang RTE_EDEV_LOG_ERR("Device with dev_id=%" PRIu8 "already stopped",
13272bfe3f2eSlogwang dev_id);
13282bfe3f2eSlogwang return;
13292bfe3f2eSlogwang }
13302bfe3f2eSlogwang
13312bfe3f2eSlogwang dev->data->dev_started = 0;
13322bfe3f2eSlogwang (*dev->dev_ops->dev_stop)(dev);
1333*2d9fd380Sjfb8856606 rte_eventdev_trace_stop(dev_id);
13342bfe3f2eSlogwang }
13352bfe3f2eSlogwang
13362bfe3f2eSlogwang int
rte_event_dev_close(uint8_t dev_id)13372bfe3f2eSlogwang rte_event_dev_close(uint8_t dev_id)
13382bfe3f2eSlogwang {
13392bfe3f2eSlogwang struct rte_eventdev *dev;
13402bfe3f2eSlogwang
13412bfe3f2eSlogwang RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
13422bfe3f2eSlogwang dev = &rte_eventdevs[dev_id];
13432bfe3f2eSlogwang RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_close, -ENOTSUP);
13442bfe3f2eSlogwang
13452bfe3f2eSlogwang /* Device must be stopped before it can be closed */
13462bfe3f2eSlogwang if (dev->data->dev_started == 1) {
13472bfe3f2eSlogwang RTE_EDEV_LOG_ERR("Device %u must be stopped before closing",
13482bfe3f2eSlogwang dev_id);
13492bfe3f2eSlogwang return -EBUSY;
13502bfe3f2eSlogwang }
13512bfe3f2eSlogwang
1352*2d9fd380Sjfb8856606 rte_eventdev_trace_close(dev_id);
13532bfe3f2eSlogwang return (*dev->dev_ops->dev_close)(dev);
13542bfe3f2eSlogwang }
13552bfe3f2eSlogwang
13562bfe3f2eSlogwang static inline int
rte_eventdev_data_alloc(uint8_t dev_id,struct rte_eventdev_data ** data,int socket_id)13572bfe3f2eSlogwang rte_eventdev_data_alloc(uint8_t dev_id, struct rte_eventdev_data **data,
13582bfe3f2eSlogwang int socket_id)
13592bfe3f2eSlogwang {
13602bfe3f2eSlogwang char mz_name[RTE_EVENTDEV_NAME_MAX_LEN];
13612bfe3f2eSlogwang const struct rte_memzone *mz;
13622bfe3f2eSlogwang int n;
13632bfe3f2eSlogwang
13642bfe3f2eSlogwang /* Generate memzone name */
13652bfe3f2eSlogwang n = snprintf(mz_name, sizeof(mz_name), "rte_eventdev_data_%u", dev_id);
13662bfe3f2eSlogwang if (n >= (int)sizeof(mz_name))
13672bfe3f2eSlogwang return -EINVAL;
13682bfe3f2eSlogwang
13692bfe3f2eSlogwang if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
13702bfe3f2eSlogwang mz = rte_memzone_reserve(mz_name,
13712bfe3f2eSlogwang sizeof(struct rte_eventdev_data),
13722bfe3f2eSlogwang socket_id, 0);
13732bfe3f2eSlogwang } else
13742bfe3f2eSlogwang mz = rte_memzone_lookup(mz_name);
13752bfe3f2eSlogwang
13762bfe3f2eSlogwang if (mz == NULL)
13772bfe3f2eSlogwang return -ENOMEM;
13782bfe3f2eSlogwang
13792bfe3f2eSlogwang *data = mz->addr;
13802bfe3f2eSlogwang if (rte_eal_process_type() == RTE_PROC_PRIMARY)
13812bfe3f2eSlogwang memset(*data, 0, sizeof(struct rte_eventdev_data));
13822bfe3f2eSlogwang
13832bfe3f2eSlogwang return 0;
13842bfe3f2eSlogwang }
13852bfe3f2eSlogwang
13862bfe3f2eSlogwang static inline uint8_t
rte_eventdev_find_free_device_index(void)13872bfe3f2eSlogwang rte_eventdev_find_free_device_index(void)
13882bfe3f2eSlogwang {
13892bfe3f2eSlogwang uint8_t dev_id;
13902bfe3f2eSlogwang
13912bfe3f2eSlogwang for (dev_id = 0; dev_id < RTE_EVENT_MAX_DEVS; dev_id++) {
13922bfe3f2eSlogwang if (rte_eventdevs[dev_id].attached ==
13932bfe3f2eSlogwang RTE_EVENTDEV_DETACHED)
13942bfe3f2eSlogwang return dev_id;
13952bfe3f2eSlogwang }
13962bfe3f2eSlogwang return RTE_EVENT_MAX_DEVS;
13972bfe3f2eSlogwang }
13982bfe3f2eSlogwang
1399d30ea906Sjfb8856606 static uint16_t
rte_event_tx_adapter_enqueue(__rte_unused void * port,__rte_unused struct rte_event ev[],__rte_unused uint16_t nb_events)1400d30ea906Sjfb8856606 rte_event_tx_adapter_enqueue(__rte_unused void *port,
1401d30ea906Sjfb8856606 __rte_unused struct rte_event ev[],
1402d30ea906Sjfb8856606 __rte_unused uint16_t nb_events)
1403d30ea906Sjfb8856606 {
1404d30ea906Sjfb8856606 rte_errno = ENOTSUP;
1405d30ea906Sjfb8856606 return 0;
1406d30ea906Sjfb8856606 }
1407d30ea906Sjfb8856606
14082bfe3f2eSlogwang struct rte_eventdev *
rte_event_pmd_allocate(const char * name,int socket_id)14092bfe3f2eSlogwang rte_event_pmd_allocate(const char *name, int socket_id)
14102bfe3f2eSlogwang {
14112bfe3f2eSlogwang struct rte_eventdev *eventdev;
14122bfe3f2eSlogwang uint8_t dev_id;
14132bfe3f2eSlogwang
14142bfe3f2eSlogwang if (rte_event_pmd_get_named_dev(name) != NULL) {
14152bfe3f2eSlogwang RTE_EDEV_LOG_ERR("Event device with name %s already "
14162bfe3f2eSlogwang "allocated!", name);
14172bfe3f2eSlogwang return NULL;
14182bfe3f2eSlogwang }
14192bfe3f2eSlogwang
14202bfe3f2eSlogwang dev_id = rte_eventdev_find_free_device_index();
14212bfe3f2eSlogwang if (dev_id == RTE_EVENT_MAX_DEVS) {
14222bfe3f2eSlogwang RTE_EDEV_LOG_ERR("Reached maximum number of event devices");
14232bfe3f2eSlogwang return NULL;
14242bfe3f2eSlogwang }
14252bfe3f2eSlogwang
14262bfe3f2eSlogwang eventdev = &rte_eventdevs[dev_id];
14272bfe3f2eSlogwang
1428d30ea906Sjfb8856606 eventdev->txa_enqueue = rte_event_tx_adapter_enqueue;
14294418919fSjohnjiang eventdev->txa_enqueue_same_dest = rte_event_tx_adapter_enqueue;
1430d30ea906Sjfb8856606
14312bfe3f2eSlogwang if (eventdev->data == NULL) {
14322bfe3f2eSlogwang struct rte_eventdev_data *eventdev_data = NULL;
14332bfe3f2eSlogwang
14342bfe3f2eSlogwang int retval = rte_eventdev_data_alloc(dev_id, &eventdev_data,
14352bfe3f2eSlogwang socket_id);
14362bfe3f2eSlogwang
14372bfe3f2eSlogwang if (retval < 0 || eventdev_data == NULL)
14382bfe3f2eSlogwang return NULL;
14392bfe3f2eSlogwang
14402bfe3f2eSlogwang eventdev->data = eventdev_data;
14412bfe3f2eSlogwang
14420c6bd470Sfengbojiang if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
14430c6bd470Sfengbojiang
14440c6bd470Sfengbojiang strlcpy(eventdev->data->name, name,
14450c6bd470Sfengbojiang RTE_EVENTDEV_NAME_MAX_LEN);
14462bfe3f2eSlogwang
14472bfe3f2eSlogwang eventdev->data->dev_id = dev_id;
14482bfe3f2eSlogwang eventdev->data->socket_id = socket_id;
14492bfe3f2eSlogwang eventdev->data->dev_started = 0;
14500c6bd470Sfengbojiang }
14512bfe3f2eSlogwang
14522bfe3f2eSlogwang eventdev->attached = RTE_EVENTDEV_ATTACHED;
14532bfe3f2eSlogwang eventdev_globals.nb_devs++;
14542bfe3f2eSlogwang }
14552bfe3f2eSlogwang
14562bfe3f2eSlogwang return eventdev;
14572bfe3f2eSlogwang }
14582bfe3f2eSlogwang
14592bfe3f2eSlogwang int
rte_event_pmd_release(struct rte_eventdev * eventdev)14602bfe3f2eSlogwang rte_event_pmd_release(struct rte_eventdev *eventdev)
14612bfe3f2eSlogwang {
14622bfe3f2eSlogwang int ret;
14632bfe3f2eSlogwang char mz_name[RTE_EVENTDEV_NAME_MAX_LEN];
14642bfe3f2eSlogwang const struct rte_memzone *mz;
14652bfe3f2eSlogwang
14662bfe3f2eSlogwang if (eventdev == NULL)
14672bfe3f2eSlogwang return -EINVAL;
14682bfe3f2eSlogwang
14692bfe3f2eSlogwang eventdev->attached = RTE_EVENTDEV_DETACHED;
14702bfe3f2eSlogwang eventdev_globals.nb_devs--;
14712bfe3f2eSlogwang
14722bfe3f2eSlogwang if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
14732bfe3f2eSlogwang rte_free(eventdev->data->dev_private);
14742bfe3f2eSlogwang
14752bfe3f2eSlogwang /* Generate memzone name */
14762bfe3f2eSlogwang ret = snprintf(mz_name, sizeof(mz_name), "rte_eventdev_data_%u",
14772bfe3f2eSlogwang eventdev->data->dev_id);
14782bfe3f2eSlogwang if (ret >= (int)sizeof(mz_name))
14792bfe3f2eSlogwang return -EINVAL;
14802bfe3f2eSlogwang
14812bfe3f2eSlogwang mz = rte_memzone_lookup(mz_name);
14822bfe3f2eSlogwang if (mz == NULL)
14832bfe3f2eSlogwang return -ENOMEM;
14842bfe3f2eSlogwang
14852bfe3f2eSlogwang ret = rte_memzone_free(mz);
14862bfe3f2eSlogwang if (ret)
14872bfe3f2eSlogwang return ret;
14882bfe3f2eSlogwang }
14892bfe3f2eSlogwang
14902bfe3f2eSlogwang eventdev->data = NULL;
14912bfe3f2eSlogwang return 0;
14922bfe3f2eSlogwang }
1493*2d9fd380Sjfb8856606
1494*2d9fd380Sjfb8856606
1495*2d9fd380Sjfb8856606 static int
handle_dev_list(const char * cmd __rte_unused,const char * params __rte_unused,struct rte_tel_data * d)1496*2d9fd380Sjfb8856606 handle_dev_list(const char *cmd __rte_unused,
1497*2d9fd380Sjfb8856606 const char *params __rte_unused,
1498*2d9fd380Sjfb8856606 struct rte_tel_data *d)
1499*2d9fd380Sjfb8856606 {
1500*2d9fd380Sjfb8856606 uint8_t dev_id;
1501*2d9fd380Sjfb8856606 int ndev = rte_event_dev_count();
1502*2d9fd380Sjfb8856606
1503*2d9fd380Sjfb8856606 if (ndev < 1)
1504*2d9fd380Sjfb8856606 return -1;
1505*2d9fd380Sjfb8856606
1506*2d9fd380Sjfb8856606 rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
1507*2d9fd380Sjfb8856606 for (dev_id = 0; dev_id < RTE_EVENT_MAX_DEVS; dev_id++) {
1508*2d9fd380Sjfb8856606 if (rte_eventdevs[dev_id].attached ==
1509*2d9fd380Sjfb8856606 RTE_EVENTDEV_ATTACHED)
1510*2d9fd380Sjfb8856606 rte_tel_data_add_array_int(d, dev_id);
1511*2d9fd380Sjfb8856606 }
1512*2d9fd380Sjfb8856606
1513*2d9fd380Sjfb8856606 return 0;
1514*2d9fd380Sjfb8856606 }
1515*2d9fd380Sjfb8856606
1516*2d9fd380Sjfb8856606 static int
handle_port_list(const char * cmd __rte_unused,const char * params,struct rte_tel_data * d)1517*2d9fd380Sjfb8856606 handle_port_list(const char *cmd __rte_unused,
1518*2d9fd380Sjfb8856606 const char *params,
1519*2d9fd380Sjfb8856606 struct rte_tel_data *d)
1520*2d9fd380Sjfb8856606 {
1521*2d9fd380Sjfb8856606 int i;
1522*2d9fd380Sjfb8856606 uint8_t dev_id;
1523*2d9fd380Sjfb8856606 struct rte_eventdev *dev;
1524*2d9fd380Sjfb8856606 char *end_param;
1525*2d9fd380Sjfb8856606
1526*2d9fd380Sjfb8856606 if (params == NULL || strlen(params) == 0 || !isdigit(*params))
1527*2d9fd380Sjfb8856606 return -1;
1528*2d9fd380Sjfb8856606
1529*2d9fd380Sjfb8856606 dev_id = strtoul(params, &end_param, 10);
1530*2d9fd380Sjfb8856606 if (*end_param != '\0')
1531*2d9fd380Sjfb8856606 RTE_EDEV_LOG_DEBUG(
1532*2d9fd380Sjfb8856606 "Extra parameters passed to eventdev telemetry command, ignoring");
1533*2d9fd380Sjfb8856606
1534*2d9fd380Sjfb8856606 RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
1535*2d9fd380Sjfb8856606 dev = &rte_eventdevs[dev_id];
1536*2d9fd380Sjfb8856606
1537*2d9fd380Sjfb8856606 rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
1538*2d9fd380Sjfb8856606 for (i = 0; i < dev->data->nb_ports; i++)
1539*2d9fd380Sjfb8856606 rte_tel_data_add_array_int(d, i);
1540*2d9fd380Sjfb8856606
1541*2d9fd380Sjfb8856606 return 0;
1542*2d9fd380Sjfb8856606 }
1543*2d9fd380Sjfb8856606
1544*2d9fd380Sjfb8856606 static int
handle_queue_list(const char * cmd __rte_unused,const char * params,struct rte_tel_data * d)1545*2d9fd380Sjfb8856606 handle_queue_list(const char *cmd __rte_unused,
1546*2d9fd380Sjfb8856606 const char *params,
1547*2d9fd380Sjfb8856606 struct rte_tel_data *d)
1548*2d9fd380Sjfb8856606 {
1549*2d9fd380Sjfb8856606 int i;
1550*2d9fd380Sjfb8856606 uint8_t dev_id;
1551*2d9fd380Sjfb8856606 struct rte_eventdev *dev;
1552*2d9fd380Sjfb8856606 char *end_param;
1553*2d9fd380Sjfb8856606
1554*2d9fd380Sjfb8856606 if (params == NULL || strlen(params) == 0 || !isdigit(*params))
1555*2d9fd380Sjfb8856606 return -1;
1556*2d9fd380Sjfb8856606
1557*2d9fd380Sjfb8856606 dev_id = strtoul(params, &end_param, 10);
1558*2d9fd380Sjfb8856606 if (*end_param != '\0')
1559*2d9fd380Sjfb8856606 RTE_EDEV_LOG_DEBUG(
1560*2d9fd380Sjfb8856606 "Extra parameters passed to eventdev telemetry command, ignoring");
1561*2d9fd380Sjfb8856606
1562*2d9fd380Sjfb8856606 RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
1563*2d9fd380Sjfb8856606 dev = &rte_eventdevs[dev_id];
1564*2d9fd380Sjfb8856606
1565*2d9fd380Sjfb8856606 rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
1566*2d9fd380Sjfb8856606 for (i = 0; i < dev->data->nb_queues; i++)
1567*2d9fd380Sjfb8856606 rte_tel_data_add_array_int(d, i);
1568*2d9fd380Sjfb8856606
1569*2d9fd380Sjfb8856606 return 0;
1570*2d9fd380Sjfb8856606 }
1571*2d9fd380Sjfb8856606
1572*2d9fd380Sjfb8856606 static int
handle_queue_links(const char * cmd __rte_unused,const char * params,struct rte_tel_data * d)1573*2d9fd380Sjfb8856606 handle_queue_links(const char *cmd __rte_unused,
1574*2d9fd380Sjfb8856606 const char *params,
1575*2d9fd380Sjfb8856606 struct rte_tel_data *d)
1576*2d9fd380Sjfb8856606 {
1577*2d9fd380Sjfb8856606 int i, ret, port_id = 0;
1578*2d9fd380Sjfb8856606 char *end_param;
1579*2d9fd380Sjfb8856606 uint8_t dev_id;
1580*2d9fd380Sjfb8856606 uint8_t queues[RTE_EVENT_MAX_QUEUES_PER_DEV];
1581*2d9fd380Sjfb8856606 uint8_t priorities[RTE_EVENT_MAX_QUEUES_PER_DEV];
1582*2d9fd380Sjfb8856606 const char *p_param;
1583*2d9fd380Sjfb8856606
1584*2d9fd380Sjfb8856606 if (params == NULL || strlen(params) == 0 || !isdigit(*params))
1585*2d9fd380Sjfb8856606 return -1;
1586*2d9fd380Sjfb8856606
1587*2d9fd380Sjfb8856606 /* Get dev ID from parameter string */
1588*2d9fd380Sjfb8856606 dev_id = strtoul(params, &end_param, 10);
1589*2d9fd380Sjfb8856606 RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
1590*2d9fd380Sjfb8856606
1591*2d9fd380Sjfb8856606 p_param = strtok(end_param, ",");
1592*2d9fd380Sjfb8856606 if (p_param == NULL || strlen(p_param) == 0 || !isdigit(*p_param))
1593*2d9fd380Sjfb8856606 return -1;
1594*2d9fd380Sjfb8856606
1595*2d9fd380Sjfb8856606 port_id = strtoul(p_param, &end_param, 10);
1596*2d9fd380Sjfb8856606 p_param = strtok(NULL, "\0");
1597*2d9fd380Sjfb8856606 if (p_param != NULL)
1598*2d9fd380Sjfb8856606 RTE_EDEV_LOG_DEBUG(
1599*2d9fd380Sjfb8856606 "Extra parameters passed to eventdev telemetry command, ignoring");
1600*2d9fd380Sjfb8856606
1601*2d9fd380Sjfb8856606 ret = rte_event_port_links_get(dev_id, port_id, queues, priorities);
1602*2d9fd380Sjfb8856606 if (ret < 0)
1603*2d9fd380Sjfb8856606 return -1;
1604*2d9fd380Sjfb8856606
1605*2d9fd380Sjfb8856606 rte_tel_data_start_dict(d);
1606*2d9fd380Sjfb8856606 for (i = 0; i < ret; i++) {
1607*2d9fd380Sjfb8856606 char qid_name[32];
1608*2d9fd380Sjfb8856606
1609*2d9fd380Sjfb8856606 snprintf(qid_name, 31, "qid_%u", queues[i]);
1610*2d9fd380Sjfb8856606 rte_tel_data_add_dict_u64(d, qid_name, priorities[i]);
1611*2d9fd380Sjfb8856606 }
1612*2d9fd380Sjfb8856606
1613*2d9fd380Sjfb8856606 return 0;
1614*2d9fd380Sjfb8856606 }
1615*2d9fd380Sjfb8856606
1616*2d9fd380Sjfb8856606 static int
eventdev_build_telemetry_data(int dev_id,enum rte_event_dev_xstats_mode mode,int port_queue_id,struct rte_tel_data * d)1617*2d9fd380Sjfb8856606 eventdev_build_telemetry_data(int dev_id,
1618*2d9fd380Sjfb8856606 enum rte_event_dev_xstats_mode mode,
1619*2d9fd380Sjfb8856606 int port_queue_id,
1620*2d9fd380Sjfb8856606 struct rte_tel_data *d)
1621*2d9fd380Sjfb8856606 {
1622*2d9fd380Sjfb8856606 struct rte_event_dev_xstats_name *xstat_names;
1623*2d9fd380Sjfb8856606 unsigned int *ids;
1624*2d9fd380Sjfb8856606 uint64_t *values;
1625*2d9fd380Sjfb8856606 int i, ret, num_xstats;
1626*2d9fd380Sjfb8856606
1627*2d9fd380Sjfb8856606 num_xstats = rte_event_dev_xstats_names_get(dev_id,
1628*2d9fd380Sjfb8856606 mode,
1629*2d9fd380Sjfb8856606 port_queue_id,
1630*2d9fd380Sjfb8856606 NULL,
1631*2d9fd380Sjfb8856606 NULL,
1632*2d9fd380Sjfb8856606 0);
1633*2d9fd380Sjfb8856606
1634*2d9fd380Sjfb8856606 if (num_xstats < 0)
1635*2d9fd380Sjfb8856606 return -1;
1636*2d9fd380Sjfb8856606
1637*2d9fd380Sjfb8856606 /* use one malloc for names */
1638*2d9fd380Sjfb8856606 xstat_names = malloc((sizeof(struct rte_event_dev_xstats_name))
1639*2d9fd380Sjfb8856606 * num_xstats);
1640*2d9fd380Sjfb8856606 if (xstat_names == NULL)
1641*2d9fd380Sjfb8856606 return -1;
1642*2d9fd380Sjfb8856606
1643*2d9fd380Sjfb8856606 ids = malloc((sizeof(unsigned int)) * num_xstats);
1644*2d9fd380Sjfb8856606 if (ids == NULL) {
1645*2d9fd380Sjfb8856606 free(xstat_names);
1646*2d9fd380Sjfb8856606 return -1;
1647*2d9fd380Sjfb8856606 }
1648*2d9fd380Sjfb8856606
1649*2d9fd380Sjfb8856606 values = malloc((sizeof(uint64_t)) * num_xstats);
1650*2d9fd380Sjfb8856606 if (values == NULL) {
1651*2d9fd380Sjfb8856606 free(xstat_names);
1652*2d9fd380Sjfb8856606 free(ids);
1653*2d9fd380Sjfb8856606 return -1;
1654*2d9fd380Sjfb8856606 }
1655*2d9fd380Sjfb8856606
1656*2d9fd380Sjfb8856606 ret = rte_event_dev_xstats_names_get(dev_id, mode, port_queue_id,
1657*2d9fd380Sjfb8856606 xstat_names, ids, num_xstats);
1658*2d9fd380Sjfb8856606 if (ret < 0 || ret > num_xstats) {
1659*2d9fd380Sjfb8856606 free(xstat_names);
1660*2d9fd380Sjfb8856606 free(ids);
1661*2d9fd380Sjfb8856606 free(values);
1662*2d9fd380Sjfb8856606 return -1;
1663*2d9fd380Sjfb8856606 }
1664*2d9fd380Sjfb8856606
1665*2d9fd380Sjfb8856606 ret = rte_event_dev_xstats_get(dev_id, mode, port_queue_id,
1666*2d9fd380Sjfb8856606 ids, values, num_xstats);
1667*2d9fd380Sjfb8856606 if (ret < 0 || ret > num_xstats) {
1668*2d9fd380Sjfb8856606 free(xstat_names);
1669*2d9fd380Sjfb8856606 free(ids);
1670*2d9fd380Sjfb8856606 free(values);
1671*2d9fd380Sjfb8856606 return -1;
1672*2d9fd380Sjfb8856606 }
1673*2d9fd380Sjfb8856606
1674*2d9fd380Sjfb8856606 rte_tel_data_start_dict(d);
1675*2d9fd380Sjfb8856606 for (i = 0; i < num_xstats; i++)
1676*2d9fd380Sjfb8856606 rte_tel_data_add_dict_u64(d, xstat_names[i].name,
1677*2d9fd380Sjfb8856606 values[i]);
1678*2d9fd380Sjfb8856606
1679*2d9fd380Sjfb8856606 free(xstat_names);
1680*2d9fd380Sjfb8856606 free(ids);
1681*2d9fd380Sjfb8856606 free(values);
1682*2d9fd380Sjfb8856606 return 0;
1683*2d9fd380Sjfb8856606 }
1684*2d9fd380Sjfb8856606
1685*2d9fd380Sjfb8856606 static int
handle_dev_xstats(const char * cmd __rte_unused,const char * params,struct rte_tel_data * d)1686*2d9fd380Sjfb8856606 handle_dev_xstats(const char *cmd __rte_unused,
1687*2d9fd380Sjfb8856606 const char *params,
1688*2d9fd380Sjfb8856606 struct rte_tel_data *d)
1689*2d9fd380Sjfb8856606 {
1690*2d9fd380Sjfb8856606 int dev_id;
1691*2d9fd380Sjfb8856606 enum rte_event_dev_xstats_mode mode;
1692*2d9fd380Sjfb8856606 char *end_param;
1693*2d9fd380Sjfb8856606
1694*2d9fd380Sjfb8856606 if (params == NULL || strlen(params) == 0 || !isdigit(*params))
1695*2d9fd380Sjfb8856606 return -1;
1696*2d9fd380Sjfb8856606
1697*2d9fd380Sjfb8856606 /* Get dev ID from parameter string */
1698*2d9fd380Sjfb8856606 dev_id = strtoul(params, &end_param, 10);
1699*2d9fd380Sjfb8856606 if (*end_param != '\0')
1700*2d9fd380Sjfb8856606 RTE_EDEV_LOG_DEBUG(
1701*2d9fd380Sjfb8856606 "Extra parameters passed to eventdev telemetry command, ignoring");
1702*2d9fd380Sjfb8856606
1703*2d9fd380Sjfb8856606 RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
1704*2d9fd380Sjfb8856606
1705*2d9fd380Sjfb8856606 mode = RTE_EVENT_DEV_XSTATS_DEVICE;
1706*2d9fd380Sjfb8856606 return eventdev_build_telemetry_data(dev_id, mode, 0, d);
1707*2d9fd380Sjfb8856606 }
1708*2d9fd380Sjfb8856606
1709*2d9fd380Sjfb8856606 static int
handle_port_xstats(const char * cmd __rte_unused,const char * params,struct rte_tel_data * d)1710*2d9fd380Sjfb8856606 handle_port_xstats(const char *cmd __rte_unused,
1711*2d9fd380Sjfb8856606 const char *params,
1712*2d9fd380Sjfb8856606 struct rte_tel_data *d)
1713*2d9fd380Sjfb8856606 {
1714*2d9fd380Sjfb8856606 int dev_id;
1715*2d9fd380Sjfb8856606 int port_queue_id = 0;
1716*2d9fd380Sjfb8856606 enum rte_event_dev_xstats_mode mode;
1717*2d9fd380Sjfb8856606 char *end_param;
1718*2d9fd380Sjfb8856606 const char *p_param;
1719*2d9fd380Sjfb8856606
1720*2d9fd380Sjfb8856606 if (params == NULL || strlen(params) == 0 || !isdigit(*params))
1721*2d9fd380Sjfb8856606 return -1;
1722*2d9fd380Sjfb8856606
1723*2d9fd380Sjfb8856606 /* Get dev ID from parameter string */
1724*2d9fd380Sjfb8856606 dev_id = strtoul(params, &end_param, 10);
1725*2d9fd380Sjfb8856606 RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
1726*2d9fd380Sjfb8856606
1727*2d9fd380Sjfb8856606 p_param = strtok(end_param, ",");
1728*2d9fd380Sjfb8856606 mode = RTE_EVENT_DEV_XSTATS_PORT;
1729*2d9fd380Sjfb8856606
1730*2d9fd380Sjfb8856606 if (p_param == NULL || strlen(p_param) == 0 || !isdigit(*p_param))
1731*2d9fd380Sjfb8856606 return -1;
1732*2d9fd380Sjfb8856606
1733*2d9fd380Sjfb8856606 port_queue_id = strtoul(p_param, &end_param, 10);
1734*2d9fd380Sjfb8856606
1735*2d9fd380Sjfb8856606 p_param = strtok(NULL, "\0");
1736*2d9fd380Sjfb8856606 if (p_param != NULL)
1737*2d9fd380Sjfb8856606 RTE_EDEV_LOG_DEBUG(
1738*2d9fd380Sjfb8856606 "Extra parameters passed to eventdev telemetry command, ignoring");
1739*2d9fd380Sjfb8856606
1740*2d9fd380Sjfb8856606 return eventdev_build_telemetry_data(dev_id, mode, port_queue_id, d);
1741*2d9fd380Sjfb8856606 }
1742*2d9fd380Sjfb8856606
1743*2d9fd380Sjfb8856606 static int
handle_queue_xstats(const char * cmd __rte_unused,const char * params,struct rte_tel_data * d)1744*2d9fd380Sjfb8856606 handle_queue_xstats(const char *cmd __rte_unused,
1745*2d9fd380Sjfb8856606 const char *params,
1746*2d9fd380Sjfb8856606 struct rte_tel_data *d)
1747*2d9fd380Sjfb8856606 {
1748*2d9fd380Sjfb8856606 int dev_id;
1749*2d9fd380Sjfb8856606 int port_queue_id = 0;
1750*2d9fd380Sjfb8856606 enum rte_event_dev_xstats_mode mode;
1751*2d9fd380Sjfb8856606 char *end_param;
1752*2d9fd380Sjfb8856606 const char *p_param;
1753*2d9fd380Sjfb8856606
1754*2d9fd380Sjfb8856606 if (params == NULL || strlen(params) == 0 || !isdigit(*params))
1755*2d9fd380Sjfb8856606 return -1;
1756*2d9fd380Sjfb8856606
1757*2d9fd380Sjfb8856606 /* Get dev ID from parameter string */
1758*2d9fd380Sjfb8856606 dev_id = strtoul(params, &end_param, 10);
1759*2d9fd380Sjfb8856606 RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
1760*2d9fd380Sjfb8856606
1761*2d9fd380Sjfb8856606 p_param = strtok(end_param, ",");
1762*2d9fd380Sjfb8856606 mode = RTE_EVENT_DEV_XSTATS_QUEUE;
1763*2d9fd380Sjfb8856606
1764*2d9fd380Sjfb8856606 if (p_param == NULL || strlen(p_param) == 0 || !isdigit(*p_param))
1765*2d9fd380Sjfb8856606 return -1;
1766*2d9fd380Sjfb8856606
1767*2d9fd380Sjfb8856606 port_queue_id = strtoul(p_param, &end_param, 10);
1768*2d9fd380Sjfb8856606
1769*2d9fd380Sjfb8856606 p_param = strtok(NULL, "\0");
1770*2d9fd380Sjfb8856606 if (p_param != NULL)
1771*2d9fd380Sjfb8856606 RTE_EDEV_LOG_DEBUG(
1772*2d9fd380Sjfb8856606 "Extra parameters passed to eventdev telemetry command, ignoring");
1773*2d9fd380Sjfb8856606
1774*2d9fd380Sjfb8856606 return eventdev_build_telemetry_data(dev_id, mode, port_queue_id, d);
1775*2d9fd380Sjfb8856606 }
1776*2d9fd380Sjfb8856606
RTE_INIT(eventdev_init_telemetry)1777*2d9fd380Sjfb8856606 RTE_INIT(eventdev_init_telemetry)
1778*2d9fd380Sjfb8856606 {
1779*2d9fd380Sjfb8856606 rte_telemetry_register_cmd("/eventdev/dev_list", handle_dev_list,
1780*2d9fd380Sjfb8856606 "Returns list of available eventdevs. Takes no parameters");
1781*2d9fd380Sjfb8856606 rte_telemetry_register_cmd("/eventdev/port_list", handle_port_list,
1782*2d9fd380Sjfb8856606 "Returns list of available ports. Parameter: DevID");
1783*2d9fd380Sjfb8856606 rte_telemetry_register_cmd("/eventdev/queue_list", handle_queue_list,
1784*2d9fd380Sjfb8856606 "Returns list of available queues. Parameter: DevID");
1785*2d9fd380Sjfb8856606
1786*2d9fd380Sjfb8856606 rte_telemetry_register_cmd("/eventdev/dev_xstats", handle_dev_xstats,
1787*2d9fd380Sjfb8856606 "Returns stats for an eventdev. Parameter: DevID");
1788*2d9fd380Sjfb8856606 rte_telemetry_register_cmd("/eventdev/port_xstats", handle_port_xstats,
1789*2d9fd380Sjfb8856606 "Returns stats for an eventdev port. Params: DevID,PortID");
1790*2d9fd380Sjfb8856606 rte_telemetry_register_cmd("/eventdev/queue_xstats",
1791*2d9fd380Sjfb8856606 handle_queue_xstats,
1792*2d9fd380Sjfb8856606 "Returns stats for an eventdev queue. Params: DevID,QueueID");
1793*2d9fd380Sjfb8856606 rte_telemetry_register_cmd("/eventdev/queue_links", handle_queue_links,
1794*2d9fd380Sjfb8856606 "Returns links for an eventdev port. Params: DevID,QueueID");
1795*2d9fd380Sjfb8856606 }
1796