xref: /spdk/lib/env_dpdk/22.07/rte_dev.h (revision 1eb35ac7e3d817550ea55df280c420bc3ad328cc)
1*1eb35ac7SJim Harris /* SPDX-License-Identifier: BSD-3-Clause
2*1eb35ac7SJim Harris  * Copyright(c) 2014 6WIND S.A.
3*1eb35ac7SJim Harris  */
4*1eb35ac7SJim Harris 
5*1eb35ac7SJim Harris #ifndef _RTE_DEV_H_
6*1eb35ac7SJim Harris #define _RTE_DEV_H_
7*1eb35ac7SJim Harris 
8*1eb35ac7SJim Harris /**
9*1eb35ac7SJim Harris  * @file
10*1eb35ac7SJim Harris  *
11*1eb35ac7SJim Harris  * RTE PMD Registration Interface
12*1eb35ac7SJim Harris  *
13*1eb35ac7SJim Harris  * This file manages the list of device drivers.
14*1eb35ac7SJim Harris  */
15*1eb35ac7SJim Harris 
16*1eb35ac7SJim Harris #ifdef __cplusplus
17*1eb35ac7SJim Harris extern "C" {
18*1eb35ac7SJim Harris #endif
19*1eb35ac7SJim Harris 
20*1eb35ac7SJim Harris #include <stdio.h>
21*1eb35ac7SJim Harris 
22*1eb35ac7SJim Harris #include <rte_config.h>
23*1eb35ac7SJim Harris #include <rte_compat.h>
24*1eb35ac7SJim Harris #include <rte_log.h>
25*1eb35ac7SJim Harris 
26*1eb35ac7SJim Harris /**
27*1eb35ac7SJim Harris  * The device event type.
28*1eb35ac7SJim Harris  */
29*1eb35ac7SJim Harris enum rte_dev_event_type {
30*1eb35ac7SJim Harris 	RTE_DEV_EVENT_ADD,	/**< device being added */
31*1eb35ac7SJim Harris 	RTE_DEV_EVENT_REMOVE,	/**< device being removed */
32*1eb35ac7SJim Harris 	RTE_DEV_EVENT_MAX	/**< max value of this enum */
33*1eb35ac7SJim Harris };
34*1eb35ac7SJim Harris 
35*1eb35ac7SJim Harris typedef void (*rte_dev_event_cb_fn)(const char *device_name,
36*1eb35ac7SJim Harris 					enum rte_dev_event_type event,
37*1eb35ac7SJim Harris 					void *cb_arg);
38*1eb35ac7SJim Harris 
39*1eb35ac7SJim Harris /* Macros to check for invalid function pointers */
40*1eb35ac7SJim Harris #define RTE_FUNC_PTR_OR_ERR_RET(func, retval) do { \
41*1eb35ac7SJim Harris 	if ((func) == NULL) \
42*1eb35ac7SJim Harris 		return retval; \
43*1eb35ac7SJim Harris } while (0)
44*1eb35ac7SJim Harris 
45*1eb35ac7SJim Harris #define RTE_FUNC_PTR_OR_RET(func) do { \
46*1eb35ac7SJim Harris 	if ((func) == NULL) \
47*1eb35ac7SJim Harris 		return; \
48*1eb35ac7SJim Harris } while (0)
49*1eb35ac7SJim Harris 
50*1eb35ac7SJim Harris /**
51*1eb35ac7SJim Harris  * Device policies.
52*1eb35ac7SJim Harris  */
53*1eb35ac7SJim Harris enum rte_dev_policy {
54*1eb35ac7SJim Harris 	RTE_DEV_ALLOWED,
55*1eb35ac7SJim Harris 	RTE_DEV_BLOCKED,
56*1eb35ac7SJim Harris };
57*1eb35ac7SJim Harris 
58*1eb35ac7SJim Harris /**
59*1eb35ac7SJim Harris  * A generic memory resource representation.
60*1eb35ac7SJim Harris  */
61*1eb35ac7SJim Harris struct rte_mem_resource {
62*1eb35ac7SJim Harris 	uint64_t phys_addr; /**< Physical address, 0 if not resource. */
63*1eb35ac7SJim Harris 	uint64_t len;       /**< Length of the resource. */
64*1eb35ac7SJim Harris 	void *addr;         /**< Virtual address, NULL when not mapped. */
65*1eb35ac7SJim Harris };
66*1eb35ac7SJim Harris 
67*1eb35ac7SJim Harris /**
68*1eb35ac7SJim Harris  * A structure describing a device driver.
69*1eb35ac7SJim Harris  */
70*1eb35ac7SJim Harris struct rte_driver {
71*1eb35ac7SJim Harris 	RTE_TAILQ_ENTRY(rte_driver) next; /**< Next in list. */
72*1eb35ac7SJim Harris 	const char *name;                   /**< Driver name. */
73*1eb35ac7SJim Harris 	const char *alias;              /**< Driver alias. */
74*1eb35ac7SJim Harris };
75*1eb35ac7SJim Harris 
76*1eb35ac7SJim Harris /*
77*1eb35ac7SJim Harris  * Internal identifier length
78*1eb35ac7SJim Harris  * Sufficiently large to allow for UUID or PCI address
79*1eb35ac7SJim Harris  */
80*1eb35ac7SJim Harris #define RTE_DEV_NAME_MAX_LEN 64
81*1eb35ac7SJim Harris 
82*1eb35ac7SJim Harris /**
83*1eb35ac7SJim Harris  * A structure describing a generic device.
84*1eb35ac7SJim Harris  */
85*1eb35ac7SJim Harris struct rte_device {
86*1eb35ac7SJim Harris 	RTE_TAILQ_ENTRY(rte_device) next; /**< Next device */
87*1eb35ac7SJim Harris 	const char *name;             /**< Device name */
88*1eb35ac7SJim Harris 	const struct rte_driver *driver; /**< Driver assigned after probing */
89*1eb35ac7SJim Harris 	const struct rte_bus *bus;    /**< Bus handle assigned on scan */
90*1eb35ac7SJim Harris 	int numa_node;                /**< NUMA node connection */
91*1eb35ac7SJim Harris 	struct rte_devargs *devargs;  /**< Arguments for latest probing */
92*1eb35ac7SJim Harris };
93*1eb35ac7SJim Harris 
94*1eb35ac7SJim Harris /**
95*1eb35ac7SJim Harris  * Query status of a device.
96*1eb35ac7SJim Harris  *
97*1eb35ac7SJim Harris  * @param dev
98*1eb35ac7SJim Harris  *   Generic device pointer.
99*1eb35ac7SJim Harris  * @return
100*1eb35ac7SJim Harris  *   (int)true if already probed successfully, 0 otherwise.
101*1eb35ac7SJim Harris  */
102*1eb35ac7SJim Harris int rte_dev_is_probed(const struct rte_device *dev);
103*1eb35ac7SJim Harris 
104*1eb35ac7SJim Harris /**
105*1eb35ac7SJim Harris  * Hotplug add a given device to a specific bus.
106*1eb35ac7SJim Harris  *
107*1eb35ac7SJim Harris  * In multi-process, it will request other processes to add the same device.
108*1eb35ac7SJim Harris  * A failure, in any process, will rollback the action
109*1eb35ac7SJim Harris  *
110*1eb35ac7SJim Harris  * @param busname
111*1eb35ac7SJim Harris  *   The bus name the device is added to.
112*1eb35ac7SJim Harris  * @param devname
113*1eb35ac7SJim Harris  *   The device name. Based on this device name, eal will identify a driver
114*1eb35ac7SJim Harris  *   capable of handling it and pass it to the driver probing function.
115*1eb35ac7SJim Harris  * @param drvargs
116*1eb35ac7SJim Harris  *   Device arguments to be passed to the driver.
117*1eb35ac7SJim Harris  * @return
118*1eb35ac7SJim Harris  *   0 on success, negative on error.
119*1eb35ac7SJim Harris  */
120*1eb35ac7SJim Harris int rte_eal_hotplug_add(const char *busname, const char *devname,
121*1eb35ac7SJim Harris 			const char *drvargs);
122*1eb35ac7SJim Harris 
123*1eb35ac7SJim Harris /**
124*1eb35ac7SJim Harris  * Add matching devices.
125*1eb35ac7SJim Harris  *
126*1eb35ac7SJim Harris  * In multi-process, it will request other processes to add the same device.
127*1eb35ac7SJim Harris  * A failure, in any process, will rollback the action
128*1eb35ac7SJim Harris  *
129*1eb35ac7SJim Harris  * @param devargs
130*1eb35ac7SJim Harris  *   Device arguments including bus, class and driver properties.
131*1eb35ac7SJim Harris  * @return
132*1eb35ac7SJim Harris  *   0 on success, negative on error.
133*1eb35ac7SJim Harris  */
134*1eb35ac7SJim Harris int rte_dev_probe(const char *devargs);
135*1eb35ac7SJim Harris 
136*1eb35ac7SJim Harris /**
137*1eb35ac7SJim Harris  * Hotplug remove a given device from a specific bus.
138*1eb35ac7SJim Harris  *
139*1eb35ac7SJim Harris  * In multi-process, it will request other processes to remove the same device.
140*1eb35ac7SJim Harris  * A failure, in any process, will rollback the action
141*1eb35ac7SJim Harris  *
142*1eb35ac7SJim Harris  * @param busname
143*1eb35ac7SJim Harris  *   The bus name the device is removed from.
144*1eb35ac7SJim Harris  * @param devname
145*1eb35ac7SJim Harris  *   The device name being removed.
146*1eb35ac7SJim Harris  * @return
147*1eb35ac7SJim Harris  *   0 on success, negative on error.
148*1eb35ac7SJim Harris  */
149*1eb35ac7SJim Harris int rte_eal_hotplug_remove(const char *busname, const char *devname);
150*1eb35ac7SJim Harris 
151*1eb35ac7SJim Harris /**
152*1eb35ac7SJim Harris  * Remove one device.
153*1eb35ac7SJim Harris  *
154*1eb35ac7SJim Harris  * In multi-process, it will request other processes to remove the same device.
155*1eb35ac7SJim Harris  * A failure, in any process, will rollback the action
156*1eb35ac7SJim Harris  *
157*1eb35ac7SJim Harris  * @param dev
158*1eb35ac7SJim Harris  *   Data structure of the device to remove.
159*1eb35ac7SJim Harris  * @return
160*1eb35ac7SJim Harris  *   0 on success, negative on error.
161*1eb35ac7SJim Harris  */
162*1eb35ac7SJim Harris int rte_dev_remove(struct rte_device *dev);
163*1eb35ac7SJim Harris 
164*1eb35ac7SJim Harris /**
165*1eb35ac7SJim Harris  * Device comparison function.
166*1eb35ac7SJim Harris  *
167*1eb35ac7SJim Harris  * This type of function is used to compare an rte_device with arbitrary
168*1eb35ac7SJim Harris  * data.
169*1eb35ac7SJim Harris  *
170*1eb35ac7SJim Harris  * @param dev
171*1eb35ac7SJim Harris  *   Device handle.
172*1eb35ac7SJim Harris  *
173*1eb35ac7SJim Harris  * @param data
174*1eb35ac7SJim Harris  *   Data to compare against. The type of this parameter is determined by
175*1eb35ac7SJim Harris  *   the kind of comparison performed by the function.
176*1eb35ac7SJim Harris  *
177*1eb35ac7SJim Harris  * @return
178*1eb35ac7SJim Harris  *   0 if the device matches the data.
179*1eb35ac7SJim Harris  *   !0 if the device does not match.
180*1eb35ac7SJim Harris  *   <0 if ordering is possible and the device is lower than the data.
181*1eb35ac7SJim Harris  *   >0 if ordering is possible and the device is greater than the data.
182*1eb35ac7SJim Harris  */
183*1eb35ac7SJim Harris typedef int (*rte_dev_cmp_t)(const struct rte_device *dev, const void *data);
184*1eb35ac7SJim Harris 
185*1eb35ac7SJim Harris #define RTE_PMD_EXPORT_NAME_ARRAY(n, idx) n##idx[]
186*1eb35ac7SJim Harris 
187*1eb35ac7SJim Harris #define RTE_PMD_EXPORT_NAME(name, idx) \
188*1eb35ac7SJim Harris static const char RTE_PMD_EXPORT_NAME_ARRAY(this_pmd_name, idx) \
189*1eb35ac7SJim Harris __rte_used = RTE_STR(name)
190*1eb35ac7SJim Harris 
191*1eb35ac7SJim Harris #define DRV_EXP_TAG(name, tag) __##name##_##tag
192*1eb35ac7SJim Harris 
193*1eb35ac7SJim Harris #define RTE_PMD_REGISTER_PCI_TABLE(name, table) \
194*1eb35ac7SJim Harris static const char DRV_EXP_TAG(name, pci_tbl_export)[] __rte_used = \
195*1eb35ac7SJim Harris RTE_STR(table)
196*1eb35ac7SJim Harris 
197*1eb35ac7SJim Harris #define RTE_PMD_REGISTER_PARAM_STRING(name, str) \
198*1eb35ac7SJim Harris static const char DRV_EXP_TAG(name, param_string_export)[] \
199*1eb35ac7SJim Harris __rte_used = str
200*1eb35ac7SJim Harris 
201*1eb35ac7SJim Harris /**
202*1eb35ac7SJim Harris  * Advertise the list of kernel modules required to run this driver
203*1eb35ac7SJim Harris  *
204*1eb35ac7SJim Harris  * This string lists the kernel modules required for the devices
205*1eb35ac7SJim Harris  * associated to a PMD. The format of each line of the string is:
206*1eb35ac7SJim Harris  * "<device-pattern> <kmod-expression>".
207*1eb35ac7SJim Harris  *
208*1eb35ac7SJim Harris  * The possible formats for the device pattern are:
209*1eb35ac7SJim Harris  *   "*"                     all devices supported by this driver
210*1eb35ac7SJim Harris  *   "pci:*"                 all PCI devices supported by this driver
211*1eb35ac7SJim Harris  *   "pci:v8086:d*:sv*:sd*"  all PCI devices supported by this driver
212*1eb35ac7SJim Harris  *                           whose vendor id is 0x8086.
213*1eb35ac7SJim Harris  *
214*1eb35ac7SJim Harris  * The format of the kernel modules list is a parenthesized expression
215*1eb35ac7SJim Harris  * containing logical-and (&) and logical-or (|).
216*1eb35ac7SJim Harris  *
217*1eb35ac7SJim Harris  * The device pattern and the kmod expression are separated by a space.
218*1eb35ac7SJim Harris  *
219*1eb35ac7SJim Harris  * Example:
220*1eb35ac7SJim Harris  * - "* igb_uio | uio_pci_generic | vfio"
221*1eb35ac7SJim Harris  */
222*1eb35ac7SJim Harris #define RTE_PMD_REGISTER_KMOD_DEP(name, str) \
223*1eb35ac7SJim Harris static const char DRV_EXP_TAG(name, kmod_dep_export)[] \
224*1eb35ac7SJim Harris __rte_used = str
225*1eb35ac7SJim Harris 
226*1eb35ac7SJim Harris /**
227*1eb35ac7SJim Harris  * Iteration context.
228*1eb35ac7SJim Harris  *
229*1eb35ac7SJim Harris  * This context carries over the current iteration state.
230*1eb35ac7SJim Harris  */
231*1eb35ac7SJim Harris struct rte_dev_iterator {
232*1eb35ac7SJim Harris 	const char *dev_str; /**< device string. */
233*1eb35ac7SJim Harris 	const char *bus_str; /**< bus-related part of device string. */
234*1eb35ac7SJim Harris 	const char *cls_str; /**< class-related part of device string. */
235*1eb35ac7SJim Harris 	struct rte_bus *bus; /**< bus handle. */
236*1eb35ac7SJim Harris 	struct rte_class *cls; /**< class handle. */
237*1eb35ac7SJim Harris 	struct rte_device *device; /**< current position. */
238*1eb35ac7SJim Harris 	void *class_device; /**< additional specialized context. */
239*1eb35ac7SJim Harris };
240*1eb35ac7SJim Harris 
241*1eb35ac7SJim Harris /**
242*1eb35ac7SJim Harris  * Device iteration function.
243*1eb35ac7SJim Harris  *
244*1eb35ac7SJim Harris  * Find the next device matching properties passed in parameters.
245*1eb35ac7SJim Harris  * The function takes an additional ``start`` parameter, that is
246*1eb35ac7SJim Harris  * used as starting context when relevant.
247*1eb35ac7SJim Harris  *
248*1eb35ac7SJim Harris  * The function returns the current element in the iteration.
249*1eb35ac7SJim Harris  * This return value will potentially be used as a start parameter
250*1eb35ac7SJim Harris  * in subsequent calls to the function.
251*1eb35ac7SJim Harris  *
252*1eb35ac7SJim Harris  * The additional iterator parameter is only there if a specific
253*1eb35ac7SJim Harris  * implementation needs additional context. It must not be modified by
254*1eb35ac7SJim Harris  * the iteration function itself.
255*1eb35ac7SJim Harris  *
256*1eb35ac7SJim Harris  * @param start
257*1eb35ac7SJim Harris  *   Starting iteration context.
258*1eb35ac7SJim Harris  *
259*1eb35ac7SJim Harris  * @param devstr
260*1eb35ac7SJim Harris  *   Device description string.
261*1eb35ac7SJim Harris  *
262*1eb35ac7SJim Harris  * @param it
263*1eb35ac7SJim Harris  *   Device iterator.
264*1eb35ac7SJim Harris  *
265*1eb35ac7SJim Harris  * @return
266*1eb35ac7SJim Harris  *   The address of the current element matching the device description
267*1eb35ac7SJim Harris  *   string.
268*1eb35ac7SJim Harris  */
269*1eb35ac7SJim Harris typedef void *(*rte_dev_iterate_t)(const void *start,
270*1eb35ac7SJim Harris 				   const char *devstr,
271*1eb35ac7SJim Harris 				   const struct rte_dev_iterator *it);
272*1eb35ac7SJim Harris 
273*1eb35ac7SJim Harris /**
274*1eb35ac7SJim Harris  * Initializes a device iterator.
275*1eb35ac7SJim Harris  *
276*1eb35ac7SJim Harris  * This iterator allows accessing a list of devices matching a criteria.
277*1eb35ac7SJim Harris  * The device matching is made among all buses and classes currently registered,
278*1eb35ac7SJim Harris  * filtered by the device description given as parameter.
279*1eb35ac7SJim Harris  *
280*1eb35ac7SJim Harris  * This function will not allocate any memory. It is safe to stop the
281*1eb35ac7SJim Harris  * iteration at any moment and let the iterator go out of context.
282*1eb35ac7SJim Harris  *
283*1eb35ac7SJim Harris  * @param it
284*1eb35ac7SJim Harris  *   Device iterator handle.
285*1eb35ac7SJim Harris  *
286*1eb35ac7SJim Harris  * @param str
287*1eb35ac7SJim Harris  *   Device description string.
288*1eb35ac7SJim Harris  *
289*1eb35ac7SJim Harris  * @return
290*1eb35ac7SJim Harris  *   0 on successful initialization.
291*1eb35ac7SJim Harris  *   <0 on error.
292*1eb35ac7SJim Harris  */
293*1eb35ac7SJim Harris __rte_experimental
294*1eb35ac7SJim Harris int
295*1eb35ac7SJim Harris rte_dev_iterator_init(struct rte_dev_iterator *it, const char *str);
296*1eb35ac7SJim Harris 
297*1eb35ac7SJim Harris /**
298*1eb35ac7SJim Harris  * Iterates on a device iterator.
299*1eb35ac7SJim Harris  *
300*1eb35ac7SJim Harris  * Generates a new rte_device handle corresponding to the next element
301*1eb35ac7SJim Harris  * in the list described in comprehension by the iterator.
302*1eb35ac7SJim Harris  *
303*1eb35ac7SJim Harris  * The next object is returned, and the iterator is updated.
304*1eb35ac7SJim Harris  *
305*1eb35ac7SJim Harris  * @param it
306*1eb35ac7SJim Harris  *   Device iterator handle.
307*1eb35ac7SJim Harris  *
308*1eb35ac7SJim Harris  * @return
309*1eb35ac7SJim Harris  *   An rte_device handle if found.
310*1eb35ac7SJim Harris  *   NULL if an error occurred (rte_errno is set).
311*1eb35ac7SJim Harris  *   NULL if no device could be found (rte_errno is not set).
312*1eb35ac7SJim Harris  */
313*1eb35ac7SJim Harris __rte_experimental
314*1eb35ac7SJim Harris struct rte_device *
315*1eb35ac7SJim Harris rte_dev_iterator_next(struct rte_dev_iterator *it);
316*1eb35ac7SJim Harris 
317*1eb35ac7SJim Harris #define RTE_DEV_FOREACH(dev, devstr, it) \
318*1eb35ac7SJim Harris 	for (rte_dev_iterator_init(it, devstr), \
319*1eb35ac7SJim Harris 	     dev = rte_dev_iterator_next(it); \
320*1eb35ac7SJim Harris 	     dev != NULL; \
321*1eb35ac7SJim Harris 	     dev = rte_dev_iterator_next(it))
322*1eb35ac7SJim Harris 
323*1eb35ac7SJim Harris /**
324*1eb35ac7SJim Harris  * @warning
325*1eb35ac7SJim Harris  * @b EXPERIMENTAL: this API may change without prior notice
326*1eb35ac7SJim Harris  *
327*1eb35ac7SJim Harris  * It registers the callback for the specific device.
328*1eb35ac7SJim Harris  * Multiple callbacks can be registered at the same time.
329*1eb35ac7SJim Harris  *
330*1eb35ac7SJim Harris  * @param device_name
331*1eb35ac7SJim Harris  *  The device name, that is the param name of the struct rte_device,
332*1eb35ac7SJim Harris  *  null value means for all devices.
333*1eb35ac7SJim Harris  * @param cb_fn
334*1eb35ac7SJim Harris  *  callback address.
335*1eb35ac7SJim Harris  * @param cb_arg
336*1eb35ac7SJim Harris  *  address of parameter for callback.
337*1eb35ac7SJim Harris  *
338*1eb35ac7SJim Harris  * @return
339*1eb35ac7SJim Harris  *  - On success, zero.
340*1eb35ac7SJim Harris  *  - On failure, a negative value.
341*1eb35ac7SJim Harris  */
342*1eb35ac7SJim Harris __rte_experimental
343*1eb35ac7SJim Harris int
344*1eb35ac7SJim Harris rte_dev_event_callback_register(const char *device_name,
345*1eb35ac7SJim Harris 				rte_dev_event_cb_fn cb_fn,
346*1eb35ac7SJim Harris 				void *cb_arg);
347*1eb35ac7SJim Harris 
348*1eb35ac7SJim Harris /**
349*1eb35ac7SJim Harris  * @warning
350*1eb35ac7SJim Harris  * @b EXPERIMENTAL: this API may change without prior notice
351*1eb35ac7SJim Harris  *
352*1eb35ac7SJim Harris  * It unregisters the callback according to the specified device.
353*1eb35ac7SJim Harris  *
354*1eb35ac7SJim Harris  * @param device_name
355*1eb35ac7SJim Harris  *  The device name, that is the param name of the struct rte_device,
356*1eb35ac7SJim Harris  *  null value means for all devices and their callbacks.
357*1eb35ac7SJim Harris  * @param cb_fn
358*1eb35ac7SJim Harris  *  callback address.
359*1eb35ac7SJim Harris  * @param cb_arg
360*1eb35ac7SJim Harris  *  address of parameter for callback, (void *)-1 means to remove all
361*1eb35ac7SJim Harris  *  registered which has the same callback address.
362*1eb35ac7SJim Harris  *
363*1eb35ac7SJim Harris  * @return
364*1eb35ac7SJim Harris  *  - On success, return the number of callback entities removed.
365*1eb35ac7SJim Harris  *  - On failure, a negative value.
366*1eb35ac7SJim Harris  */
367*1eb35ac7SJim Harris __rte_experimental
368*1eb35ac7SJim Harris int
369*1eb35ac7SJim Harris rte_dev_event_callback_unregister(const char *device_name,
370*1eb35ac7SJim Harris 				  rte_dev_event_cb_fn cb_fn,
371*1eb35ac7SJim Harris 				  void *cb_arg);
372*1eb35ac7SJim Harris 
373*1eb35ac7SJim Harris /**
374*1eb35ac7SJim Harris  * @warning
375*1eb35ac7SJim Harris  * @b EXPERIMENTAL: this API may change without prior notice
376*1eb35ac7SJim Harris  *
377*1eb35ac7SJim Harris  * Executes all the user application registered callbacks for
378*1eb35ac7SJim Harris  * the specific device.
379*1eb35ac7SJim Harris  *
380*1eb35ac7SJim Harris  * @param device_name
381*1eb35ac7SJim Harris  *  The device name.
382*1eb35ac7SJim Harris  * @param event
383*1eb35ac7SJim Harris  *  the device event type.
384*1eb35ac7SJim Harris  */
385*1eb35ac7SJim Harris __rte_experimental
386*1eb35ac7SJim Harris void
387*1eb35ac7SJim Harris rte_dev_event_callback_process(const char *device_name,
388*1eb35ac7SJim Harris 			       enum rte_dev_event_type event);
389*1eb35ac7SJim Harris 
390*1eb35ac7SJim Harris /**
391*1eb35ac7SJim Harris  * @warning
392*1eb35ac7SJim Harris  * @b EXPERIMENTAL: this API may change without prior notice
393*1eb35ac7SJim Harris  *
394*1eb35ac7SJim Harris  * Start the device event monitoring.
395*1eb35ac7SJim Harris  *
396*1eb35ac7SJim Harris  * @return
397*1eb35ac7SJim Harris  *   - On success, zero.
398*1eb35ac7SJim Harris  *   - On failure, a negative value.
399*1eb35ac7SJim Harris  */
400*1eb35ac7SJim Harris __rte_experimental
401*1eb35ac7SJim Harris int
402*1eb35ac7SJim Harris rte_dev_event_monitor_start(void);
403*1eb35ac7SJim Harris 
404*1eb35ac7SJim Harris /**
405*1eb35ac7SJim Harris  * @warning
406*1eb35ac7SJim Harris  * @b EXPERIMENTAL: this API may change without prior notice
407*1eb35ac7SJim Harris  *
408*1eb35ac7SJim Harris  * Stop the device event monitoring.
409*1eb35ac7SJim Harris  *
410*1eb35ac7SJim Harris  * @return
411*1eb35ac7SJim Harris  *   - On success, zero.
412*1eb35ac7SJim Harris  *   - On failure, a negative value.
413*1eb35ac7SJim Harris  */
414*1eb35ac7SJim Harris __rte_experimental
415*1eb35ac7SJim Harris int
416*1eb35ac7SJim Harris rte_dev_event_monitor_stop(void);
417*1eb35ac7SJim Harris 
418*1eb35ac7SJim Harris /**
419*1eb35ac7SJim Harris  * @warning
420*1eb35ac7SJim Harris  * @b EXPERIMENTAL: this API may change without prior notice
421*1eb35ac7SJim Harris  *
422*1eb35ac7SJim Harris  * Enable hotplug handling for devices.
423*1eb35ac7SJim Harris  *
424*1eb35ac7SJim Harris  * @return
425*1eb35ac7SJim Harris  *   - On success, zero.
426*1eb35ac7SJim Harris  *   - On failure, a negative value.
427*1eb35ac7SJim Harris  */
428*1eb35ac7SJim Harris __rte_experimental
429*1eb35ac7SJim Harris int
430*1eb35ac7SJim Harris rte_dev_hotplug_handle_enable(void);
431*1eb35ac7SJim Harris 
432*1eb35ac7SJim Harris /**
433*1eb35ac7SJim Harris  * @warning
434*1eb35ac7SJim Harris  * @b EXPERIMENTAL: this API may change without prior notice
435*1eb35ac7SJim Harris  *
436*1eb35ac7SJim Harris  * Disable hotplug handling for devices.
437*1eb35ac7SJim Harris  *
438*1eb35ac7SJim Harris  * @return
439*1eb35ac7SJim Harris  *   - On success, zero.
440*1eb35ac7SJim Harris  *   - On failure, a negative value.
441*1eb35ac7SJim Harris  */
442*1eb35ac7SJim Harris __rte_experimental
443*1eb35ac7SJim Harris int
444*1eb35ac7SJim Harris rte_dev_hotplug_handle_disable(void);
445*1eb35ac7SJim Harris 
446*1eb35ac7SJim Harris /**
447*1eb35ac7SJim Harris  * Device level DMA map function.
448*1eb35ac7SJim Harris  * After a successful call, the memory segment will be mapped to the
449*1eb35ac7SJim Harris  * given device.
450*1eb35ac7SJim Harris  *
451*1eb35ac7SJim Harris  * @note: Memory must be registered in advance using rte_extmem_* APIs.
452*1eb35ac7SJim Harris  *
453*1eb35ac7SJim Harris  * @param dev
454*1eb35ac7SJim Harris  *	Device pointer.
455*1eb35ac7SJim Harris  * @param addr
456*1eb35ac7SJim Harris  *	Virtual address to map.
457*1eb35ac7SJim Harris  * @param iova
458*1eb35ac7SJim Harris  *	IOVA address to map.
459*1eb35ac7SJim Harris  * @param len
460*1eb35ac7SJim Harris  *	Length of the memory segment being mapped.
461*1eb35ac7SJim Harris  *
462*1eb35ac7SJim Harris  * @return
463*1eb35ac7SJim Harris  *	0 if mapping was successful.
464*1eb35ac7SJim Harris  *	Negative value and rte_errno is set otherwise.
465*1eb35ac7SJim Harris  */
466*1eb35ac7SJim Harris __rte_experimental
467*1eb35ac7SJim Harris int
468*1eb35ac7SJim Harris rte_dev_dma_map(struct rte_device *dev, void *addr, uint64_t iova, size_t len);
469*1eb35ac7SJim Harris 
470*1eb35ac7SJim Harris /**
471*1eb35ac7SJim Harris  * Device level DMA unmap function.
472*1eb35ac7SJim Harris  * After a successful call, the memory segment will no longer be
473*1eb35ac7SJim Harris  * accessible by the given device.
474*1eb35ac7SJim Harris  *
475*1eb35ac7SJim Harris  * @note: Memory must be registered in advance using rte_extmem_* APIs.
476*1eb35ac7SJim Harris  *
477*1eb35ac7SJim Harris  * @param dev
478*1eb35ac7SJim Harris  *	Device pointer.
479*1eb35ac7SJim Harris  * @param addr
480*1eb35ac7SJim Harris  *	Virtual address to unmap.
481*1eb35ac7SJim Harris  * @param iova
482*1eb35ac7SJim Harris  *	IOVA address to unmap.
483*1eb35ac7SJim Harris  * @param len
484*1eb35ac7SJim Harris  *	Length of the memory segment being mapped.
485*1eb35ac7SJim Harris  *
486*1eb35ac7SJim Harris  * @return
487*1eb35ac7SJim Harris  *	0 if un-mapping was successful.
488*1eb35ac7SJim Harris  *	Negative value and rte_errno is set otherwise.
489*1eb35ac7SJim Harris  */
490*1eb35ac7SJim Harris __rte_experimental
491*1eb35ac7SJim Harris int
492*1eb35ac7SJim Harris rte_dev_dma_unmap(struct rte_device *dev, void *addr, uint64_t iova,
493*1eb35ac7SJim Harris 		  size_t len);
494*1eb35ac7SJim Harris 
495*1eb35ac7SJim Harris #ifdef __cplusplus
496*1eb35ac7SJim Harris }
497*1eb35ac7SJim Harris #endif
498*1eb35ac7SJim Harris 
499*1eb35ac7SJim Harris #endif /* _RTE_DEV_H_ */
500