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