1e07a3ed7SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 2e07a3ed7SBruce Richardson * Copyright(c) 2017 Intel Corporation 33c7f3dcfSLiang Ma */ 43c7f3dcfSLiang Ma 53c7f3dcfSLiang Ma #include <inttypes.h> 672b452c5SDmitry Kozlyuk #include <stdlib.h> 73c7f3dcfSLiang Ma #include <string.h> 83c7f3dcfSLiang Ma 94851ef2bSDavid Marchand #include <bus_vdev_driver.h> 103c7f3dcfSLiang Ma #include <rte_lcore.h> 113c7f3dcfSLiang Ma #include <rte_memzone.h> 123c7f3dcfSLiang Ma #include <rte_kvargs.h> 133c7f3dcfSLiang Ma #include <rte_errno.h> 143c7f3dcfSLiang Ma #include <rte_cycles.h> 153c7f3dcfSLiang Ma 163c7f3dcfSLiang Ma #include "opdl_evdev.h" 173c7f3dcfSLiang Ma #include "opdl_ring.h" 183c7f3dcfSLiang Ma #include "opdl_log.h" 193c7f3dcfSLiang Ma 203c7f3dcfSLiang Ma #define EVENTDEV_NAME_OPDL_PMD event_opdl 213c7f3dcfSLiang Ma #define NUMA_NODE_ARG "numa_node" 223c7f3dcfSLiang Ma #define DO_VALIDATION_ARG "do_validation" 233c7f3dcfSLiang Ma #define DO_TEST_ARG "self_test" 243c7f3dcfSLiang Ma 253c7f3dcfSLiang Ma 263c7f3dcfSLiang Ma static void 273c7f3dcfSLiang Ma opdl_info_get(struct rte_eventdev *dev, struct rte_event_dev_info *info); 283c7f3dcfSLiang Ma 298ca5fad5SLiang Ma uint16_t 308ca5fad5SLiang Ma opdl_event_enqueue_burst(void *port, 318ca5fad5SLiang Ma const struct rte_event ev[], 328ca5fad5SLiang Ma uint16_t num) 338ca5fad5SLiang Ma { 348ca5fad5SLiang Ma struct opdl_port *p = port; 358ca5fad5SLiang Ma 368ca5fad5SLiang Ma if (unlikely(!p->opdl->data->dev_started)) 378ca5fad5SLiang Ma return 0; 388ca5fad5SLiang Ma 398ca5fad5SLiang Ma 408ca5fad5SLiang Ma /* either rx_enqueue or disclaim*/ 418ca5fad5SLiang Ma return p->enq(p, ev, num); 428ca5fad5SLiang Ma } 438ca5fad5SLiang Ma 448ca5fad5SLiang Ma uint16_t 458ca5fad5SLiang Ma opdl_event_enqueue(void *port, const struct rte_event *ev) 468ca5fad5SLiang Ma { 478ca5fad5SLiang Ma struct opdl_port *p = port; 488ca5fad5SLiang Ma 498ca5fad5SLiang Ma if (unlikely(!p->opdl->data->dev_started)) 508ca5fad5SLiang Ma return 0; 518ca5fad5SLiang Ma 528ca5fad5SLiang Ma 538ca5fad5SLiang Ma return p->enq(p, ev, 1); 548ca5fad5SLiang Ma } 558ca5fad5SLiang Ma 568ca5fad5SLiang Ma uint16_t 578ca5fad5SLiang Ma opdl_event_dequeue_burst(void *port, 588ca5fad5SLiang Ma struct rte_event *ev, 598ca5fad5SLiang Ma uint16_t num, 608ca5fad5SLiang Ma uint64_t wait) 618ca5fad5SLiang Ma { 628ca5fad5SLiang Ma struct opdl_port *p = (void *)port; 638ca5fad5SLiang Ma 648ca5fad5SLiang Ma RTE_SET_USED(wait); 658ca5fad5SLiang Ma 668ca5fad5SLiang Ma if (unlikely(!p->opdl->data->dev_started)) 678ca5fad5SLiang Ma return 0; 688ca5fad5SLiang Ma 698ca5fad5SLiang Ma /* This function pointer can point to tx_dequeue or claim*/ 708ca5fad5SLiang Ma return p->deq(p, ev, num); 718ca5fad5SLiang Ma } 728ca5fad5SLiang Ma 738ca5fad5SLiang Ma uint16_t 748ca5fad5SLiang Ma opdl_event_dequeue(void *port, 758ca5fad5SLiang Ma struct rte_event *ev, 768ca5fad5SLiang Ma uint64_t wait) 778ca5fad5SLiang Ma { 788ca5fad5SLiang Ma struct opdl_port *p = (void *)port; 798ca5fad5SLiang Ma 808ca5fad5SLiang Ma if (unlikely(!p->opdl->data->dev_started)) 818ca5fad5SLiang Ma return 0; 828ca5fad5SLiang Ma 838ca5fad5SLiang Ma RTE_SET_USED(wait); 848ca5fad5SLiang Ma 858ca5fad5SLiang Ma return p->deq(p, ev, 1); 868ca5fad5SLiang Ma } 878ca5fad5SLiang Ma 880bf298e3SLiang Ma static int 890bf298e3SLiang Ma opdl_port_link(struct rte_eventdev *dev, 900bf298e3SLiang Ma void *port, 910bf298e3SLiang Ma const uint8_t queues[], 920bf298e3SLiang Ma const uint8_t priorities[], 930bf298e3SLiang Ma uint16_t num) 940bf298e3SLiang Ma { 950bf298e3SLiang Ma struct opdl_port *p = port; 960bf298e3SLiang Ma 970bf298e3SLiang Ma RTE_SET_USED(priorities); 980bf298e3SLiang Ma RTE_SET_USED(dev); 990bf298e3SLiang Ma 1000bf298e3SLiang Ma if (unlikely(dev->data->dev_started)) { 1010bf298e3SLiang Ma PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : " 102*f665790aSDavid Marchand "Attempt to link queue (%u) to port %d while device started", 1030bf298e3SLiang Ma dev->data->dev_id, 1040bf298e3SLiang Ma queues[0], 1050bf298e3SLiang Ma p->id); 106db8bdaecSDilshod Urazov rte_errno = EINVAL; 1070bf298e3SLiang Ma return 0; 1080bf298e3SLiang Ma } 1090bf298e3SLiang Ma 1100bf298e3SLiang Ma /* Max of 1 queue per port */ 1110bf298e3SLiang Ma if (num > 1) { 1120bf298e3SLiang Ma PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : " 113*f665790aSDavid Marchand "Attempt to link more than one queue (%u) to port %d requested", 1140bf298e3SLiang Ma dev->data->dev_id, 1150bf298e3SLiang Ma num, 1160bf298e3SLiang Ma p->id); 117db8bdaecSDilshod Urazov rte_errno = EDQUOT; 1180bf298e3SLiang Ma return 0; 1190bf298e3SLiang Ma } 1200bf298e3SLiang Ma 1210bf298e3SLiang Ma if (!p->configured) { 1220bf298e3SLiang Ma PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : " 123*f665790aSDavid Marchand "port %d not configured, cannot link to %u", 1240bf298e3SLiang Ma dev->data->dev_id, 1250bf298e3SLiang Ma p->id, 1260bf298e3SLiang Ma queues[0]); 127db8bdaecSDilshod Urazov rte_errno = EINVAL; 1280bf298e3SLiang Ma return 0; 1290bf298e3SLiang Ma } 1300bf298e3SLiang Ma 1310bf298e3SLiang Ma if (p->external_qid != OPDL_INVALID_QID) { 1320bf298e3SLiang Ma PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : " 133*f665790aSDavid Marchand "port %d already linked to queue %u, cannot link to %u", 1340bf298e3SLiang Ma dev->data->dev_id, 1350bf298e3SLiang Ma p->id, 1360bf298e3SLiang Ma p->external_qid, 1370bf298e3SLiang Ma queues[0]); 138db8bdaecSDilshod Urazov rte_errno = EINVAL; 1390bf298e3SLiang Ma return 0; 1400bf298e3SLiang Ma } 1410bf298e3SLiang Ma 1420bf298e3SLiang Ma p->external_qid = queues[0]; 1430bf298e3SLiang Ma 1440bf298e3SLiang Ma return 1; 1450bf298e3SLiang Ma } 1460bf298e3SLiang Ma 1470bf298e3SLiang Ma static int 1480bf298e3SLiang Ma opdl_port_unlink(struct rte_eventdev *dev, 1490bf298e3SLiang Ma void *port, 1500bf298e3SLiang Ma uint8_t queues[], 1510bf298e3SLiang Ma uint16_t nb_unlinks) 1520bf298e3SLiang Ma { 1530bf298e3SLiang Ma struct opdl_port *p = port; 1540bf298e3SLiang Ma 1550bf298e3SLiang Ma RTE_SET_USED(queues); 1560bf298e3SLiang Ma RTE_SET_USED(nb_unlinks); 1570bf298e3SLiang Ma 1580bf298e3SLiang Ma if (unlikely(dev->data->dev_started)) { 1590bf298e3SLiang Ma PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : " 160*f665790aSDavid Marchand "Attempt to unlink queue (%u) to port %d while device started", 1610bf298e3SLiang Ma dev->data->dev_id, 1620bf298e3SLiang Ma queues[0], 1630bf298e3SLiang Ma p->id); 164db8bdaecSDilshod Urazov rte_errno = EINVAL; 1650bf298e3SLiang Ma return 0; 1660bf298e3SLiang Ma } 1670bf298e3SLiang Ma RTE_SET_USED(nb_unlinks); 1680bf298e3SLiang Ma 1690bf298e3SLiang Ma /* Port Stuff */ 1700bf298e3SLiang Ma p->queue_id = OPDL_INVALID_QID; 1710bf298e3SLiang Ma p->p_type = OPDL_INVALID_PORT; 1720bf298e3SLiang Ma p->external_qid = OPDL_INVALID_QID; 1730bf298e3SLiang Ma 1740bf298e3SLiang Ma /* always unlink 0 queue due to statice pipeline */ 1750bf298e3SLiang Ma return 0; 1760bf298e3SLiang Ma } 1770bf298e3SLiang Ma 1780bf298e3SLiang Ma static int 1790bf298e3SLiang Ma opdl_port_setup(struct rte_eventdev *dev, 1800bf298e3SLiang Ma uint8_t port_id, 1810bf298e3SLiang Ma const struct rte_event_port_conf *conf) 1820bf298e3SLiang Ma { 1830bf298e3SLiang Ma struct opdl_evdev *device = opdl_pmd_priv(dev); 1840bf298e3SLiang Ma struct opdl_port *p = &device->ports[port_id]; 1850bf298e3SLiang Ma 1860bf298e3SLiang Ma RTE_SET_USED(conf); 1870bf298e3SLiang Ma 1880bf298e3SLiang Ma /* Check if port already configured */ 1890bf298e3SLiang Ma if (p->configured) { 1900bf298e3SLiang Ma PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : " 191*f665790aSDavid Marchand "Attempt to setup port %d which is already setup", 1920bf298e3SLiang Ma dev->data->dev_id, 1930bf298e3SLiang Ma p->id); 1940bf298e3SLiang Ma return -EDQUOT; 1950bf298e3SLiang Ma } 1960bf298e3SLiang Ma 1970bf298e3SLiang Ma *p = (struct opdl_port){0}; /* zero entire structure */ 1980bf298e3SLiang Ma p->id = port_id; 1990bf298e3SLiang Ma p->opdl = device; 2000bf298e3SLiang Ma p->queue_id = OPDL_INVALID_QID; 2010bf298e3SLiang Ma p->external_qid = OPDL_INVALID_QID; 2020bf298e3SLiang Ma dev->data->ports[port_id] = p; 2030bf298e3SLiang Ma rte_smp_wmb(); 2040bf298e3SLiang Ma p->configured = 1; 2050bf298e3SLiang Ma device->nb_ports++; 2060bf298e3SLiang Ma return 0; 2070bf298e3SLiang Ma } 2080bf298e3SLiang Ma 2090bf298e3SLiang Ma static void 2100bf298e3SLiang Ma opdl_port_release(void *port) 2110bf298e3SLiang Ma { 2120bf298e3SLiang Ma struct opdl_port *p = (void *)port; 2130bf298e3SLiang Ma 2140bf298e3SLiang Ma if (p == NULL || 2150bf298e3SLiang Ma p->opdl->data->dev_started) { 2160bf298e3SLiang Ma return; 2170bf298e3SLiang Ma } 2180bf298e3SLiang Ma 2190bf298e3SLiang Ma p->configured = 0; 2200bf298e3SLiang Ma p->initialized = 0; 2210bf298e3SLiang Ma } 2220bf298e3SLiang Ma 2230bf298e3SLiang Ma static void 2240bf298e3SLiang Ma opdl_port_def_conf(struct rte_eventdev *dev, uint8_t port_id, 2250bf298e3SLiang Ma struct rte_event_port_conf *port_conf) 2260bf298e3SLiang Ma { 2270bf298e3SLiang Ma RTE_SET_USED(dev); 2280bf298e3SLiang Ma RTE_SET_USED(port_id); 2290bf298e3SLiang Ma 2300bf298e3SLiang Ma port_conf->new_event_threshold = MAX_OPDL_CONS_Q_DEPTH; 2310bf298e3SLiang Ma port_conf->dequeue_depth = MAX_OPDL_CONS_Q_DEPTH; 2320bf298e3SLiang Ma port_conf->enqueue_depth = MAX_OPDL_CONS_Q_DEPTH; 2330bf298e3SLiang Ma } 2343c7f3dcfSLiang Ma 2358ca8e3b4SLiang Ma static int 2368ca8e3b4SLiang Ma opdl_queue_setup(struct rte_eventdev *dev, 2378ca8e3b4SLiang Ma uint8_t queue_id, 2388ca8e3b4SLiang Ma const struct rte_event_queue_conf *conf) 2398ca8e3b4SLiang Ma { 2408ca8e3b4SLiang Ma enum queue_type type; 2418ca8e3b4SLiang Ma 2428ca8e3b4SLiang Ma struct opdl_evdev *device = opdl_pmd_priv(dev); 2438ca8e3b4SLiang Ma 2448ca8e3b4SLiang Ma /* Extra sanity check, probably not needed */ 2458ca8e3b4SLiang Ma if (queue_id == OPDL_INVALID_QID) { 2468ca8e3b4SLiang Ma PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : " 247*f665790aSDavid Marchand "Invalid queue id %u requested", 2488ca8e3b4SLiang Ma dev->data->dev_id, 2498ca8e3b4SLiang Ma queue_id); 2508ca8e3b4SLiang Ma return -EINVAL; 2518ca8e3b4SLiang Ma } 2528ca8e3b4SLiang Ma 2538ca8e3b4SLiang Ma if (device->nb_q_md > device->max_queue_nb) { 2548ca8e3b4SLiang Ma PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : " 255*f665790aSDavid Marchand "Max number of queues %u exceeded by request %u", 2568ca8e3b4SLiang Ma dev->data->dev_id, 2578ca8e3b4SLiang Ma device->max_queue_nb, 2588ca8e3b4SLiang Ma device->nb_q_md); 2598ca8e3b4SLiang Ma return -EINVAL; 2608ca8e3b4SLiang Ma } 2618ca8e3b4SLiang Ma 2628ca8e3b4SLiang Ma if (RTE_EVENT_QUEUE_CFG_ALL_TYPES 2638ca8e3b4SLiang Ma & conf->event_queue_cfg) { 2648ca8e3b4SLiang Ma PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : " 265*f665790aSDavid Marchand "QUEUE_CFG_ALL_TYPES not supported", 2668ca8e3b4SLiang Ma dev->data->dev_id); 2678ca8e3b4SLiang Ma return -ENOTSUP; 2688ca8e3b4SLiang Ma } else if (RTE_EVENT_QUEUE_CFG_SINGLE_LINK 2698ca8e3b4SLiang Ma & conf->event_queue_cfg) { 2708ca8e3b4SLiang Ma type = OPDL_Q_TYPE_SINGLE_LINK; 2718ca8e3b4SLiang Ma } else { 2728ca8e3b4SLiang Ma switch (conf->schedule_type) { 2738ca8e3b4SLiang Ma case RTE_SCHED_TYPE_ORDERED: 2748ca8e3b4SLiang Ma type = OPDL_Q_TYPE_ORDERED; 2758ca8e3b4SLiang Ma break; 2768ca8e3b4SLiang Ma case RTE_SCHED_TYPE_ATOMIC: 2778ca8e3b4SLiang Ma type = OPDL_Q_TYPE_ATOMIC; 2788ca8e3b4SLiang Ma break; 2798ca8e3b4SLiang Ma case RTE_SCHED_TYPE_PARALLEL: 2808ca8e3b4SLiang Ma type = OPDL_Q_TYPE_ORDERED; 2818ca8e3b4SLiang Ma break; 2828ca8e3b4SLiang Ma default: 2838ca8e3b4SLiang Ma PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : " 284*f665790aSDavid Marchand "Unknown queue type %d requested", 2858ca8e3b4SLiang Ma dev->data->dev_id, 2868ca8e3b4SLiang Ma conf->event_queue_cfg); 2878ca8e3b4SLiang Ma return -EINVAL; 2888ca8e3b4SLiang Ma } 2898ca8e3b4SLiang Ma } 2908ca8e3b4SLiang Ma /* Check if queue id has been setup already */ 291be455196SHarry van Haaren uint32_t i; 292be455196SHarry van Haaren for (i = 0; i < device->nb_q_md; i++) { 2938ca8e3b4SLiang Ma if (device->q_md[i].ext_id == queue_id) { 2948ca8e3b4SLiang Ma PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : " 295*f665790aSDavid Marchand "queue id %u already setup", 2968ca8e3b4SLiang Ma dev->data->dev_id, 2978ca8e3b4SLiang Ma queue_id); 2988ca8e3b4SLiang Ma return -EINVAL; 2998ca8e3b4SLiang Ma } 3008ca8e3b4SLiang Ma } 3018ca8e3b4SLiang Ma 3028ca8e3b4SLiang Ma device->q_md[device->nb_q_md].ext_id = queue_id; 3038ca8e3b4SLiang Ma device->q_md[device->nb_q_md].type = type; 3048ca8e3b4SLiang Ma device->q_md[device->nb_q_md].setup = 1; 3058ca8e3b4SLiang Ma device->nb_q_md++; 3068ca8e3b4SLiang Ma 3078ca8e3b4SLiang Ma return 1; 3088ca8e3b4SLiang Ma } 3098ca8e3b4SLiang Ma 3108ca8e3b4SLiang Ma static void 3118ca8e3b4SLiang Ma opdl_queue_release(struct rte_eventdev *dev, uint8_t queue_id) 3128ca8e3b4SLiang Ma { 3138ca8e3b4SLiang Ma struct opdl_evdev *device = opdl_pmd_priv(dev); 3148ca8e3b4SLiang Ma 3158ca8e3b4SLiang Ma RTE_SET_USED(queue_id); 3168ca8e3b4SLiang Ma 3178ca8e3b4SLiang Ma if (device->data->dev_started) 3188ca8e3b4SLiang Ma return; 3198ca8e3b4SLiang Ma 3208ca8e3b4SLiang Ma } 3218ca8e3b4SLiang Ma 3228ca8e3b4SLiang Ma static void 3238ca8e3b4SLiang Ma opdl_queue_def_conf(struct rte_eventdev *dev, 3248ca8e3b4SLiang Ma uint8_t queue_id, 3258ca8e3b4SLiang Ma struct rte_event_queue_conf *conf) 3268ca8e3b4SLiang Ma { 3278ca8e3b4SLiang Ma RTE_SET_USED(dev); 3288ca8e3b4SLiang Ma RTE_SET_USED(queue_id); 3298ca8e3b4SLiang Ma 3308ca8e3b4SLiang Ma static const struct rte_event_queue_conf default_conf = { 3318ca8e3b4SLiang Ma .nb_atomic_flows = 1024, 3328ca8e3b4SLiang Ma .nb_atomic_order_sequences = 1, 3338ca8e3b4SLiang Ma .event_queue_cfg = 0, 3348ca8e3b4SLiang Ma .schedule_type = RTE_SCHED_TYPE_ORDERED, 3358ca8e3b4SLiang Ma .priority = RTE_EVENT_DEV_PRIORITY_NORMAL, 3368ca8e3b4SLiang Ma }; 3378ca8e3b4SLiang Ma 3388ca8e3b4SLiang Ma *conf = default_conf; 3398ca8e3b4SLiang Ma } 3403c7f3dcfSLiang Ma 3413c7f3dcfSLiang Ma 3423c7f3dcfSLiang Ma static int 3433c7f3dcfSLiang Ma opdl_dev_configure(const struct rte_eventdev *dev) 3443c7f3dcfSLiang Ma { 3453c7f3dcfSLiang Ma struct opdl_evdev *opdl = opdl_pmd_priv(dev); 3463c7f3dcfSLiang Ma const struct rte_eventdev_data *data = dev->data; 3473c7f3dcfSLiang Ma const struct rte_event_dev_config *conf = &data->dev_conf; 3483c7f3dcfSLiang Ma 3493c7f3dcfSLiang Ma opdl->max_queue_nb = conf->nb_event_queues; 3503c7f3dcfSLiang Ma opdl->max_port_nb = conf->nb_event_ports; 3513c7f3dcfSLiang Ma opdl->nb_events_limit = conf->nb_events_limit; 3523c7f3dcfSLiang Ma 3533c7f3dcfSLiang Ma if (conf->event_dev_cfg & RTE_EVENT_DEV_CFG_PER_DEQUEUE_TIMEOUT) { 3543c7f3dcfSLiang Ma PMD_DRV_LOG(ERR, "DEV_ID:[%02d] : " 355*f665790aSDavid Marchand "DEQUEUE_TIMEOUT not supported", 3563c7f3dcfSLiang Ma dev->data->dev_id); 3573c7f3dcfSLiang Ma return -ENOTSUP; 3583c7f3dcfSLiang Ma } 3593c7f3dcfSLiang Ma 3603c7f3dcfSLiang Ma return 0; 3613c7f3dcfSLiang Ma } 3623c7f3dcfSLiang Ma 3633c7f3dcfSLiang Ma static void 3643c7f3dcfSLiang Ma opdl_info_get(struct rte_eventdev *dev, struct rte_event_dev_info *info) 3653c7f3dcfSLiang Ma { 3663c7f3dcfSLiang Ma RTE_SET_USED(dev); 3673c7f3dcfSLiang Ma 3683c7f3dcfSLiang Ma static const struct rte_event_dev_info evdev_opdl_info = { 3693c7f3dcfSLiang Ma .driver_name = OPDL_PMD_NAME, 3703c7f3dcfSLiang Ma .max_event_queues = RTE_EVENT_MAX_QUEUES_PER_DEV, 3713c7f3dcfSLiang Ma .max_event_queue_flows = OPDL_QID_NUM_FIDS, 3723c7f3dcfSLiang Ma .max_event_queue_priority_levels = OPDL_Q_PRIORITY_MAX, 3733c7f3dcfSLiang Ma .max_event_priority_levels = OPDL_IQS_MAX, 3743c7f3dcfSLiang Ma .max_event_ports = OPDL_PORTS_MAX, 3753c7f3dcfSLiang Ma .max_event_port_dequeue_depth = MAX_OPDL_CONS_Q_DEPTH, 3763c7f3dcfSLiang Ma .max_event_port_enqueue_depth = MAX_OPDL_CONS_Q_DEPTH, 3773c7f3dcfSLiang Ma .max_num_events = OPDL_INFLIGHT_EVENTS_TOTAL, 37875d11313STimothy McDaniel .event_dev_cap = RTE_EVENT_DEV_CAP_BURST_MODE | 3798eb01fb9SBruce Richardson RTE_EVENT_DEV_CAP_ORDERED | 3808eb01fb9SBruce Richardson RTE_EVENT_DEV_CAP_ATOMIC | 3818eb01fb9SBruce Richardson RTE_EVENT_DEV_CAP_PARALLEL | 382bd991897SMattias Rönnblom RTE_EVENT_DEV_CAP_CARRY_FLOW_ID | 383bd991897SMattias Rönnblom RTE_EVENT_DEV_CAP_MAINTENANCE_FREE, 384d007a7f3SPavan Nikhilesh .max_profiles_per_port = 1, 3853c7f3dcfSLiang Ma }; 3863c7f3dcfSLiang Ma 3873c7f3dcfSLiang Ma *info = evdev_opdl_info; 3883c7f3dcfSLiang Ma } 3893c7f3dcfSLiang Ma 3903c7f3dcfSLiang Ma static void 3913c7f3dcfSLiang Ma opdl_dump(struct rte_eventdev *dev, FILE *f) 3923c7f3dcfSLiang Ma { 3933c7f3dcfSLiang Ma struct opdl_evdev *device = opdl_pmd_priv(dev); 3943c7f3dcfSLiang Ma 3953c7f3dcfSLiang Ma if (!device->do_validation) 3963c7f3dcfSLiang Ma return; 3973c7f3dcfSLiang Ma 3983c7f3dcfSLiang Ma fprintf(f, 3993c7f3dcfSLiang Ma "\n\n -- RING STATISTICS --\n"); 400be455196SHarry van Haaren uint32_t i; 401be455196SHarry van Haaren for (i = 0; i < device->nb_opdls; i++) 4023c7f3dcfSLiang Ma opdl_ring_dump(device->opdl[i], f); 4033c7f3dcfSLiang Ma 4043c7f3dcfSLiang Ma fprintf(f, 4053c7f3dcfSLiang Ma "\n\n -- PORT STATISTICS --\n" 4063c7f3dcfSLiang Ma "Type Port Index Port Id Queue Id Av. Req Size " 4073c7f3dcfSLiang Ma "Av. Grant Size Av. Cycles PP" 4083c7f3dcfSLiang Ma " Empty DEQs Non Empty DEQs Pkts Processed\n"); 4093c7f3dcfSLiang Ma 410be455196SHarry van Haaren for (i = 0; i < device->max_port_nb; i++) { 4113c7f3dcfSLiang Ma char queue_id[64]; 4123c7f3dcfSLiang Ma char total_cyc[64]; 4133c7f3dcfSLiang Ma const char *p_type; 4143c7f3dcfSLiang Ma 4153c7f3dcfSLiang Ma uint64_t cne, cpg; 4163c7f3dcfSLiang Ma struct opdl_port *port = &device->ports[i]; 4173c7f3dcfSLiang Ma 4183c7f3dcfSLiang Ma if (port->initialized) { 4193c7f3dcfSLiang Ma cne = port->port_stat[claim_non_empty]; 4203c7f3dcfSLiang Ma cpg = port->port_stat[claim_pkts_granted]; 4213c7f3dcfSLiang Ma if (port->p_type == OPDL_REGULAR_PORT) 4223c7f3dcfSLiang Ma p_type = "REG"; 4233c7f3dcfSLiang Ma else if (port->p_type == OPDL_PURE_RX_PORT) 4243c7f3dcfSLiang Ma p_type = " RX"; 4253c7f3dcfSLiang Ma else if (port->p_type == OPDL_PURE_TX_PORT) 4263c7f3dcfSLiang Ma p_type = " TX"; 4273c7f3dcfSLiang Ma else if (port->p_type == OPDL_ASYNC_PORT) 4283c7f3dcfSLiang Ma p_type = "SYNC"; 4293c7f3dcfSLiang Ma else 4303c7f3dcfSLiang Ma p_type = "????"; 4313c7f3dcfSLiang Ma 43257362ddfSPallantla Poornima snprintf(queue_id, sizeof(queue_id), "%02u", 43357362ddfSPallantla Poornima port->external_qid); 4343c7f3dcfSLiang Ma if (port->p_type == OPDL_REGULAR_PORT || 4353c7f3dcfSLiang Ma port->p_type == OPDL_ASYNC_PORT) 43657362ddfSPallantla Poornima snprintf(total_cyc, sizeof(total_cyc), 4373c7f3dcfSLiang Ma " %'16"PRIu64"", 4383c7f3dcfSLiang Ma (cpg != 0 ? 4393c7f3dcfSLiang Ma port->port_stat[total_cycles] / cpg 4403c7f3dcfSLiang Ma : 0)); 4413c7f3dcfSLiang Ma else 44257362ddfSPallantla Poornima snprintf(total_cyc, sizeof(total_cyc), 4433c7f3dcfSLiang Ma " ----"); 4443c7f3dcfSLiang Ma fprintf(f, 4453c7f3dcfSLiang Ma "%4s %10u %8u %9s %'16"PRIu64" %'16"PRIu64" %s " 4463c7f3dcfSLiang Ma "%'16"PRIu64" %'16"PRIu64" %'16"PRIu64"\n", 4473c7f3dcfSLiang Ma p_type, 4483c7f3dcfSLiang Ma i, 4493c7f3dcfSLiang Ma port->id, 4503c7f3dcfSLiang Ma (port->external_qid == OPDL_INVALID_QID ? "---" 4513c7f3dcfSLiang Ma : queue_id), 4523c7f3dcfSLiang Ma (cne != 0 ? 4533c7f3dcfSLiang Ma port->port_stat[claim_pkts_requested] / cne 4543c7f3dcfSLiang Ma : 0), 4553c7f3dcfSLiang Ma (cne != 0 ? 4563c7f3dcfSLiang Ma port->port_stat[claim_pkts_granted] / cne 4573c7f3dcfSLiang Ma : 0), 4583c7f3dcfSLiang Ma total_cyc, 4593c7f3dcfSLiang Ma port->port_stat[claim_empty], 4603c7f3dcfSLiang Ma port->port_stat[claim_non_empty], 4613c7f3dcfSLiang Ma port->port_stat[claim_pkts_granted]); 4623c7f3dcfSLiang Ma } 4633c7f3dcfSLiang Ma } 4643c7f3dcfSLiang Ma fprintf(f, "\n"); 4653c7f3dcfSLiang Ma } 4663c7f3dcfSLiang Ma 4673c7f3dcfSLiang Ma 4683c7f3dcfSLiang Ma static void 4693c7f3dcfSLiang Ma opdl_stop(struct rte_eventdev *dev) 4703c7f3dcfSLiang Ma { 4713c7f3dcfSLiang Ma struct opdl_evdev *device = opdl_pmd_priv(dev); 4723c7f3dcfSLiang Ma 4733c7f3dcfSLiang Ma opdl_xstats_uninit(dev); 4743c7f3dcfSLiang Ma 4753c7f3dcfSLiang Ma destroy_queues_and_rings(dev); 4763c7f3dcfSLiang Ma 4773c7f3dcfSLiang Ma 4783c7f3dcfSLiang Ma device->started = 0; 4793c7f3dcfSLiang Ma 4803c7f3dcfSLiang Ma rte_smp_wmb(); 4813c7f3dcfSLiang Ma } 4823c7f3dcfSLiang Ma 4833c7f3dcfSLiang Ma static int 4843c7f3dcfSLiang Ma opdl_start(struct rte_eventdev *dev) 4853c7f3dcfSLiang Ma { 4863c7f3dcfSLiang Ma int err = 0; 4873c7f3dcfSLiang Ma 4883c7f3dcfSLiang Ma if (!err) 4893c7f3dcfSLiang Ma err = create_queues_and_rings(dev); 4903c7f3dcfSLiang Ma 4913c7f3dcfSLiang Ma 4923c7f3dcfSLiang Ma if (!err) 4933c7f3dcfSLiang Ma err = assign_internal_queue_ids(dev); 4943c7f3dcfSLiang Ma 4953c7f3dcfSLiang Ma 4963c7f3dcfSLiang Ma if (!err) 4973c7f3dcfSLiang Ma err = initialise_queue_zero_ports(dev); 4983c7f3dcfSLiang Ma 4993c7f3dcfSLiang Ma 5003c7f3dcfSLiang Ma if (!err) 5013c7f3dcfSLiang Ma err = initialise_all_other_ports(dev); 5023c7f3dcfSLiang Ma 5033c7f3dcfSLiang Ma 5043c7f3dcfSLiang Ma if (!err) 5053c7f3dcfSLiang Ma err = check_queues_linked(dev); 5063c7f3dcfSLiang Ma 5073c7f3dcfSLiang Ma 5083c7f3dcfSLiang Ma if (!err) 5093c7f3dcfSLiang Ma err = opdl_add_event_handlers(dev); 5103c7f3dcfSLiang Ma 5113c7f3dcfSLiang Ma 5123c7f3dcfSLiang Ma if (!err) 5133c7f3dcfSLiang Ma err = build_all_dependencies(dev); 5143c7f3dcfSLiang Ma 5153c7f3dcfSLiang Ma if (!err) { 5163c7f3dcfSLiang Ma opdl_xstats_init(dev); 5173c7f3dcfSLiang Ma 5183c7f3dcfSLiang Ma struct opdl_evdev *device = opdl_pmd_priv(dev); 5193c7f3dcfSLiang Ma 5203c7f3dcfSLiang Ma PMD_DRV_LOG(INFO, "DEV_ID:[%02d] : " 5213c7f3dcfSLiang Ma "SUCCESS : Created %u total queues (%u ex, %u in)," 5223c7f3dcfSLiang Ma " %u opdls, %u event_dev ports, %u input ports", 5233c7f3dcfSLiang Ma opdl_pmd_dev_id(device), 5243c7f3dcfSLiang Ma device->nb_queues, 5253c7f3dcfSLiang Ma (device->nb_queues - device->nb_opdls), 5263c7f3dcfSLiang Ma device->nb_opdls, 5273c7f3dcfSLiang Ma device->nb_opdls, 5283c7f3dcfSLiang Ma device->nb_ports, 5293c7f3dcfSLiang Ma device->queue[0].nb_ports); 5303c7f3dcfSLiang Ma } else 5313c7f3dcfSLiang Ma opdl_stop(dev); 5323c7f3dcfSLiang Ma 5333c7f3dcfSLiang Ma return err; 5343c7f3dcfSLiang Ma } 5353c7f3dcfSLiang Ma 5363c7f3dcfSLiang Ma static int 5373c7f3dcfSLiang Ma opdl_close(struct rte_eventdev *dev) 5383c7f3dcfSLiang Ma { 5393c7f3dcfSLiang Ma struct opdl_evdev *device = opdl_pmd_priv(dev); 5403c7f3dcfSLiang Ma uint32_t i; 5413c7f3dcfSLiang Ma 5423c7f3dcfSLiang Ma for (i = 0; i < device->max_port_nb; i++) { 5433c7f3dcfSLiang Ma memset(&device->ports[i], 5443c7f3dcfSLiang Ma 0, 5453c7f3dcfSLiang Ma sizeof(struct opdl_port)); 5463c7f3dcfSLiang Ma } 5473c7f3dcfSLiang Ma 5483c7f3dcfSLiang Ma memset(&device->s_md, 5493c7f3dcfSLiang Ma 0x0, 5503c7f3dcfSLiang Ma sizeof(struct opdl_stage_meta_data)*OPDL_PORTS_MAX); 5513c7f3dcfSLiang Ma 5523c7f3dcfSLiang Ma memset(&device->q_md, 5533c7f3dcfSLiang Ma 0xFF, 5543c7f3dcfSLiang Ma sizeof(struct opdl_queue_meta_data)*OPDL_MAX_QUEUES); 5553c7f3dcfSLiang Ma 5563c7f3dcfSLiang Ma 5573c7f3dcfSLiang Ma memset(device->q_map_ex_to_in, 5583c7f3dcfSLiang Ma 0, 5593c7f3dcfSLiang Ma sizeof(uint8_t)*OPDL_INVALID_QID); 5603c7f3dcfSLiang Ma 5613c7f3dcfSLiang Ma opdl_xstats_uninit(dev); 5623c7f3dcfSLiang Ma 5633c7f3dcfSLiang Ma device->max_port_nb = 0; 5643c7f3dcfSLiang Ma 5653c7f3dcfSLiang Ma device->max_queue_nb = 0; 5663c7f3dcfSLiang Ma 5673c7f3dcfSLiang Ma device->nb_opdls = 0; 5683c7f3dcfSLiang Ma 5693c7f3dcfSLiang Ma device->nb_queues = 0; 5703c7f3dcfSLiang Ma 5713c7f3dcfSLiang Ma device->nb_ports = 0; 5723c7f3dcfSLiang Ma 5733c7f3dcfSLiang Ma device->nb_q_md = 0; 5743c7f3dcfSLiang Ma 5753c7f3dcfSLiang Ma dev->data->nb_queues = 0; 5763c7f3dcfSLiang Ma 5773c7f3dcfSLiang Ma dev->data->nb_ports = 0; 5783c7f3dcfSLiang Ma 5793c7f3dcfSLiang Ma 5803c7f3dcfSLiang Ma return 0; 5813c7f3dcfSLiang Ma } 5823c7f3dcfSLiang Ma 5833c7f3dcfSLiang Ma static int 5843c7f3dcfSLiang Ma assign_numa_node(const char *key __rte_unused, const char *value, void *opaque) 5853c7f3dcfSLiang Ma { 5863c7f3dcfSLiang Ma int *socket_id = opaque; 5873c7f3dcfSLiang Ma *socket_id = atoi(value); 5883c7f3dcfSLiang Ma if (*socket_id >= RTE_MAX_NUMA_NODES) 5893c7f3dcfSLiang Ma return -1; 5903c7f3dcfSLiang Ma return 0; 5913c7f3dcfSLiang Ma } 5923c7f3dcfSLiang Ma 5933c7f3dcfSLiang Ma static int 5943c7f3dcfSLiang Ma set_do_validation(const char *key __rte_unused, const char *value, void *opaque) 5953c7f3dcfSLiang Ma { 5963c7f3dcfSLiang Ma int *do_val = opaque; 5973c7f3dcfSLiang Ma *do_val = atoi(value); 5983c7f3dcfSLiang Ma if (*do_val != 0) 5993c7f3dcfSLiang Ma *do_val = 1; 6003c7f3dcfSLiang Ma 6013c7f3dcfSLiang Ma return 0; 6023c7f3dcfSLiang Ma } 6033c7f3dcfSLiang Ma static int 6043c7f3dcfSLiang Ma set_do_test(const char *key __rte_unused, const char *value, void *opaque) 6053c7f3dcfSLiang Ma { 6063c7f3dcfSLiang Ma int *do_test = opaque; 6073c7f3dcfSLiang Ma 6083c7f3dcfSLiang Ma *do_test = atoi(value); 6093c7f3dcfSLiang Ma 6103c7f3dcfSLiang Ma if (*do_test != 0) 6113c7f3dcfSLiang Ma *do_test = 1; 6123c7f3dcfSLiang Ma return 0; 6133c7f3dcfSLiang Ma } 6143c7f3dcfSLiang Ma 6153c7f3dcfSLiang Ma static int 6163c7f3dcfSLiang Ma opdl_probe(struct rte_vdev_device *vdev) 6173c7f3dcfSLiang Ma { 61823d06e37SPavan Nikhilesh static struct eventdev_ops evdev_opdl_ops = { 6193c7f3dcfSLiang Ma .dev_configure = opdl_dev_configure, 6203c7f3dcfSLiang Ma .dev_infos_get = opdl_info_get, 6213c7f3dcfSLiang Ma .dev_close = opdl_close, 6223c7f3dcfSLiang Ma .dev_start = opdl_start, 6233c7f3dcfSLiang Ma .dev_stop = opdl_stop, 6243c7f3dcfSLiang Ma .dump = opdl_dump, 6253c7f3dcfSLiang Ma 6268ca8e3b4SLiang Ma .queue_def_conf = opdl_queue_def_conf, 6278ca8e3b4SLiang Ma .queue_setup = opdl_queue_setup, 6288ca8e3b4SLiang Ma .queue_release = opdl_queue_release, 6290bf298e3SLiang Ma .port_def_conf = opdl_port_def_conf, 6300bf298e3SLiang Ma .port_setup = opdl_port_setup, 6310bf298e3SLiang Ma .port_release = opdl_port_release, 6320bf298e3SLiang Ma .port_link = opdl_port_link, 6330bf298e3SLiang Ma .port_unlink = opdl_port_unlink, 6340bf298e3SLiang Ma 6358ca8e3b4SLiang Ma 6363c7f3dcfSLiang Ma .xstats_get = opdl_xstats_get, 6373c7f3dcfSLiang Ma .xstats_get_names = opdl_xstats_get_names, 6383c7f3dcfSLiang Ma .xstats_get_by_name = opdl_xstats_get_by_name, 6393c7f3dcfSLiang Ma .xstats_reset = opdl_xstats_reset, 6403c7f3dcfSLiang Ma }; 6413c7f3dcfSLiang Ma 6423c7f3dcfSLiang Ma static const char *const args[] = { 6433c7f3dcfSLiang Ma NUMA_NODE_ARG, 6443c7f3dcfSLiang Ma DO_VALIDATION_ARG, 6453c7f3dcfSLiang Ma DO_TEST_ARG, 6463c7f3dcfSLiang Ma NULL 6473c7f3dcfSLiang Ma }; 6483c7f3dcfSLiang Ma const char *name; 6493c7f3dcfSLiang Ma const char *params; 6503c7f3dcfSLiang Ma struct rte_eventdev *dev; 6513c7f3dcfSLiang Ma struct opdl_evdev *opdl; 6523c7f3dcfSLiang Ma int socket_id = rte_socket_id(); 6533c7f3dcfSLiang Ma int do_validation = 0; 6543c7f3dcfSLiang Ma int do_test = 0; 6553c7f3dcfSLiang Ma int str_len; 6563c7f3dcfSLiang Ma int test_result = 0; 6573c7f3dcfSLiang Ma 6583c7f3dcfSLiang Ma name = rte_vdev_device_name(vdev); 6593c7f3dcfSLiang Ma params = rte_vdev_device_args(vdev); 6603c7f3dcfSLiang Ma if (params != NULL && params[0] != '\0') { 6613c7f3dcfSLiang Ma struct rte_kvargs *kvlist = rte_kvargs_parse(params, args); 6623c7f3dcfSLiang Ma 6633c7f3dcfSLiang Ma if (!kvlist) { 6643c7f3dcfSLiang Ma PMD_DRV_LOG(INFO, 665*f665790aSDavid Marchand "Ignoring unsupported parameters when creating device '%s'", 6663c7f3dcfSLiang Ma name); 6673c7f3dcfSLiang Ma } else { 6683c7f3dcfSLiang Ma int ret = rte_kvargs_process(kvlist, NUMA_NODE_ARG, 6693c7f3dcfSLiang Ma assign_numa_node, &socket_id); 6703c7f3dcfSLiang Ma if (ret != 0) { 6713c7f3dcfSLiang Ma PMD_DRV_LOG(ERR, 6723c7f3dcfSLiang Ma "%s: Error parsing numa node parameter", 6733c7f3dcfSLiang Ma name); 6743c7f3dcfSLiang Ma 6753c7f3dcfSLiang Ma rte_kvargs_free(kvlist); 6763c7f3dcfSLiang Ma return ret; 6773c7f3dcfSLiang Ma } 6783c7f3dcfSLiang Ma 6793c7f3dcfSLiang Ma ret = rte_kvargs_process(kvlist, DO_VALIDATION_ARG, 6803c7f3dcfSLiang Ma set_do_validation, &do_validation); 6813c7f3dcfSLiang Ma if (ret != 0) { 6823c7f3dcfSLiang Ma PMD_DRV_LOG(ERR, 6833c7f3dcfSLiang Ma "%s: Error parsing do validation parameter", 6843c7f3dcfSLiang Ma name); 6853c7f3dcfSLiang Ma rte_kvargs_free(kvlist); 6863c7f3dcfSLiang Ma return ret; 6873c7f3dcfSLiang Ma } 6883c7f3dcfSLiang Ma 6893c7f3dcfSLiang Ma ret = rte_kvargs_process(kvlist, DO_TEST_ARG, 6903c7f3dcfSLiang Ma set_do_test, &do_test); 6913c7f3dcfSLiang Ma if (ret != 0) { 6923c7f3dcfSLiang Ma PMD_DRV_LOG(ERR, 6933c7f3dcfSLiang Ma "%s: Error parsing do test parameter", 6943c7f3dcfSLiang Ma name); 6953c7f3dcfSLiang Ma rte_kvargs_free(kvlist); 6963c7f3dcfSLiang Ma return ret; 6973c7f3dcfSLiang Ma } 6983c7f3dcfSLiang Ma 6993c7f3dcfSLiang Ma rte_kvargs_free(kvlist); 7003c7f3dcfSLiang Ma } 7013c7f3dcfSLiang Ma } 7023c7f3dcfSLiang Ma dev = rte_event_pmd_vdev_init(name, 703928b5c70SBruce Richardson sizeof(struct opdl_evdev), socket_id, vdev); 7043c7f3dcfSLiang Ma 7053c7f3dcfSLiang Ma if (dev == NULL) { 7063c7f3dcfSLiang Ma PMD_DRV_LOG(ERR, "eventdev vdev init() failed"); 7073c7f3dcfSLiang Ma return -EFAULT; 7083c7f3dcfSLiang Ma } 7093c7f3dcfSLiang Ma 7103c7f3dcfSLiang Ma PMD_DRV_LOG(INFO, "DEV_ID:[%02d] : " 7117be78d02SJosh Soref "Success - creating eventdev device %s, numa_node:[%d], do_validation:[%s]" 712*f665790aSDavid Marchand " , self_test:[%s]", 7133c7f3dcfSLiang Ma dev->data->dev_id, 7143c7f3dcfSLiang Ma name, 7153c7f3dcfSLiang Ma socket_id, 7163c7f3dcfSLiang Ma (do_validation ? "true" : "false"), 7173c7f3dcfSLiang Ma (do_test ? "true" : "false")); 7183c7f3dcfSLiang Ma 7193c7f3dcfSLiang Ma dev->dev_ops = &evdev_opdl_ops; 7203c7f3dcfSLiang Ma 7218ca5fad5SLiang Ma dev->enqueue_burst = opdl_event_enqueue_burst; 7228ca5fad5SLiang Ma dev->enqueue_new_burst = opdl_event_enqueue_burst; 7238ca5fad5SLiang Ma dev->enqueue_forward_burst = opdl_event_enqueue_burst; 7248ca5fad5SLiang Ma dev->dequeue_burst = opdl_event_dequeue_burst; 7258ca5fad5SLiang Ma 7263c7f3dcfSLiang Ma if (rte_eal_process_type() != RTE_PROC_PRIMARY) 72785be9971SPavan Nikhilesh goto done; 7283c7f3dcfSLiang Ma 7293c7f3dcfSLiang Ma opdl = dev->data->dev_private; 7303c7f3dcfSLiang Ma opdl->data = dev->data; 7313c7f3dcfSLiang Ma opdl->socket = socket_id; 7323c7f3dcfSLiang Ma opdl->do_validation = do_validation; 7333c7f3dcfSLiang Ma opdl->do_test = do_test; 7343c7f3dcfSLiang Ma str_len = strlen(name); 7353c7f3dcfSLiang Ma memcpy(opdl->service_name, name, str_len); 7363c7f3dcfSLiang Ma 737d548ef51SLiang Ma if (do_test == 1) 738d548ef51SLiang Ma test_result = opdl_selftest(); 739d548ef51SLiang Ma 74085be9971SPavan Nikhilesh done: 74185be9971SPavan Nikhilesh event_dev_probing_finish(dev); 7423c7f3dcfSLiang Ma return test_result; 7433c7f3dcfSLiang Ma } 7443c7f3dcfSLiang Ma 7453c7f3dcfSLiang Ma static int 7463c7f3dcfSLiang Ma opdl_remove(struct rte_vdev_device *vdev) 7473c7f3dcfSLiang Ma { 7483c7f3dcfSLiang Ma const char *name; 7493c7f3dcfSLiang Ma 7503c7f3dcfSLiang Ma name = rte_vdev_device_name(vdev); 7513c7f3dcfSLiang Ma if (name == NULL) 7523c7f3dcfSLiang Ma return -EINVAL; 7533c7f3dcfSLiang Ma 754*f665790aSDavid Marchand PMD_DRV_LOG(INFO, "Closing eventdev opdl device %s", name); 7553c7f3dcfSLiang Ma 7563c7f3dcfSLiang Ma return rte_event_pmd_vdev_uninit(name); 7573c7f3dcfSLiang Ma } 7583c7f3dcfSLiang Ma 7593c7f3dcfSLiang Ma static struct rte_vdev_driver evdev_opdl_pmd_drv = { 7603c7f3dcfSLiang Ma .probe = opdl_probe, 7613c7f3dcfSLiang Ma .remove = opdl_remove 7623c7f3dcfSLiang Ma }; 7633c7f3dcfSLiang Ma 764eeded204SDavid Marchand RTE_LOG_REGISTER_SUFFIX(opdl_logtype_driver, driver, INFO); 7653c7f3dcfSLiang Ma 7663c7f3dcfSLiang Ma RTE_PMD_REGISTER_VDEV(EVENTDEV_NAME_OPDL_PMD, evdev_opdl_pmd_drv); 7673c7f3dcfSLiang Ma RTE_PMD_REGISTER_PARAM_STRING(event_opdl, NUMA_NODE_ARG "=<int>" 7683c7f3dcfSLiang Ma DO_VALIDATION_ARG "=<int>" DO_TEST_ARG "=<int>"); 769