xref: /dpdk/drivers/bus/vdev/bus_vdev_driver.h (revision 719834a6849e1daf4a70ff7742bbcc3ae7e25607)
14851ef2bSDavid Marchand /* SPDX-License-Identifier: BSD-3-Clause
24851ef2bSDavid Marchand  * Copyright(c) 2016 RehiveTech. All rights reserved.
34851ef2bSDavid Marchand  */
44851ef2bSDavid Marchand 
54851ef2bSDavid Marchand #ifndef BUS_VDEV_DRIVER_H
64851ef2bSDavid Marchand #define BUS_VDEV_DRIVER_H
74851ef2bSDavid Marchand 
84851ef2bSDavid Marchand #include <rte_bus_vdev.h>
94851ef2bSDavid Marchand #include <rte_compat.h>
101acb7f54SDavid Marchand #include <dev_driver.h>
114851ef2bSDavid Marchand #include <rte_devargs.h>
124851ef2bSDavid Marchand 
13*719834a6SMattias Rönnblom #ifdef __cplusplus
14*719834a6SMattias Rönnblom extern "C" {
15*719834a6SMattias Rönnblom #endif
16*719834a6SMattias Rönnblom 
174851ef2bSDavid Marchand struct rte_vdev_device {
184851ef2bSDavid Marchand 	RTE_TAILQ_ENTRY(rte_vdev_device) next;      /**< Next attached vdev */
194851ef2bSDavid Marchand 	struct rte_device device;               /**< Inherit core device */
204851ef2bSDavid Marchand };
214851ef2bSDavid Marchand 
224851ef2bSDavid Marchand /**
234851ef2bSDavid Marchand  * @internal
244851ef2bSDavid Marchand  * Helper macro for drivers that need to convert to struct rte_vdev_device.
254851ef2bSDavid Marchand  */
264851ef2bSDavid Marchand #define RTE_DEV_TO_VDEV(ptr) \
274851ef2bSDavid Marchand 	container_of(ptr, struct rte_vdev_device, device)
284851ef2bSDavid Marchand 
294851ef2bSDavid Marchand #define RTE_DEV_TO_VDEV_CONST(ptr) \
304851ef2bSDavid Marchand 	container_of(ptr, const struct rte_vdev_device, device)
314851ef2bSDavid Marchand 
324851ef2bSDavid Marchand #define RTE_ETH_DEV_TO_VDEV(eth_dev)	RTE_DEV_TO_VDEV((eth_dev)->device)
334851ef2bSDavid Marchand 
344851ef2bSDavid Marchand static inline const char *
354851ef2bSDavid Marchand rte_vdev_device_name(const struct rte_vdev_device *dev)
364851ef2bSDavid Marchand {
374851ef2bSDavid Marchand 	if (dev && dev->device.name)
384851ef2bSDavid Marchand 		return dev->device.name;
394851ef2bSDavid Marchand 	return NULL;
404851ef2bSDavid Marchand }
414851ef2bSDavid Marchand 
424851ef2bSDavid Marchand static inline const char *
434851ef2bSDavid Marchand rte_vdev_device_args(const struct rte_vdev_device *dev)
444851ef2bSDavid Marchand {
454851ef2bSDavid Marchand 	if (dev && dev->device.devargs)
464851ef2bSDavid Marchand 		return dev->device.devargs->args;
474851ef2bSDavid Marchand 	return "";
484851ef2bSDavid Marchand }
494851ef2bSDavid Marchand 
504851ef2bSDavid Marchand /**
514851ef2bSDavid Marchand  * Probe function called for each virtual device driver once.
524851ef2bSDavid Marchand  */
534851ef2bSDavid Marchand typedef int (rte_vdev_probe_t)(struct rte_vdev_device *dev);
544851ef2bSDavid Marchand 
554851ef2bSDavid Marchand /**
564851ef2bSDavid Marchand  * Remove function called for each virtual device driver once.
574851ef2bSDavid Marchand  */
584851ef2bSDavid Marchand typedef int (rte_vdev_remove_t)(struct rte_vdev_device *dev);
594851ef2bSDavid Marchand 
604851ef2bSDavid Marchand /**
614851ef2bSDavid Marchand  * Driver-specific DMA mapping. After a successful call the device
624851ef2bSDavid Marchand  * will be able to read/write from/to this segment.
634851ef2bSDavid Marchand  *
644851ef2bSDavid Marchand  * @param dev
654851ef2bSDavid Marchand  *   Pointer to the Virtual device.
664851ef2bSDavid Marchand  * @param addr
674851ef2bSDavid Marchand  *   Starting virtual address of memory to be mapped.
684851ef2bSDavid Marchand  * @param iova
694851ef2bSDavid Marchand  *   Starting IOVA address of memory to be mapped.
704851ef2bSDavid Marchand  * @param len
714851ef2bSDavid Marchand  *   Length of memory segment being mapped.
724851ef2bSDavid Marchand  * @return
734851ef2bSDavid Marchand  *   - 0 On success.
744851ef2bSDavid Marchand  *   - Negative value and rte_errno is set otherwise.
754851ef2bSDavid Marchand  */
764851ef2bSDavid Marchand typedef int (rte_vdev_dma_map_t)(struct rte_vdev_device *dev, void *addr,
774851ef2bSDavid Marchand 			    uint64_t iova, size_t len);
784851ef2bSDavid Marchand 
794851ef2bSDavid Marchand /**
804851ef2bSDavid Marchand  * Driver-specific DMA un-mapping. After a successful call the device
814851ef2bSDavid Marchand  * will not be able to read/write from/to this segment.
824851ef2bSDavid Marchand  *
834851ef2bSDavid Marchand  * @param dev
844851ef2bSDavid Marchand  *   Pointer to the Virtual device.
854851ef2bSDavid Marchand  * @param addr
864851ef2bSDavid Marchand  *   Starting virtual address of memory to be unmapped.
874851ef2bSDavid Marchand  * @param iova
884851ef2bSDavid Marchand  *   Starting IOVA address of memory to be unmapped.
894851ef2bSDavid Marchand  * @param len
904851ef2bSDavid Marchand  *   Length of memory segment being unmapped.
914851ef2bSDavid Marchand  * @return
924851ef2bSDavid Marchand  *   - 0 On success.
934851ef2bSDavid Marchand  *   - Negative value and rte_errno is set otherwise.
944851ef2bSDavid Marchand  */
954851ef2bSDavid Marchand typedef int (rte_vdev_dma_unmap_t)(struct rte_vdev_device *dev, void *addr,
964851ef2bSDavid Marchand 			      uint64_t iova, size_t len);
974851ef2bSDavid Marchand 
984851ef2bSDavid Marchand /**
994851ef2bSDavid Marchand  * A virtual device driver abstraction.
1004851ef2bSDavid Marchand  */
1014851ef2bSDavid Marchand struct rte_vdev_driver {
1024851ef2bSDavid Marchand 	RTE_TAILQ_ENTRY(rte_vdev_driver) next; /**< Next in list. */
1034851ef2bSDavid Marchand 	struct rte_driver driver;        /**< Inherited general driver. */
1044851ef2bSDavid Marchand 	rte_vdev_probe_t *probe;         /**< Virtual device probe function. */
1054851ef2bSDavid Marchand 	rte_vdev_remove_t *remove;       /**< Virtual device remove function. */
1064851ef2bSDavid Marchand 	rte_vdev_dma_map_t *dma_map;     /**< Virtual device DMA map function. */
1074851ef2bSDavid Marchand 	rte_vdev_dma_unmap_t *dma_unmap; /**< Virtual device DMA unmap function. */
1084851ef2bSDavid Marchand 	uint32_t drv_flags;              /**< Flags RTE_VDEV_DRV_*. */
1094851ef2bSDavid Marchand };
1104851ef2bSDavid Marchand 
1114851ef2bSDavid Marchand /** Device driver needs IOVA as VA and cannot work with IOVA as PA */
1124851ef2bSDavid Marchand #define RTE_VDEV_DRV_NEED_IOVA_AS_VA 0x0001
1134851ef2bSDavid Marchand 
1144851ef2bSDavid Marchand /**
1154851ef2bSDavid Marchand  * Register a virtual device driver.
1164851ef2bSDavid Marchand  *
1174851ef2bSDavid Marchand  * @param driver
1184851ef2bSDavid Marchand  *   A pointer to a rte_vdev_driver structure describing the driver
1194851ef2bSDavid Marchand  *   to be registered.
1204851ef2bSDavid Marchand  */
1214851ef2bSDavid Marchand __rte_internal
1224851ef2bSDavid Marchand void rte_vdev_register(struct rte_vdev_driver *driver);
1234851ef2bSDavid Marchand 
1244851ef2bSDavid Marchand /**
1254851ef2bSDavid Marchand  * Unregister a virtual device driver.
1264851ef2bSDavid Marchand  *
1274851ef2bSDavid Marchand  * @param driver
1284851ef2bSDavid Marchand  *   A pointer to a rte_vdev_driver structure describing the driver
1294851ef2bSDavid Marchand  *   to be unregistered.
1304851ef2bSDavid Marchand  */
1314851ef2bSDavid Marchand __rte_internal
1324851ef2bSDavid Marchand void rte_vdev_unregister(struct rte_vdev_driver *driver);
1334851ef2bSDavid Marchand 
1344851ef2bSDavid Marchand #define RTE_PMD_REGISTER_VDEV(nm, vdrv)\
1354851ef2bSDavid Marchand static const char *vdrvinit_ ## nm ## _alias;\
1364851ef2bSDavid Marchand RTE_INIT(vdrvinitfn_ ##vdrv)\
1374851ef2bSDavid Marchand {\
1384851ef2bSDavid Marchand 	(vdrv).driver.name = RTE_STR(nm);\
1394851ef2bSDavid Marchand 	(vdrv).driver.alias = vdrvinit_ ## nm ## _alias;\
1404851ef2bSDavid Marchand 	rte_vdev_register(&vdrv);\
1414851ef2bSDavid Marchand } \
1424851ef2bSDavid Marchand RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
1434851ef2bSDavid Marchand 
1444851ef2bSDavid Marchand #define RTE_PMD_REGISTER_ALIAS(nm, alias)\
1454851ef2bSDavid Marchand static const char *vdrvinit_ ## nm ## _alias = RTE_STR(alias)
1464851ef2bSDavid Marchand 
1474851ef2bSDavid Marchand #ifdef __cplusplus
1484851ef2bSDavid Marchand }
1494851ef2bSDavid Marchand #endif
1504851ef2bSDavid Marchand 
1514851ef2bSDavid Marchand #endif /* BUS_VDEV_DRIVER_H */
152