xref: /dpdk/lib/eventdev/eventdev_pmd_pci.h (revision 1acb7f547455f636a6968cb3b4ca3870279dfece)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2016-2017 Cavium, Inc
3  */
4 
5 #ifndef _RTE_EVENTDEV_PMD_PCI_H_
6 #define _RTE_EVENTDEV_PMD_PCI_H_
7 
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11 
12 /** @file
13  * RTE Eventdev PCI PMD APIs
14  *
15  * @note
16  * These API are from event PCI PMD only and user applications should not call
17  * them directly.
18  */
19 
20 #include <string.h>
21 
22 #include <rte_config.h>
23 #include <rte_eal.h>
24 #include <rte_lcore.h>
25 #include <rte_pci.h>
26 #include <bus_pci_driver.h>
27 
28 #include "eventdev_pmd.h"
29 
30 typedef int (*eventdev_pmd_pci_callback_t)(struct rte_eventdev *dev);
31 
32 /**
33  * @internal
34  * Wrapper for use by pci drivers as a .probe function to attach to an event
35  * interface.  Same as rte_event_pmd_pci_probe, except caller can specify
36  * the name.
37  */
38 __rte_internal
39 static inline int
40 rte_event_pmd_pci_probe_named(struct rte_pci_driver *pci_drv,
41 			      struct rte_pci_device *pci_dev,
42 			      size_t private_data_size,
43 			      eventdev_pmd_pci_callback_t devinit,
44 			      const char *name)
45 {
46 	struct rte_eventdev *eventdev;
47 	int retval;
48 
49 	if (devinit == NULL)
50 		return -EINVAL;
51 
52 	eventdev = rte_event_pmd_allocate(name,
53 			 pci_dev->device.numa_node);
54 	if (eventdev == NULL)
55 		return -ENOMEM;
56 
57 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
58 		eventdev->data->dev_private =
59 				rte_zmalloc_socket(
60 						"eventdev private structure",
61 						private_data_size,
62 						RTE_CACHE_LINE_SIZE,
63 						rte_socket_id());
64 
65 		if (eventdev->data->dev_private == NULL)
66 			rte_panic("Cannot allocate memzone for private "
67 					"device data");
68 	}
69 
70 	eventdev->dev = &pci_dev->device;
71 
72 	/* Invoke PMD device initialization function */
73 	retval = devinit(eventdev);
74 	if (retval == 0) {
75 		event_dev_probing_finish(eventdev);
76 		return 0;
77 	}
78 
79 	RTE_EDEV_LOG_ERR("driver %s: (vendor_id=0x%x device_id=0x%x)"
80 			" failed", pci_drv->driver.name,
81 			(unsigned int) pci_dev->id.vendor_id,
82 			(unsigned int) pci_dev->id.device_id);
83 
84 	rte_event_pmd_release(eventdev);
85 
86 	return -ENXIO;
87 }
88 
89 /**
90  * @internal
91  * Wrapper for use by pci drivers as a .probe function to attach to a event
92  * interface.
93  */
94 __rte_internal
95 static inline int
96 rte_event_pmd_pci_probe(struct rte_pci_driver *pci_drv,
97 			    struct rte_pci_device *pci_dev,
98 			    size_t private_data_size,
99 			    eventdev_pmd_pci_callback_t devinit)
100 {
101 	char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN];
102 
103 	rte_pci_device_name(&pci_dev->addr, eventdev_name,
104 			sizeof(eventdev_name));
105 
106 	return rte_event_pmd_pci_probe_named(pci_drv,
107 					     pci_dev,
108 					     private_data_size,
109 					     devinit,
110 					     eventdev_name);
111 }
112 
113 /**
114  * @internal
115  * Wrapper for use by pci drivers as a .remove function to detach a event
116  * interface.
117  */
118 __rte_internal
119 static inline int
120 rte_event_pmd_pci_remove(struct rte_pci_device *pci_dev,
121 			     eventdev_pmd_pci_callback_t devuninit)
122 {
123 	struct rte_eventdev *eventdev;
124 	char eventdev_name[RTE_EVENTDEV_NAME_MAX_LEN];
125 	int ret = 0;
126 
127 	if (pci_dev == NULL)
128 		return -EINVAL;
129 
130 	rte_pci_device_name(&pci_dev->addr, eventdev_name,
131 			sizeof(eventdev_name));
132 
133 	eventdev = rte_event_pmd_get_named_dev(eventdev_name);
134 	if (eventdev == NULL)
135 		return -ENODEV;
136 
137 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
138 		ret = rte_event_dev_close(eventdev->data->dev_id);
139 		if (ret < 0)
140 			return ret;
141 	}
142 
143 	/* Invoke PMD device un-init function */
144 	if (devuninit)
145 		ret = devuninit(eventdev);
146 	if (ret)
147 		return ret;
148 
149 	/* Free event device */
150 	rte_event_pmd_release(eventdev);
151 
152 	eventdev->dev = NULL;
153 
154 	return 0;
155 }
156 
157 #ifdef __cplusplus
158 }
159 #endif
160 
161 #endif /* _RTE_EVENTDEV_PMD_PCI_H_ */
162