1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606 * Copyright(c) 2016 Cavium, Inc
32bfe3f2eSlogwang */
42bfe3f2eSlogwang
52bfe3f2eSlogwang #include <assert.h>
62bfe3f2eSlogwang #include <stdio.h>
72bfe3f2eSlogwang #include <stdbool.h>
82bfe3f2eSlogwang #include <errno.h>
92bfe3f2eSlogwang #include <stdint.h>
102bfe3f2eSlogwang #include <string.h>
112bfe3f2eSlogwang
122bfe3f2eSlogwang #include <rte_byteorder.h>
132bfe3f2eSlogwang #include <rte_common.h>
142bfe3f2eSlogwang #include <rte_debug.h>
152bfe3f2eSlogwang #include <rte_dev.h>
162bfe3f2eSlogwang #include <rte_eal.h>
172bfe3f2eSlogwang #include <rte_log.h>
182bfe3f2eSlogwang #include <rte_malloc.h>
192bfe3f2eSlogwang #include <rte_memory.h>
202bfe3f2eSlogwang #include <rte_lcore.h>
212bfe3f2eSlogwang #include <rte_bus_vdev.h>
222bfe3f2eSlogwang
232bfe3f2eSlogwang #include "skeleton_eventdev.h"
242bfe3f2eSlogwang
252bfe3f2eSlogwang #define EVENTDEV_NAME_SKELETON_PMD event_skeleton
262bfe3f2eSlogwang /**< Skeleton event device PMD name */
272bfe3f2eSlogwang
282bfe3f2eSlogwang static uint16_t
skeleton_eventdev_enqueue(void * port,const struct rte_event * ev)292bfe3f2eSlogwang skeleton_eventdev_enqueue(void *port, const struct rte_event *ev)
302bfe3f2eSlogwang {
312bfe3f2eSlogwang struct skeleton_port *sp = port;
322bfe3f2eSlogwang
332bfe3f2eSlogwang RTE_SET_USED(sp);
342bfe3f2eSlogwang RTE_SET_USED(ev);
352bfe3f2eSlogwang RTE_SET_USED(port);
362bfe3f2eSlogwang
372bfe3f2eSlogwang return 0;
382bfe3f2eSlogwang }
392bfe3f2eSlogwang
402bfe3f2eSlogwang static uint16_t
skeleton_eventdev_enqueue_burst(void * port,const struct rte_event ev[],uint16_t nb_events)412bfe3f2eSlogwang skeleton_eventdev_enqueue_burst(void *port, const struct rte_event ev[],
422bfe3f2eSlogwang uint16_t nb_events)
432bfe3f2eSlogwang {
442bfe3f2eSlogwang struct skeleton_port *sp = port;
452bfe3f2eSlogwang
462bfe3f2eSlogwang RTE_SET_USED(sp);
472bfe3f2eSlogwang RTE_SET_USED(ev);
482bfe3f2eSlogwang RTE_SET_USED(port);
492bfe3f2eSlogwang RTE_SET_USED(nb_events);
502bfe3f2eSlogwang
512bfe3f2eSlogwang return 0;
522bfe3f2eSlogwang }
532bfe3f2eSlogwang
542bfe3f2eSlogwang static uint16_t
skeleton_eventdev_dequeue(void * port,struct rte_event * ev,uint64_t timeout_ticks)552bfe3f2eSlogwang skeleton_eventdev_dequeue(void *port, struct rte_event *ev,
562bfe3f2eSlogwang uint64_t timeout_ticks)
572bfe3f2eSlogwang {
582bfe3f2eSlogwang struct skeleton_port *sp = port;
592bfe3f2eSlogwang
602bfe3f2eSlogwang RTE_SET_USED(sp);
612bfe3f2eSlogwang RTE_SET_USED(ev);
622bfe3f2eSlogwang RTE_SET_USED(timeout_ticks);
632bfe3f2eSlogwang
642bfe3f2eSlogwang return 0;
652bfe3f2eSlogwang }
662bfe3f2eSlogwang
672bfe3f2eSlogwang static uint16_t
skeleton_eventdev_dequeue_burst(void * port,struct rte_event ev[],uint16_t nb_events,uint64_t timeout_ticks)682bfe3f2eSlogwang skeleton_eventdev_dequeue_burst(void *port, struct rte_event ev[],
692bfe3f2eSlogwang uint16_t nb_events, uint64_t timeout_ticks)
702bfe3f2eSlogwang {
712bfe3f2eSlogwang struct skeleton_port *sp = port;
722bfe3f2eSlogwang
732bfe3f2eSlogwang RTE_SET_USED(sp);
742bfe3f2eSlogwang RTE_SET_USED(ev);
752bfe3f2eSlogwang RTE_SET_USED(nb_events);
762bfe3f2eSlogwang RTE_SET_USED(timeout_ticks);
772bfe3f2eSlogwang
782bfe3f2eSlogwang return 0;
792bfe3f2eSlogwang }
802bfe3f2eSlogwang
812bfe3f2eSlogwang static void
skeleton_eventdev_info_get(struct rte_eventdev * dev,struct rte_event_dev_info * dev_info)822bfe3f2eSlogwang skeleton_eventdev_info_get(struct rte_eventdev *dev,
832bfe3f2eSlogwang struct rte_event_dev_info *dev_info)
842bfe3f2eSlogwang {
852bfe3f2eSlogwang struct skeleton_eventdev *skel = skeleton_pmd_priv(dev);
862bfe3f2eSlogwang
872bfe3f2eSlogwang PMD_DRV_FUNC_TRACE();
882bfe3f2eSlogwang
892bfe3f2eSlogwang RTE_SET_USED(skel);
902bfe3f2eSlogwang
912bfe3f2eSlogwang dev_info->min_dequeue_timeout_ns = 1;
922bfe3f2eSlogwang dev_info->max_dequeue_timeout_ns = 10000;
932bfe3f2eSlogwang dev_info->dequeue_timeout_ns = 25;
942bfe3f2eSlogwang dev_info->max_event_queues = 64;
952bfe3f2eSlogwang dev_info->max_event_queue_flows = (1ULL << 20);
962bfe3f2eSlogwang dev_info->max_event_queue_priority_levels = 8;
972bfe3f2eSlogwang dev_info->max_event_priority_levels = 8;
982bfe3f2eSlogwang dev_info->max_event_ports = 32;
992bfe3f2eSlogwang dev_info->max_event_port_dequeue_depth = 16;
1002bfe3f2eSlogwang dev_info->max_event_port_enqueue_depth = 16;
1012bfe3f2eSlogwang dev_info->max_num_events = (1ULL << 20);
1022bfe3f2eSlogwang dev_info->event_dev_cap = RTE_EVENT_DEV_CAP_QUEUE_QOS |
1032bfe3f2eSlogwang RTE_EVENT_DEV_CAP_BURST_MODE |
104*2d9fd380Sjfb8856606 RTE_EVENT_DEV_CAP_EVENT_QOS |
105*2d9fd380Sjfb8856606 RTE_EVENT_DEV_CAP_CARRY_FLOW_ID;
1062bfe3f2eSlogwang }
1072bfe3f2eSlogwang
1082bfe3f2eSlogwang static int
skeleton_eventdev_configure(const struct rte_eventdev * dev)1092bfe3f2eSlogwang skeleton_eventdev_configure(const struct rte_eventdev *dev)
1102bfe3f2eSlogwang {
1112bfe3f2eSlogwang struct rte_eventdev_data *data = dev->data;
1122bfe3f2eSlogwang struct rte_event_dev_config *conf = &data->dev_conf;
1132bfe3f2eSlogwang struct skeleton_eventdev *skel = skeleton_pmd_priv(dev);
1142bfe3f2eSlogwang
1152bfe3f2eSlogwang PMD_DRV_FUNC_TRACE();
1162bfe3f2eSlogwang
1172bfe3f2eSlogwang RTE_SET_USED(conf);
1182bfe3f2eSlogwang RTE_SET_USED(skel);
1192bfe3f2eSlogwang
1202bfe3f2eSlogwang PMD_DRV_LOG(DEBUG, "Configured eventdev devid=%d", dev->data->dev_id);
1212bfe3f2eSlogwang return 0;
1222bfe3f2eSlogwang }
1232bfe3f2eSlogwang
1242bfe3f2eSlogwang static int
skeleton_eventdev_start(struct rte_eventdev * dev)1252bfe3f2eSlogwang skeleton_eventdev_start(struct rte_eventdev *dev)
1262bfe3f2eSlogwang {
1272bfe3f2eSlogwang struct skeleton_eventdev *skel = skeleton_pmd_priv(dev);
1282bfe3f2eSlogwang
1292bfe3f2eSlogwang PMD_DRV_FUNC_TRACE();
1302bfe3f2eSlogwang
1312bfe3f2eSlogwang RTE_SET_USED(skel);
1322bfe3f2eSlogwang
1332bfe3f2eSlogwang return 0;
1342bfe3f2eSlogwang }
1352bfe3f2eSlogwang
1362bfe3f2eSlogwang static void
skeleton_eventdev_stop(struct rte_eventdev * dev)1372bfe3f2eSlogwang skeleton_eventdev_stop(struct rte_eventdev *dev)
1382bfe3f2eSlogwang {
1392bfe3f2eSlogwang struct skeleton_eventdev *skel = skeleton_pmd_priv(dev);
1402bfe3f2eSlogwang
1412bfe3f2eSlogwang PMD_DRV_FUNC_TRACE();
1422bfe3f2eSlogwang
1432bfe3f2eSlogwang RTE_SET_USED(skel);
1442bfe3f2eSlogwang }
1452bfe3f2eSlogwang
1462bfe3f2eSlogwang static int
skeleton_eventdev_close(struct rte_eventdev * dev)1472bfe3f2eSlogwang skeleton_eventdev_close(struct rte_eventdev *dev)
1482bfe3f2eSlogwang {
1492bfe3f2eSlogwang struct skeleton_eventdev *skel = skeleton_pmd_priv(dev);
1502bfe3f2eSlogwang
1512bfe3f2eSlogwang PMD_DRV_FUNC_TRACE();
1522bfe3f2eSlogwang
1532bfe3f2eSlogwang RTE_SET_USED(skel);
1542bfe3f2eSlogwang
1552bfe3f2eSlogwang return 0;
1562bfe3f2eSlogwang }
1572bfe3f2eSlogwang
1582bfe3f2eSlogwang static void
skeleton_eventdev_queue_def_conf(struct rte_eventdev * dev,uint8_t queue_id,struct rte_event_queue_conf * queue_conf)1592bfe3f2eSlogwang skeleton_eventdev_queue_def_conf(struct rte_eventdev *dev, uint8_t queue_id,
1602bfe3f2eSlogwang struct rte_event_queue_conf *queue_conf)
1612bfe3f2eSlogwang {
1622bfe3f2eSlogwang struct skeleton_eventdev *skel = skeleton_pmd_priv(dev);
1632bfe3f2eSlogwang
1642bfe3f2eSlogwang PMD_DRV_FUNC_TRACE();
1652bfe3f2eSlogwang
1662bfe3f2eSlogwang RTE_SET_USED(skel);
1672bfe3f2eSlogwang RTE_SET_USED(queue_id);
1682bfe3f2eSlogwang
1692bfe3f2eSlogwang queue_conf->nb_atomic_flows = (1ULL << 20);
1702bfe3f2eSlogwang queue_conf->nb_atomic_order_sequences = (1ULL << 20);
1712bfe3f2eSlogwang queue_conf->event_queue_cfg = RTE_EVENT_QUEUE_CFG_ALL_TYPES;
1722bfe3f2eSlogwang queue_conf->priority = RTE_EVENT_DEV_PRIORITY_NORMAL;
1732bfe3f2eSlogwang }
1742bfe3f2eSlogwang
1752bfe3f2eSlogwang static void
skeleton_eventdev_queue_release(struct rte_eventdev * dev,uint8_t queue_id)1762bfe3f2eSlogwang skeleton_eventdev_queue_release(struct rte_eventdev *dev, uint8_t queue_id)
1772bfe3f2eSlogwang {
1782bfe3f2eSlogwang PMD_DRV_FUNC_TRACE();
1792bfe3f2eSlogwang
1802bfe3f2eSlogwang RTE_SET_USED(dev);
1812bfe3f2eSlogwang RTE_SET_USED(queue_id);
1822bfe3f2eSlogwang }
1832bfe3f2eSlogwang
1842bfe3f2eSlogwang static int
skeleton_eventdev_queue_setup(struct rte_eventdev * dev,uint8_t queue_id,const struct rte_event_queue_conf * queue_conf)1852bfe3f2eSlogwang skeleton_eventdev_queue_setup(struct rte_eventdev *dev, uint8_t queue_id,
1862bfe3f2eSlogwang const struct rte_event_queue_conf *queue_conf)
1872bfe3f2eSlogwang {
1882bfe3f2eSlogwang struct skeleton_eventdev *skel = skeleton_pmd_priv(dev);
1892bfe3f2eSlogwang
1902bfe3f2eSlogwang PMD_DRV_FUNC_TRACE();
1912bfe3f2eSlogwang
1922bfe3f2eSlogwang RTE_SET_USED(skel);
1932bfe3f2eSlogwang RTE_SET_USED(queue_conf);
1942bfe3f2eSlogwang RTE_SET_USED(queue_id);
1952bfe3f2eSlogwang
1962bfe3f2eSlogwang return 0;
1972bfe3f2eSlogwang }
1982bfe3f2eSlogwang
1992bfe3f2eSlogwang static void
skeleton_eventdev_port_def_conf(struct rte_eventdev * dev,uint8_t port_id,struct rte_event_port_conf * port_conf)2002bfe3f2eSlogwang skeleton_eventdev_port_def_conf(struct rte_eventdev *dev, uint8_t port_id,
2012bfe3f2eSlogwang struct rte_event_port_conf *port_conf)
2022bfe3f2eSlogwang {
2032bfe3f2eSlogwang struct skeleton_eventdev *skel = skeleton_pmd_priv(dev);
2042bfe3f2eSlogwang
2052bfe3f2eSlogwang PMD_DRV_FUNC_TRACE();
2062bfe3f2eSlogwang
2072bfe3f2eSlogwang RTE_SET_USED(skel);
2082bfe3f2eSlogwang RTE_SET_USED(port_id);
2092bfe3f2eSlogwang
2102bfe3f2eSlogwang port_conf->new_event_threshold = 32 * 1024;
2112bfe3f2eSlogwang port_conf->dequeue_depth = 16;
2122bfe3f2eSlogwang port_conf->enqueue_depth = 16;
213*2d9fd380Sjfb8856606 port_conf->event_port_cfg = 0;
2142bfe3f2eSlogwang }
2152bfe3f2eSlogwang
2162bfe3f2eSlogwang static void
skeleton_eventdev_port_release(void * port)2172bfe3f2eSlogwang skeleton_eventdev_port_release(void *port)
2182bfe3f2eSlogwang {
2192bfe3f2eSlogwang struct skeleton_port *sp = port;
2202bfe3f2eSlogwang PMD_DRV_FUNC_TRACE();
2212bfe3f2eSlogwang
2222bfe3f2eSlogwang rte_free(sp);
2232bfe3f2eSlogwang }
2242bfe3f2eSlogwang
2252bfe3f2eSlogwang static int
skeleton_eventdev_port_setup(struct rte_eventdev * dev,uint8_t port_id,const struct rte_event_port_conf * port_conf)2262bfe3f2eSlogwang skeleton_eventdev_port_setup(struct rte_eventdev *dev, uint8_t port_id,
2272bfe3f2eSlogwang const struct rte_event_port_conf *port_conf)
2282bfe3f2eSlogwang {
2292bfe3f2eSlogwang struct skeleton_port *sp;
2302bfe3f2eSlogwang struct skeleton_eventdev *skel = skeleton_pmd_priv(dev);
2312bfe3f2eSlogwang
2322bfe3f2eSlogwang PMD_DRV_FUNC_TRACE();
2332bfe3f2eSlogwang
2342bfe3f2eSlogwang RTE_SET_USED(skel);
2352bfe3f2eSlogwang RTE_SET_USED(port_conf);
2362bfe3f2eSlogwang
2372bfe3f2eSlogwang /* Free memory prior to re-allocation if needed */
2382bfe3f2eSlogwang if (dev->data->ports[port_id] != NULL) {
2392bfe3f2eSlogwang PMD_DRV_LOG(DEBUG, "Freeing memory prior to re-allocation %d",
2402bfe3f2eSlogwang port_id);
2412bfe3f2eSlogwang skeleton_eventdev_port_release(dev->data->ports[port_id]);
2422bfe3f2eSlogwang dev->data->ports[port_id] = NULL;
2432bfe3f2eSlogwang }
2442bfe3f2eSlogwang
2452bfe3f2eSlogwang /* Allocate event port memory */
2462bfe3f2eSlogwang sp = rte_zmalloc_socket("eventdev port",
2472bfe3f2eSlogwang sizeof(struct skeleton_port), RTE_CACHE_LINE_SIZE,
2482bfe3f2eSlogwang dev->data->socket_id);
2492bfe3f2eSlogwang if (sp == NULL) {
2502bfe3f2eSlogwang PMD_DRV_ERR("Failed to allocate sp port_id=%d", port_id);
2512bfe3f2eSlogwang return -ENOMEM;
2522bfe3f2eSlogwang }
2532bfe3f2eSlogwang
2542bfe3f2eSlogwang sp->port_id = port_id;
2552bfe3f2eSlogwang
2562bfe3f2eSlogwang PMD_DRV_LOG(DEBUG, "[%d] sp=%p", port_id, sp);
2572bfe3f2eSlogwang
2582bfe3f2eSlogwang dev->data->ports[port_id] = sp;
2592bfe3f2eSlogwang return 0;
2602bfe3f2eSlogwang }
2612bfe3f2eSlogwang
2622bfe3f2eSlogwang static int
skeleton_eventdev_port_link(struct rte_eventdev * dev,void * port,const uint8_t queues[],const uint8_t priorities[],uint16_t nb_links)2632bfe3f2eSlogwang skeleton_eventdev_port_link(struct rte_eventdev *dev, void *port,
2642bfe3f2eSlogwang const uint8_t queues[], const uint8_t priorities[],
2652bfe3f2eSlogwang uint16_t nb_links)
2662bfe3f2eSlogwang {
2672bfe3f2eSlogwang struct skeleton_port *sp = port;
2682bfe3f2eSlogwang PMD_DRV_FUNC_TRACE();
2692bfe3f2eSlogwang
2702bfe3f2eSlogwang RTE_SET_USED(dev);
2712bfe3f2eSlogwang RTE_SET_USED(sp);
2722bfe3f2eSlogwang RTE_SET_USED(queues);
2732bfe3f2eSlogwang RTE_SET_USED(priorities);
2742bfe3f2eSlogwang
2752bfe3f2eSlogwang /* Linked all the queues */
2762bfe3f2eSlogwang return (int)nb_links;
2772bfe3f2eSlogwang }
2782bfe3f2eSlogwang
2792bfe3f2eSlogwang static int
skeleton_eventdev_port_unlink(struct rte_eventdev * dev,void * port,uint8_t queues[],uint16_t nb_unlinks)2802bfe3f2eSlogwang skeleton_eventdev_port_unlink(struct rte_eventdev *dev, void *port,
2812bfe3f2eSlogwang uint8_t queues[], uint16_t nb_unlinks)
2822bfe3f2eSlogwang {
2832bfe3f2eSlogwang struct skeleton_port *sp = port;
2842bfe3f2eSlogwang PMD_DRV_FUNC_TRACE();
2852bfe3f2eSlogwang
2862bfe3f2eSlogwang RTE_SET_USED(dev);
2872bfe3f2eSlogwang RTE_SET_USED(sp);
2882bfe3f2eSlogwang RTE_SET_USED(queues);
2892bfe3f2eSlogwang
2902bfe3f2eSlogwang /* Unlinked all the queues */
2912bfe3f2eSlogwang return (int)nb_unlinks;
2922bfe3f2eSlogwang
2932bfe3f2eSlogwang }
2942bfe3f2eSlogwang
2952bfe3f2eSlogwang static int
skeleton_eventdev_timeout_ticks(struct rte_eventdev * dev,uint64_t ns,uint64_t * timeout_ticks)2962bfe3f2eSlogwang skeleton_eventdev_timeout_ticks(struct rte_eventdev *dev, uint64_t ns,
2972bfe3f2eSlogwang uint64_t *timeout_ticks)
2982bfe3f2eSlogwang {
2992bfe3f2eSlogwang struct skeleton_eventdev *skel = skeleton_pmd_priv(dev);
3002bfe3f2eSlogwang uint32_t scale = 1;
3012bfe3f2eSlogwang
3022bfe3f2eSlogwang PMD_DRV_FUNC_TRACE();
3032bfe3f2eSlogwang
3042bfe3f2eSlogwang RTE_SET_USED(skel);
3052bfe3f2eSlogwang *timeout_ticks = ns * scale;
3062bfe3f2eSlogwang
3072bfe3f2eSlogwang return 0;
3082bfe3f2eSlogwang }
3092bfe3f2eSlogwang
3102bfe3f2eSlogwang static void
skeleton_eventdev_dump(struct rte_eventdev * dev,FILE * f)3112bfe3f2eSlogwang skeleton_eventdev_dump(struct rte_eventdev *dev, FILE *f)
3122bfe3f2eSlogwang {
3132bfe3f2eSlogwang struct skeleton_eventdev *skel = skeleton_pmd_priv(dev);
3142bfe3f2eSlogwang
3152bfe3f2eSlogwang PMD_DRV_FUNC_TRACE();
3162bfe3f2eSlogwang
3172bfe3f2eSlogwang RTE_SET_USED(skel);
3182bfe3f2eSlogwang RTE_SET_USED(f);
3192bfe3f2eSlogwang }
3202bfe3f2eSlogwang
3212bfe3f2eSlogwang
3222bfe3f2eSlogwang /* Initialize and register event driver with DPDK Application */
323d30ea906Sjfb8856606 static struct rte_eventdev_ops skeleton_eventdev_ops = {
3242bfe3f2eSlogwang .dev_infos_get = skeleton_eventdev_info_get,
3252bfe3f2eSlogwang .dev_configure = skeleton_eventdev_configure,
3262bfe3f2eSlogwang .dev_start = skeleton_eventdev_start,
3272bfe3f2eSlogwang .dev_stop = skeleton_eventdev_stop,
3282bfe3f2eSlogwang .dev_close = skeleton_eventdev_close,
3292bfe3f2eSlogwang .queue_def_conf = skeleton_eventdev_queue_def_conf,
3302bfe3f2eSlogwang .queue_setup = skeleton_eventdev_queue_setup,
3312bfe3f2eSlogwang .queue_release = skeleton_eventdev_queue_release,
3322bfe3f2eSlogwang .port_def_conf = skeleton_eventdev_port_def_conf,
3332bfe3f2eSlogwang .port_setup = skeleton_eventdev_port_setup,
3342bfe3f2eSlogwang .port_release = skeleton_eventdev_port_release,
3352bfe3f2eSlogwang .port_link = skeleton_eventdev_port_link,
3362bfe3f2eSlogwang .port_unlink = skeleton_eventdev_port_unlink,
3372bfe3f2eSlogwang .timeout_ticks = skeleton_eventdev_timeout_ticks,
3382bfe3f2eSlogwang .dump = skeleton_eventdev_dump
3392bfe3f2eSlogwang };
3402bfe3f2eSlogwang
3412bfe3f2eSlogwang static int
skeleton_eventdev_init(struct rte_eventdev * eventdev)3422bfe3f2eSlogwang skeleton_eventdev_init(struct rte_eventdev *eventdev)
3432bfe3f2eSlogwang {
3442bfe3f2eSlogwang struct rte_pci_device *pci_dev;
3452bfe3f2eSlogwang struct skeleton_eventdev *skel = skeleton_pmd_priv(eventdev);
3462bfe3f2eSlogwang int ret = 0;
3472bfe3f2eSlogwang
3482bfe3f2eSlogwang PMD_DRV_FUNC_TRACE();
3492bfe3f2eSlogwang
3502bfe3f2eSlogwang eventdev->dev_ops = &skeleton_eventdev_ops;
3512bfe3f2eSlogwang eventdev->enqueue = skeleton_eventdev_enqueue;
3522bfe3f2eSlogwang eventdev->enqueue_burst = skeleton_eventdev_enqueue_burst;
3532bfe3f2eSlogwang eventdev->dequeue = skeleton_eventdev_dequeue;
3542bfe3f2eSlogwang eventdev->dequeue_burst = skeleton_eventdev_dequeue_burst;
3552bfe3f2eSlogwang
3562bfe3f2eSlogwang /* For secondary processes, the primary has done all the work */
3572bfe3f2eSlogwang if (rte_eal_process_type() != RTE_PROC_PRIMARY)
3582bfe3f2eSlogwang return 0;
3592bfe3f2eSlogwang
3602bfe3f2eSlogwang pci_dev = RTE_DEV_TO_PCI(eventdev->dev);
3612bfe3f2eSlogwang
3622bfe3f2eSlogwang skel->reg_base = (uintptr_t)pci_dev->mem_resource[0].addr;
3632bfe3f2eSlogwang if (!skel->reg_base) {
3642bfe3f2eSlogwang PMD_DRV_ERR("Failed to map BAR0");
3652bfe3f2eSlogwang ret = -ENODEV;
3662bfe3f2eSlogwang goto fail;
3672bfe3f2eSlogwang }
3682bfe3f2eSlogwang
3692bfe3f2eSlogwang skel->device_id = pci_dev->id.device_id;
3702bfe3f2eSlogwang skel->vendor_id = pci_dev->id.vendor_id;
3712bfe3f2eSlogwang skel->subsystem_device_id = pci_dev->id.subsystem_device_id;
3722bfe3f2eSlogwang skel->subsystem_vendor_id = pci_dev->id.subsystem_vendor_id;
3732bfe3f2eSlogwang
3742bfe3f2eSlogwang PMD_DRV_LOG(DEBUG, "pci device (%x:%x) %u:%u:%u:%u",
3752bfe3f2eSlogwang pci_dev->id.vendor_id, pci_dev->id.device_id,
3762bfe3f2eSlogwang pci_dev->addr.domain, pci_dev->addr.bus,
3772bfe3f2eSlogwang pci_dev->addr.devid, pci_dev->addr.function);
3782bfe3f2eSlogwang
3792bfe3f2eSlogwang PMD_DRV_LOG(INFO, "dev_id=%d socket_id=%d (%x:%x)",
3802bfe3f2eSlogwang eventdev->data->dev_id, eventdev->data->socket_id,
3812bfe3f2eSlogwang skel->vendor_id, skel->device_id);
3822bfe3f2eSlogwang
3832bfe3f2eSlogwang fail:
3842bfe3f2eSlogwang return ret;
3852bfe3f2eSlogwang }
3862bfe3f2eSlogwang
3872bfe3f2eSlogwang /* PCI based event device */
3882bfe3f2eSlogwang
3892bfe3f2eSlogwang #define EVENTDEV_SKEL_VENDOR_ID 0x177d
3902bfe3f2eSlogwang #define EVENTDEV_SKEL_PRODUCT_ID 0x0001
3912bfe3f2eSlogwang
3922bfe3f2eSlogwang static const struct rte_pci_id pci_id_skeleton_map[] = {
3932bfe3f2eSlogwang {
3942bfe3f2eSlogwang RTE_PCI_DEVICE(EVENTDEV_SKEL_VENDOR_ID,
3952bfe3f2eSlogwang EVENTDEV_SKEL_PRODUCT_ID)
3962bfe3f2eSlogwang },
3972bfe3f2eSlogwang {
3982bfe3f2eSlogwang .vendor_id = 0,
3992bfe3f2eSlogwang },
4002bfe3f2eSlogwang };
4012bfe3f2eSlogwang
4022bfe3f2eSlogwang static int
event_skeleton_pci_probe(struct rte_pci_driver * pci_drv,struct rte_pci_device * pci_dev)4032bfe3f2eSlogwang event_skeleton_pci_probe(struct rte_pci_driver *pci_drv,
4042bfe3f2eSlogwang struct rte_pci_device *pci_dev)
4052bfe3f2eSlogwang {
4062bfe3f2eSlogwang return rte_event_pmd_pci_probe(pci_drv, pci_dev,
4072bfe3f2eSlogwang sizeof(struct skeleton_eventdev), skeleton_eventdev_init);
4082bfe3f2eSlogwang }
4092bfe3f2eSlogwang
4102bfe3f2eSlogwang static int
event_skeleton_pci_remove(struct rte_pci_device * pci_dev)4112bfe3f2eSlogwang event_skeleton_pci_remove(struct rte_pci_device *pci_dev)
4122bfe3f2eSlogwang {
4132bfe3f2eSlogwang return rte_event_pmd_pci_remove(pci_dev, NULL);
4142bfe3f2eSlogwang }
4152bfe3f2eSlogwang
4162bfe3f2eSlogwang static struct rte_pci_driver pci_eventdev_skeleton_pmd = {
4172bfe3f2eSlogwang .id_table = pci_id_skeleton_map,
4182bfe3f2eSlogwang .drv_flags = RTE_PCI_DRV_NEED_MAPPING,
4192bfe3f2eSlogwang .probe = event_skeleton_pci_probe,
4202bfe3f2eSlogwang .remove = event_skeleton_pci_remove,
4212bfe3f2eSlogwang };
4222bfe3f2eSlogwang
4232bfe3f2eSlogwang RTE_PMD_REGISTER_PCI(event_skeleton_pci, pci_eventdev_skeleton_pmd);
4242bfe3f2eSlogwang RTE_PMD_REGISTER_PCI_TABLE(event_skeleton_pci, pci_id_skeleton_map);
4252bfe3f2eSlogwang
4262bfe3f2eSlogwang /* VDEV based event device */
4272bfe3f2eSlogwang
4282bfe3f2eSlogwang static int
skeleton_eventdev_create(const char * name,int socket_id)4292bfe3f2eSlogwang skeleton_eventdev_create(const char *name, int socket_id)
4302bfe3f2eSlogwang {
4312bfe3f2eSlogwang struct rte_eventdev *eventdev;
4322bfe3f2eSlogwang
4332bfe3f2eSlogwang eventdev = rte_event_pmd_vdev_init(name,
4342bfe3f2eSlogwang sizeof(struct skeleton_eventdev), socket_id);
4352bfe3f2eSlogwang if (eventdev == NULL) {
4362bfe3f2eSlogwang PMD_DRV_ERR("Failed to create eventdev vdev %s", name);
4372bfe3f2eSlogwang goto fail;
4382bfe3f2eSlogwang }
4392bfe3f2eSlogwang
4402bfe3f2eSlogwang eventdev->dev_ops = &skeleton_eventdev_ops;
4412bfe3f2eSlogwang eventdev->enqueue = skeleton_eventdev_enqueue;
4422bfe3f2eSlogwang eventdev->enqueue_burst = skeleton_eventdev_enqueue_burst;
4432bfe3f2eSlogwang eventdev->dequeue = skeleton_eventdev_dequeue;
4442bfe3f2eSlogwang eventdev->dequeue_burst = skeleton_eventdev_dequeue_burst;
4452bfe3f2eSlogwang
4462bfe3f2eSlogwang return 0;
4472bfe3f2eSlogwang fail:
4482bfe3f2eSlogwang return -EFAULT;
4492bfe3f2eSlogwang }
4502bfe3f2eSlogwang
4512bfe3f2eSlogwang static int
skeleton_eventdev_probe(struct rte_vdev_device * vdev)4522bfe3f2eSlogwang skeleton_eventdev_probe(struct rte_vdev_device *vdev)
4532bfe3f2eSlogwang {
4542bfe3f2eSlogwang const char *name;
4552bfe3f2eSlogwang
4562bfe3f2eSlogwang name = rte_vdev_device_name(vdev);
4572bfe3f2eSlogwang RTE_LOG(INFO, PMD, "Initializing %s on NUMA node %d\n", name,
4582bfe3f2eSlogwang rte_socket_id());
4592bfe3f2eSlogwang return skeleton_eventdev_create(name, rte_socket_id());
4602bfe3f2eSlogwang }
4612bfe3f2eSlogwang
4622bfe3f2eSlogwang static int
skeleton_eventdev_remove(struct rte_vdev_device * vdev)4632bfe3f2eSlogwang skeleton_eventdev_remove(struct rte_vdev_device *vdev)
4642bfe3f2eSlogwang {
4652bfe3f2eSlogwang const char *name;
4662bfe3f2eSlogwang
4672bfe3f2eSlogwang name = rte_vdev_device_name(vdev);
4682bfe3f2eSlogwang PMD_DRV_LOG(INFO, "Closing %s on NUMA node %d", name, rte_socket_id());
4692bfe3f2eSlogwang
4702bfe3f2eSlogwang return rte_event_pmd_vdev_uninit(name);
4712bfe3f2eSlogwang }
4722bfe3f2eSlogwang
4732bfe3f2eSlogwang static struct rte_vdev_driver vdev_eventdev_skeleton_pmd = {
4742bfe3f2eSlogwang .probe = skeleton_eventdev_probe,
4752bfe3f2eSlogwang .remove = skeleton_eventdev_remove
4762bfe3f2eSlogwang };
4772bfe3f2eSlogwang
4782bfe3f2eSlogwang RTE_PMD_REGISTER_VDEV(EVENTDEV_NAME_SKELETON_PMD, vdev_eventdev_skeleton_pmd);
479