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