xref: /dpdk/drivers/event/skeleton/skeleton_eventdev.c (revision 5079ede71edeed44c6c25e9ceffcd342940b309f)
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