1aaf4363eSJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause 2aaf4363eSJerin Jacob * Copyright(c) 2016 Cavium, Inc 3bbbb929dSJerin Jacob */ 4bbbb929dSJerin Jacob 5bbbb929dSJerin Jacob #include <assert.h> 6bbbb929dSJerin Jacob #include <stdio.h> 7bbbb929dSJerin Jacob #include <stdbool.h> 8bbbb929dSJerin Jacob #include <errno.h> 9bbbb929dSJerin Jacob #include <stdint.h> 10bbbb929dSJerin Jacob #include <string.h> 11bbbb929dSJerin Jacob 12bbbb929dSJerin Jacob #include <rte_byteorder.h> 13bbbb929dSJerin Jacob #include <rte_common.h> 14bbbb929dSJerin Jacob #include <rte_debug.h> 151acb7f54SDavid Marchand #include <dev_driver.h> 16bbbb929dSJerin Jacob #include <rte_eal.h> 17bbbb929dSJerin Jacob #include <rte_log.h> 189a8269d5SJerin Jacob #include <rte_malloc.h> 19bbbb929dSJerin Jacob #include <rte_memory.h> 20bbbb929dSJerin Jacob #include <rte_lcore.h> 214851ef2bSDavid Marchand #include <bus_vdev_driver.h> 22bbbb929dSJerin Jacob 23bbbb929dSJerin Jacob #include "skeleton_eventdev.h" 24bbbb929dSJerin Jacob 25bbbb929dSJerin Jacob #define EVENTDEV_NAME_SKELETON_PMD event_skeleton 26bbbb929dSJerin Jacob /**< Skeleton event device PMD name */ 27bbbb929dSJerin Jacob 28bbbb929dSJerin Jacob static uint16_t 29bbbb929dSJerin Jacob skeleton_eventdev_enqueue_burst(void *port, const struct rte_event ev[], 30bbbb929dSJerin Jacob uint16_t nb_events) 31bbbb929dSJerin Jacob { 32bbbb929dSJerin Jacob struct skeleton_port *sp = port; 33bbbb929dSJerin Jacob 34bbbb929dSJerin Jacob RTE_SET_USED(sp); 35bbbb929dSJerin Jacob RTE_SET_USED(ev); 36bbbb929dSJerin Jacob RTE_SET_USED(port); 37bbbb929dSJerin Jacob RTE_SET_USED(nb_events); 38bbbb929dSJerin Jacob 39bbbb929dSJerin Jacob return 0; 40bbbb929dSJerin Jacob } 41bbbb929dSJerin Jacob 42bbbb929dSJerin Jacob static uint16_t 43bbbb929dSJerin Jacob skeleton_eventdev_dequeue_burst(void *port, struct rte_event ev[], 44bbbb929dSJerin Jacob uint16_t nb_events, uint64_t timeout_ticks) 45bbbb929dSJerin Jacob { 46bbbb929dSJerin Jacob struct skeleton_port *sp = port; 47bbbb929dSJerin Jacob 48bbbb929dSJerin Jacob RTE_SET_USED(sp); 49bbbb929dSJerin Jacob RTE_SET_USED(ev); 50bbbb929dSJerin Jacob RTE_SET_USED(nb_events); 51bbbb929dSJerin Jacob RTE_SET_USED(timeout_ticks); 52bbbb929dSJerin Jacob 53bbbb929dSJerin Jacob return 0; 54bbbb929dSJerin Jacob } 55bbbb929dSJerin Jacob 56bbbb929dSJerin Jacob static void 57bbbb929dSJerin Jacob skeleton_eventdev_info_get(struct rte_eventdev *dev, 58bbbb929dSJerin Jacob struct rte_event_dev_info *dev_info) 59bbbb929dSJerin Jacob { 60bbbb929dSJerin Jacob struct skeleton_eventdev *skel = skeleton_pmd_priv(dev); 61bbbb929dSJerin Jacob 62bbbb929dSJerin Jacob PMD_DRV_FUNC_TRACE(); 63bbbb929dSJerin Jacob 64bbbb929dSJerin Jacob RTE_SET_USED(skel); 65bbbb929dSJerin Jacob 66bbbb929dSJerin Jacob dev_info->min_dequeue_timeout_ns = 1; 67bbbb929dSJerin Jacob dev_info->max_dequeue_timeout_ns = 10000; 68bbbb929dSJerin Jacob dev_info->dequeue_timeout_ns = 25; 69bbbb929dSJerin Jacob dev_info->max_event_queues = 64; 70bbbb929dSJerin Jacob dev_info->max_event_queue_flows = (1ULL << 20); 71bbbb929dSJerin Jacob dev_info->max_event_queue_priority_levels = 8; 72bbbb929dSJerin Jacob dev_info->max_event_priority_levels = 8; 73bbbb929dSJerin Jacob dev_info->max_event_ports = 32; 74bbbb929dSJerin Jacob dev_info->max_event_port_dequeue_depth = 16; 75bbbb929dSJerin Jacob dev_info->max_event_port_enqueue_depth = 16; 76bbbb929dSJerin Jacob dev_info->max_num_events = (1ULL << 20); 77bbbb929dSJerin Jacob dev_info->event_dev_cap = RTE_EVENT_DEV_CAP_QUEUE_QOS | 78d0b61f6dSJerin Jacob RTE_EVENT_DEV_CAP_BURST_MODE | 7975d11313STimothy McDaniel RTE_EVENT_DEV_CAP_EVENT_QOS | 80bd991897SMattias Rönnblom RTE_EVENT_DEV_CAP_CARRY_FLOW_ID | 81bd991897SMattias Rönnblom RTE_EVENT_DEV_CAP_MAINTENANCE_FREE; 82d007a7f3SPavan Nikhilesh dev_info->max_profiles_per_port = 1; 83bbbb929dSJerin Jacob } 84bbbb929dSJerin Jacob 85bbbb929dSJerin Jacob static int 86bbbb929dSJerin Jacob skeleton_eventdev_configure(const struct rte_eventdev *dev) 87bbbb929dSJerin Jacob { 88bbbb929dSJerin Jacob struct rte_eventdev_data *data = dev->data; 89bbbb929dSJerin Jacob struct rte_event_dev_config *conf = &data->dev_conf; 90bbbb929dSJerin Jacob struct skeleton_eventdev *skel = skeleton_pmd_priv(dev); 91bbbb929dSJerin Jacob 92bbbb929dSJerin Jacob PMD_DRV_FUNC_TRACE(); 93bbbb929dSJerin Jacob 94bbbb929dSJerin Jacob RTE_SET_USED(conf); 95bbbb929dSJerin Jacob RTE_SET_USED(skel); 96bbbb929dSJerin Jacob 97bbbb929dSJerin Jacob PMD_DRV_LOG(DEBUG, "Configured eventdev devid=%d", dev->data->dev_id); 98bbbb929dSJerin Jacob return 0; 99bbbb929dSJerin Jacob } 100bbbb929dSJerin Jacob 101bbbb929dSJerin Jacob static int 102bbbb929dSJerin Jacob skeleton_eventdev_start(struct rte_eventdev *dev) 103bbbb929dSJerin Jacob { 104bbbb929dSJerin Jacob struct skeleton_eventdev *skel = skeleton_pmd_priv(dev); 105bbbb929dSJerin Jacob 106bbbb929dSJerin Jacob PMD_DRV_FUNC_TRACE(); 107bbbb929dSJerin Jacob 108bbbb929dSJerin Jacob RTE_SET_USED(skel); 109bbbb929dSJerin Jacob 110bbbb929dSJerin Jacob return 0; 111bbbb929dSJerin Jacob } 112bbbb929dSJerin Jacob 113bbbb929dSJerin Jacob static void 114bbbb929dSJerin Jacob skeleton_eventdev_stop(struct rte_eventdev *dev) 115bbbb929dSJerin Jacob { 116bbbb929dSJerin Jacob struct skeleton_eventdev *skel = skeleton_pmd_priv(dev); 117bbbb929dSJerin Jacob 118bbbb929dSJerin Jacob PMD_DRV_FUNC_TRACE(); 119bbbb929dSJerin Jacob 120bbbb929dSJerin Jacob RTE_SET_USED(skel); 121bbbb929dSJerin Jacob } 122bbbb929dSJerin Jacob 123bbbb929dSJerin Jacob static int 124bbbb929dSJerin Jacob skeleton_eventdev_close(struct rte_eventdev *dev) 125bbbb929dSJerin Jacob { 126bbbb929dSJerin Jacob struct skeleton_eventdev *skel = skeleton_pmd_priv(dev); 127bbbb929dSJerin Jacob 128bbbb929dSJerin Jacob PMD_DRV_FUNC_TRACE(); 129bbbb929dSJerin Jacob 130bbbb929dSJerin Jacob RTE_SET_USED(skel); 131bbbb929dSJerin Jacob 132bbbb929dSJerin Jacob return 0; 133bbbb929dSJerin Jacob } 134bbbb929dSJerin Jacob 135bbbb929dSJerin Jacob static void 136bbbb929dSJerin Jacob skeleton_eventdev_queue_def_conf(struct rte_eventdev *dev, uint8_t queue_id, 137bbbb929dSJerin Jacob struct rte_event_queue_conf *queue_conf) 138bbbb929dSJerin Jacob { 139bbbb929dSJerin Jacob struct skeleton_eventdev *skel = skeleton_pmd_priv(dev); 140bbbb929dSJerin Jacob 141bbbb929dSJerin Jacob PMD_DRV_FUNC_TRACE(); 142bbbb929dSJerin Jacob 143bbbb929dSJerin Jacob RTE_SET_USED(skel); 144bbbb929dSJerin Jacob RTE_SET_USED(queue_id); 145bbbb929dSJerin Jacob 146bbbb929dSJerin Jacob queue_conf->nb_atomic_flows = (1ULL << 20); 147bbbb929dSJerin Jacob queue_conf->nb_atomic_order_sequences = (1ULL << 20); 148361e7336SHarry van Haaren queue_conf->event_queue_cfg = RTE_EVENT_QUEUE_CFG_ALL_TYPES; 149bbbb929dSJerin Jacob queue_conf->priority = RTE_EVENT_DEV_PRIORITY_NORMAL; 150bbbb929dSJerin Jacob } 151bbbb929dSJerin Jacob 152bbbb929dSJerin Jacob static void 153bbbb929dSJerin Jacob skeleton_eventdev_queue_release(struct rte_eventdev *dev, uint8_t queue_id) 154bbbb929dSJerin Jacob { 155bbbb929dSJerin Jacob PMD_DRV_FUNC_TRACE(); 156bbbb929dSJerin Jacob 157bbbb929dSJerin Jacob RTE_SET_USED(dev); 158bbbb929dSJerin Jacob RTE_SET_USED(queue_id); 159bbbb929dSJerin Jacob } 160bbbb929dSJerin Jacob 161bbbb929dSJerin Jacob static int 162bbbb929dSJerin Jacob skeleton_eventdev_queue_setup(struct rte_eventdev *dev, uint8_t queue_id, 163bbbb929dSJerin Jacob const struct rte_event_queue_conf *queue_conf) 164bbbb929dSJerin Jacob { 165bbbb929dSJerin Jacob struct skeleton_eventdev *skel = skeleton_pmd_priv(dev); 166bbbb929dSJerin Jacob 167bbbb929dSJerin Jacob PMD_DRV_FUNC_TRACE(); 168bbbb929dSJerin Jacob 169bbbb929dSJerin Jacob RTE_SET_USED(skel); 170bbbb929dSJerin Jacob RTE_SET_USED(queue_conf); 171bbbb929dSJerin Jacob RTE_SET_USED(queue_id); 172bbbb929dSJerin Jacob 173bbbb929dSJerin Jacob return 0; 174bbbb929dSJerin Jacob } 175bbbb929dSJerin Jacob 176bbbb929dSJerin Jacob static void 177bbbb929dSJerin Jacob skeleton_eventdev_port_def_conf(struct rte_eventdev *dev, uint8_t port_id, 178bbbb929dSJerin Jacob struct rte_event_port_conf *port_conf) 179bbbb929dSJerin Jacob { 180bbbb929dSJerin Jacob struct skeleton_eventdev *skel = skeleton_pmd_priv(dev); 181bbbb929dSJerin Jacob 182bbbb929dSJerin Jacob PMD_DRV_FUNC_TRACE(); 183bbbb929dSJerin Jacob 184bbbb929dSJerin Jacob RTE_SET_USED(skel); 185bbbb929dSJerin Jacob RTE_SET_USED(port_id); 186bbbb929dSJerin Jacob 187bbbb929dSJerin Jacob port_conf->new_event_threshold = 32 * 1024; 188bbbb929dSJerin Jacob port_conf->dequeue_depth = 16; 189bbbb929dSJerin Jacob port_conf->enqueue_depth = 16; 19075d11313STimothy McDaniel port_conf->event_port_cfg = 0; 191bbbb929dSJerin Jacob } 192bbbb929dSJerin Jacob 193bbbb929dSJerin Jacob static void 194bbbb929dSJerin Jacob skeleton_eventdev_port_release(void *port) 195bbbb929dSJerin Jacob { 196bbbb929dSJerin Jacob struct skeleton_port *sp = port; 197bbbb929dSJerin Jacob PMD_DRV_FUNC_TRACE(); 198bbbb929dSJerin Jacob 199bbbb929dSJerin Jacob rte_free(sp); 200bbbb929dSJerin Jacob } 201bbbb929dSJerin Jacob 202bbbb929dSJerin Jacob static int 203bbbb929dSJerin Jacob skeleton_eventdev_port_setup(struct rte_eventdev *dev, uint8_t port_id, 204bbbb929dSJerin Jacob const struct rte_event_port_conf *port_conf) 205bbbb929dSJerin Jacob { 206bbbb929dSJerin Jacob struct skeleton_port *sp; 207bbbb929dSJerin Jacob struct skeleton_eventdev *skel = skeleton_pmd_priv(dev); 208bbbb929dSJerin Jacob 209bbbb929dSJerin Jacob PMD_DRV_FUNC_TRACE(); 210bbbb929dSJerin Jacob 211bbbb929dSJerin Jacob RTE_SET_USED(skel); 212bbbb929dSJerin Jacob RTE_SET_USED(port_conf); 213bbbb929dSJerin Jacob 214bbbb929dSJerin Jacob /* Free memory prior to re-allocation if needed */ 215bbbb929dSJerin Jacob if (dev->data->ports[port_id] != NULL) { 216bbbb929dSJerin Jacob PMD_DRV_LOG(DEBUG, "Freeing memory prior to re-allocation %d", 217bbbb929dSJerin Jacob port_id); 218bbbb929dSJerin Jacob skeleton_eventdev_port_release(dev->data->ports[port_id]); 219bbbb929dSJerin Jacob dev->data->ports[port_id] = NULL; 220bbbb929dSJerin Jacob } 221bbbb929dSJerin Jacob 222bbbb929dSJerin Jacob /* Allocate event port memory */ 223bbbb929dSJerin Jacob sp = rte_zmalloc_socket("eventdev port", 224bbbb929dSJerin Jacob sizeof(struct skeleton_port), RTE_CACHE_LINE_SIZE, 225bbbb929dSJerin Jacob dev->data->socket_id); 226bbbb929dSJerin Jacob if (sp == NULL) { 227bbbb929dSJerin Jacob PMD_DRV_ERR("Failed to allocate sp port_id=%d", port_id); 228bbbb929dSJerin Jacob return -ENOMEM; 229bbbb929dSJerin Jacob } 230bbbb929dSJerin Jacob 231bbbb929dSJerin Jacob sp->port_id = port_id; 232bbbb929dSJerin Jacob 233bbbb929dSJerin Jacob PMD_DRV_LOG(DEBUG, "[%d] sp=%p", port_id, sp); 234bbbb929dSJerin Jacob 235bbbb929dSJerin Jacob dev->data->ports[port_id] = sp; 236bbbb929dSJerin Jacob return 0; 237bbbb929dSJerin Jacob } 238bbbb929dSJerin Jacob 239bbbb929dSJerin Jacob static int 240d3e281a5SNipun Gupta skeleton_eventdev_port_link(struct rte_eventdev *dev, void *port, 241bbbb929dSJerin Jacob const uint8_t queues[], const uint8_t priorities[], 242bbbb929dSJerin Jacob uint16_t nb_links) 243bbbb929dSJerin Jacob { 244bbbb929dSJerin Jacob struct skeleton_port *sp = port; 245bbbb929dSJerin Jacob PMD_DRV_FUNC_TRACE(); 246bbbb929dSJerin Jacob 247d3e281a5SNipun Gupta RTE_SET_USED(dev); 248bbbb929dSJerin Jacob RTE_SET_USED(sp); 249bbbb929dSJerin Jacob RTE_SET_USED(queues); 250bbbb929dSJerin Jacob RTE_SET_USED(priorities); 251bbbb929dSJerin Jacob 252bbbb929dSJerin Jacob /* Linked all the queues */ 253bbbb929dSJerin Jacob return (int)nb_links; 254bbbb929dSJerin Jacob } 255bbbb929dSJerin Jacob 256bbbb929dSJerin Jacob static int 257d3e281a5SNipun Gupta skeleton_eventdev_port_unlink(struct rte_eventdev *dev, void *port, 258d3e281a5SNipun Gupta uint8_t queues[], uint16_t nb_unlinks) 259bbbb929dSJerin Jacob { 260bbbb929dSJerin Jacob struct skeleton_port *sp = port; 261bbbb929dSJerin Jacob PMD_DRV_FUNC_TRACE(); 262bbbb929dSJerin Jacob 263d3e281a5SNipun Gupta RTE_SET_USED(dev); 264bbbb929dSJerin Jacob RTE_SET_USED(sp); 265bbbb929dSJerin Jacob RTE_SET_USED(queues); 266bbbb929dSJerin Jacob 267bbbb929dSJerin Jacob /* Unlinked all the queues */ 268bbbb929dSJerin Jacob return (int)nb_unlinks; 269bbbb929dSJerin Jacob 270bbbb929dSJerin Jacob } 271bbbb929dSJerin Jacob 272836a9ddcSJerin Jacob static int 273bbbb929dSJerin Jacob skeleton_eventdev_timeout_ticks(struct rte_eventdev *dev, uint64_t ns, 274bbbb929dSJerin Jacob uint64_t *timeout_ticks) 275bbbb929dSJerin Jacob { 276bbbb929dSJerin Jacob struct skeleton_eventdev *skel = skeleton_pmd_priv(dev); 277bbbb929dSJerin Jacob uint32_t scale = 1; 278bbbb929dSJerin Jacob 279bbbb929dSJerin Jacob PMD_DRV_FUNC_TRACE(); 280bbbb929dSJerin Jacob 281bbbb929dSJerin Jacob RTE_SET_USED(skel); 282bbbb929dSJerin Jacob *timeout_ticks = ns * scale; 283836a9ddcSJerin Jacob 284836a9ddcSJerin Jacob return 0; 285bbbb929dSJerin Jacob } 286bbbb929dSJerin Jacob 287bbbb929dSJerin Jacob static void 288bbbb929dSJerin Jacob skeleton_eventdev_dump(struct rte_eventdev *dev, FILE *f) 289bbbb929dSJerin Jacob { 290bbbb929dSJerin Jacob struct skeleton_eventdev *skel = skeleton_pmd_priv(dev); 291bbbb929dSJerin Jacob 292bbbb929dSJerin Jacob PMD_DRV_FUNC_TRACE(); 293bbbb929dSJerin Jacob 294bbbb929dSJerin Jacob RTE_SET_USED(skel); 295bbbb929dSJerin Jacob RTE_SET_USED(f); 296bbbb929dSJerin Jacob } 297bbbb929dSJerin Jacob 298bbbb929dSJerin Jacob 299bbbb929dSJerin Jacob /* Initialize and register event driver with DPDK Application */ 30023d06e37SPavan Nikhilesh static struct eventdev_ops skeleton_eventdev_ops = { 301bbbb929dSJerin Jacob .dev_infos_get = skeleton_eventdev_info_get, 302bbbb929dSJerin Jacob .dev_configure = skeleton_eventdev_configure, 303bbbb929dSJerin Jacob .dev_start = skeleton_eventdev_start, 304bbbb929dSJerin Jacob .dev_stop = skeleton_eventdev_stop, 305bbbb929dSJerin Jacob .dev_close = skeleton_eventdev_close, 306bbbb929dSJerin Jacob .queue_def_conf = skeleton_eventdev_queue_def_conf, 307bbbb929dSJerin Jacob .queue_setup = skeleton_eventdev_queue_setup, 308bbbb929dSJerin Jacob .queue_release = skeleton_eventdev_queue_release, 309bbbb929dSJerin Jacob .port_def_conf = skeleton_eventdev_port_def_conf, 310bbbb929dSJerin Jacob .port_setup = skeleton_eventdev_port_setup, 311bbbb929dSJerin Jacob .port_release = skeleton_eventdev_port_release, 312bbbb929dSJerin Jacob .port_link = skeleton_eventdev_port_link, 313bbbb929dSJerin Jacob .port_unlink = skeleton_eventdev_port_unlink, 314bbbb929dSJerin Jacob .timeout_ticks = skeleton_eventdev_timeout_ticks, 315bbbb929dSJerin Jacob .dump = skeleton_eventdev_dump 316bbbb929dSJerin Jacob }; 317bbbb929dSJerin Jacob 318bbbb929dSJerin Jacob static int 319bbbb929dSJerin Jacob skeleton_eventdev_init(struct rte_eventdev *eventdev) 320bbbb929dSJerin Jacob { 321bbbb929dSJerin Jacob struct rte_pci_device *pci_dev; 322bbbb929dSJerin Jacob struct skeleton_eventdev *skel = skeleton_pmd_priv(eventdev); 323bbbb929dSJerin Jacob int ret = 0; 324bbbb929dSJerin Jacob 325bbbb929dSJerin Jacob PMD_DRV_FUNC_TRACE(); 326bbbb929dSJerin Jacob 327bbbb929dSJerin Jacob eventdev->dev_ops = &skeleton_eventdev_ops; 328bbbb929dSJerin Jacob eventdev->enqueue_burst = skeleton_eventdev_enqueue_burst; 329bbbb929dSJerin Jacob eventdev->dequeue_burst = skeleton_eventdev_dequeue_burst; 330bbbb929dSJerin Jacob 331bbbb929dSJerin Jacob /* For secondary processes, the primary has done all the work */ 332bbbb929dSJerin Jacob if (rte_eal_process_type() != RTE_PROC_PRIMARY) 333bbbb929dSJerin Jacob return 0; 334bbbb929dSJerin Jacob 335c1632199SNipun Gupta pci_dev = RTE_DEV_TO_PCI(eventdev->dev); 336bbbb929dSJerin Jacob 337bbbb929dSJerin Jacob skel->reg_base = (uintptr_t)pci_dev->mem_resource[0].addr; 338bbbb929dSJerin Jacob if (!skel->reg_base) { 339bbbb929dSJerin Jacob PMD_DRV_ERR("Failed to map BAR0"); 340bbbb929dSJerin Jacob ret = -ENODEV; 341bbbb929dSJerin Jacob goto fail; 342bbbb929dSJerin Jacob } 343bbbb929dSJerin Jacob 344bbbb929dSJerin Jacob skel->device_id = pci_dev->id.device_id; 345bbbb929dSJerin Jacob skel->vendor_id = pci_dev->id.vendor_id; 346bbbb929dSJerin Jacob skel->subsystem_device_id = pci_dev->id.subsystem_device_id; 347bbbb929dSJerin Jacob skel->subsystem_vendor_id = pci_dev->id.subsystem_vendor_id; 348bbbb929dSJerin Jacob 3492fc03b23SThomas Monjalon PMD_DRV_LOG(DEBUG, "PCI device (%x:%x) " PCI_PRI_FMT, 350bbbb929dSJerin Jacob pci_dev->id.vendor_id, pci_dev->id.device_id, 351bbbb929dSJerin Jacob pci_dev->addr.domain, pci_dev->addr.bus, 352bbbb929dSJerin Jacob pci_dev->addr.devid, pci_dev->addr.function); 353bbbb929dSJerin Jacob 354bbbb929dSJerin Jacob PMD_DRV_LOG(INFO, "dev_id=%d socket_id=%d (%x:%x)", 355bbbb929dSJerin Jacob eventdev->data->dev_id, eventdev->data->socket_id, 356bbbb929dSJerin Jacob skel->vendor_id, skel->device_id); 357bbbb929dSJerin Jacob 358bbbb929dSJerin Jacob fail: 359bbbb929dSJerin Jacob return ret; 360bbbb929dSJerin Jacob } 361bbbb929dSJerin Jacob 362bbbb929dSJerin Jacob /* PCI based event device */ 363bbbb929dSJerin Jacob 364bbbb929dSJerin Jacob #define EVENTDEV_SKEL_VENDOR_ID 0x177d 365bbbb929dSJerin Jacob #define EVENTDEV_SKEL_PRODUCT_ID 0x0001 366bbbb929dSJerin Jacob 367bbbb929dSJerin Jacob static const struct rte_pci_id pci_id_skeleton_map[] = { 368bbbb929dSJerin Jacob { 369bbbb929dSJerin Jacob RTE_PCI_DEVICE(EVENTDEV_SKEL_VENDOR_ID, 370bbbb929dSJerin Jacob EVENTDEV_SKEL_PRODUCT_ID) 371bbbb929dSJerin Jacob }, 372bbbb929dSJerin Jacob { 373bbbb929dSJerin Jacob .vendor_id = 0, 374bbbb929dSJerin Jacob }, 375bbbb929dSJerin Jacob }; 376bbbb929dSJerin Jacob 3777214438dSJerin Jacob static int 3787214438dSJerin Jacob event_skeleton_pci_probe(struct rte_pci_driver *pci_drv, 3797214438dSJerin Jacob struct rte_pci_device *pci_dev) 3807214438dSJerin Jacob { 3817214438dSJerin Jacob return rte_event_pmd_pci_probe(pci_drv, pci_dev, 3827214438dSJerin Jacob sizeof(struct skeleton_eventdev), skeleton_eventdev_init); 3837214438dSJerin Jacob } 3847214438dSJerin Jacob 3857214438dSJerin Jacob static int 3867214438dSJerin Jacob event_skeleton_pci_remove(struct rte_pci_device *pci_dev) 3877214438dSJerin Jacob { 3887214438dSJerin Jacob return rte_event_pmd_pci_remove(pci_dev, NULL); 3897214438dSJerin Jacob } 3907214438dSJerin Jacob 3917214438dSJerin Jacob static struct rte_pci_driver pci_eventdev_skeleton_pmd = { 392bbbb929dSJerin Jacob .id_table = pci_id_skeleton_map, 393bbbb929dSJerin Jacob .drv_flags = RTE_PCI_DRV_NEED_MAPPING, 3947214438dSJerin Jacob .probe = event_skeleton_pci_probe, 3957214438dSJerin Jacob .remove = event_skeleton_pci_remove, 396bbbb929dSJerin Jacob }; 397bbbb929dSJerin Jacob 3987214438dSJerin Jacob RTE_PMD_REGISTER_PCI(event_skeleton_pci, pci_eventdev_skeleton_pmd); 399bbbb929dSJerin Jacob RTE_PMD_REGISTER_PCI_TABLE(event_skeleton_pci, pci_id_skeleton_map); 400bbbb929dSJerin Jacob 401bbbb929dSJerin Jacob /* VDEV based event device */ 402bbbb929dSJerin Jacob 403bbbb929dSJerin Jacob static int 404928b5c70SBruce Richardson skeleton_eventdev_create(const char *name, int socket_id, struct rte_vdev_device *vdev) 405bbbb929dSJerin Jacob { 406bbbb929dSJerin Jacob struct rte_eventdev *eventdev; 407bbbb929dSJerin Jacob 408e3368ca9SJerin Jacob eventdev = rte_event_pmd_vdev_init(name, 409928b5c70SBruce Richardson sizeof(struct skeleton_eventdev), socket_id, vdev); 410bbbb929dSJerin Jacob if (eventdev == NULL) { 411e3368ca9SJerin Jacob PMD_DRV_ERR("Failed to create eventdev vdev %s", name); 412bbbb929dSJerin Jacob goto fail; 413bbbb929dSJerin Jacob } 414bbbb929dSJerin Jacob 415bbbb929dSJerin Jacob eventdev->dev_ops = &skeleton_eventdev_ops; 416bbbb929dSJerin Jacob eventdev->enqueue_burst = skeleton_eventdev_enqueue_burst; 417bbbb929dSJerin Jacob eventdev->dequeue_burst = skeleton_eventdev_dequeue_burst; 418bbbb929dSJerin Jacob 41985be9971SPavan Nikhilesh event_dev_probing_finish(eventdev); 420bbbb929dSJerin Jacob return 0; 421bbbb929dSJerin Jacob fail: 422bbbb929dSJerin Jacob return -EFAULT; 423bbbb929dSJerin Jacob } 424bbbb929dSJerin Jacob 425bbbb929dSJerin Jacob static int 4265d2aa461SJan Blunck skeleton_eventdev_probe(struct rte_vdev_device *vdev) 427bbbb929dSJerin Jacob { 4285d2aa461SJan Blunck const char *name; 4295d2aa461SJan Blunck 4305d2aa461SJan Blunck name = rte_vdev_device_name(vdev); 431*626bc4baSStephen Hemminger PMD_DRV_LOG(INFO, "Initializing %s on NUMA node %d", name, rte_socket_id()); 432928b5c70SBruce Richardson return skeleton_eventdev_create(name, rte_socket_id(), vdev); 433bbbb929dSJerin Jacob } 434bbbb929dSJerin Jacob 435bbbb929dSJerin Jacob static int 4365d2aa461SJan Blunck skeleton_eventdev_remove(struct rte_vdev_device *vdev) 437bbbb929dSJerin Jacob { 4385d2aa461SJan Blunck const char *name; 4395d2aa461SJan Blunck 4405d2aa461SJan Blunck name = rte_vdev_device_name(vdev); 441bbbb929dSJerin Jacob PMD_DRV_LOG(INFO, "Closing %s on NUMA node %d", name, rte_socket_id()); 442bbbb929dSJerin Jacob 443e3368ca9SJerin Jacob return rte_event_pmd_vdev_uninit(name); 444bbbb929dSJerin Jacob } 445bbbb929dSJerin Jacob 446bbbb929dSJerin Jacob static struct rte_vdev_driver vdev_eventdev_skeleton_pmd = { 447bbbb929dSJerin Jacob .probe = skeleton_eventdev_probe, 448bbbb929dSJerin Jacob .remove = skeleton_eventdev_remove 449bbbb929dSJerin Jacob }; 450bbbb929dSJerin Jacob 451bbbb929dSJerin Jacob RTE_PMD_REGISTER_VDEV(EVENTDEV_NAME_SKELETON_PMD, vdev_eventdev_skeleton_pmd); 452*626bc4baSStephen Hemminger RTE_LOG_REGISTER_DEFAULT(skeleton_eventdev_logtype, INFO); 453