xref: /dpdk/drivers/bus/platform/bus_platform_driver.h (revision 719834a6849e1daf4a70ff7742bbcc3ae7e25607)
117c839f7STomasz Duszynski /* SPDX-License-Identifier: BSD-3-Clause
217c839f7STomasz Duszynski  * Copyright(C) 2023 Marvell.
317c839f7STomasz Duszynski  */
417c839f7STomasz Duszynski 
517c839f7STomasz Duszynski #ifndef BUS_PLATFORM_DRIVER_H
617c839f7STomasz Duszynski #define BUS_PLATFORM_DRIVER_H
717c839f7STomasz Duszynski 
817c839f7STomasz Duszynski /**
917c839f7STomasz Duszynski  * @file
1017c839f7STomasz Duszynski  * Platform bus interface.
1117c839f7STomasz Duszynski  */
1217c839f7STomasz Duszynski 
1317c839f7STomasz Duszynski #include <stddef.h>
1417c839f7STomasz Duszynski #include <stdint.h>
1517c839f7STomasz Duszynski 
1617c839f7STomasz Duszynski #include <dev_driver.h>
1717c839f7STomasz Duszynski #include <rte_common.h>
1817c839f7STomasz Duszynski #include <rte_dev.h>
1917c839f7STomasz Duszynski #include <rte_os.h>
2017c839f7STomasz Duszynski #include <rte_vfio.h>
2117c839f7STomasz Duszynski 
22*719834a6SMattias Rönnblom #ifdef __cplusplus
23*719834a6SMattias Rönnblom extern "C" {
24*719834a6SMattias Rönnblom #endif
25*719834a6SMattias Rönnblom 
2617c839f7STomasz Duszynski /* Forward declarations */
2717c839f7STomasz Duszynski struct rte_platform_bus;
2817c839f7STomasz Duszynski struct rte_platform_device;
2917c839f7STomasz Duszynski struct rte_platform_driver;
3017c839f7STomasz Duszynski 
3117c839f7STomasz Duszynski /**
3217c839f7STomasz Duszynski  * Initialization function for the driver called during platform device probing.
3317c839f7STomasz Duszynski  *
3417c839f7STomasz Duszynski  * @param pdev
3517c839f7STomasz Duszynski  *   Pointer to the platform device.
3617c839f7STomasz Duszynski  * @return
3717c839f7STomasz Duszynski  *   0 on success, negative value otherwise.
3817c839f7STomasz Duszynski  */
3917c839f7STomasz Duszynski typedef int (rte_platform_probe_t)(struct rte_platform_device *pdev);
4017c839f7STomasz Duszynski 
4117c839f7STomasz Duszynski /**
4217c839f7STomasz Duszynski  * Removal function for the driver called during platform device removal.
4317c839f7STomasz Duszynski  *
4417c839f7STomasz Duszynski  * @param pdev
4517c839f7STomasz Duszynski  *   Pointer to the platform device.
4617c839f7STomasz Duszynski  * @return
4717c839f7STomasz Duszynski  *   0 on success, negative value otherwise.
4817c839f7STomasz Duszynski  */
4917c839f7STomasz Duszynski typedef int (rte_platform_remove_t)(struct rte_platform_device *pdev);
5017c839f7STomasz Duszynski 
5117c839f7STomasz Duszynski /**
5217c839f7STomasz Duszynski  * Driver specific DMA mapping.
5317c839f7STomasz Duszynski  *
5417c839f7STomasz Duszynski  * @param pdev
5517c839f7STomasz Duszynski  *   Pointer to the platform device.
5617c839f7STomasz Duszynski  * @param addr
5717c839f7STomasz Duszynski  *   Starting virtual address of memory to be mapped.
5817c839f7STomasz Duszynski  * @param iova
5917c839f7STomasz Duszynski  *   Starting IOVA address of memory to be mapped.
6017c839f7STomasz Duszynski  * @param len
6117c839f7STomasz Duszynski  *   Length of memory segment being mapped.
6217c839f7STomasz Duszynski  * @return
6317c839f7STomasz Duszynski  *   - 0 on success, negative value and rte_errno is set otherwise.
6417c839f7STomasz Duszynski  */
6517c839f7STomasz Duszynski typedef int (rte_platform_dma_map_t)(struct rte_platform_device *pdev, void *addr, uint64_t iova,
6617c839f7STomasz Duszynski 				     size_t len);
6717c839f7STomasz Duszynski 
6817c839f7STomasz Duszynski /**
6917c839f7STomasz Duszynski  * Driver specific DMA unmapping.
7017c839f7STomasz Duszynski  *
7117c839f7STomasz Duszynski  * @param pdev
7217c839f7STomasz Duszynski  *   Pointer to the platform device.
7317c839f7STomasz Duszynski  * @param addr
7417c839f7STomasz Duszynski  *   Starting virtual address of memory to be mapped.
7517c839f7STomasz Duszynski  * @param iova
7617c839f7STomasz Duszynski  *   Starting IOVA address of memory to be mapped.
7717c839f7STomasz Duszynski  * @param len
7817c839f7STomasz Duszynski  *   Length of memory segment being mapped.
7917c839f7STomasz Duszynski  * @return
8017c839f7STomasz Duszynski  *   - 0 on success, negative value and rte_errno is set otherwise.
8117c839f7STomasz Duszynski  */
8217c839f7STomasz Duszynski typedef int (rte_platform_dma_unmap_t)(struct rte_platform_device *pdev, void *addr, uint64_t iova,
8317c839f7STomasz Duszynski 				       size_t len);
8417c839f7STomasz Duszynski 
8517c839f7STomasz Duszynski /**
8617c839f7STomasz Duszynski  * A structure describing a platform device resource.
8717c839f7STomasz Duszynski  */
8817c839f7STomasz Duszynski struct rte_platform_resource {
8917c839f7STomasz Duszynski 	char *name; /**< Resource name specified via reg-names prop in device-tree */
9017c839f7STomasz Duszynski 	struct rte_mem_resource mem; /**< Memory resource */
9117c839f7STomasz Duszynski };
9217c839f7STomasz Duszynski 
9317c839f7STomasz Duszynski /**
9417c839f7STomasz Duszynski  * A structure describing a platform device.
9517c839f7STomasz Duszynski  */
9617c839f7STomasz Duszynski struct rte_platform_device {
9717c839f7STomasz Duszynski 	RTE_TAILQ_ENTRY(rte_platform_device) next; /**< Next attached platform device */
9817c839f7STomasz Duszynski 	struct rte_device device; /**< Core device */
9917c839f7STomasz Duszynski 	struct rte_platform_driver *driver; /**< Matching device driver */
10017c839f7STomasz Duszynski 	char name[RTE_DEV_NAME_MAX_LEN]; /**< Device name */
10117c839f7STomasz Duszynski 	unsigned int num_resource; /**< Number of device resources */
10217c839f7STomasz Duszynski 	struct rte_platform_resource *resource; /**< Device resources */
10317c839f7STomasz Duszynski 	int dev_fd; /**< VFIO device fd */
10417c839f7STomasz Duszynski };
10517c839f7STomasz Duszynski 
10617c839f7STomasz Duszynski /**
10717c839f7STomasz Duszynski  * A structure describing a platform device driver.
10817c839f7STomasz Duszynski  */
10917c839f7STomasz Duszynski struct rte_platform_driver {
11017c839f7STomasz Duszynski 	RTE_TAILQ_ENTRY(rte_platform_driver) next; /**< Next available platform driver */
11117c839f7STomasz Duszynski 	struct rte_driver driver; /**< Core driver */
11217c839f7STomasz Duszynski 	rte_platform_probe_t *probe;  /**< Device probe function */
11317c839f7STomasz Duszynski 	rte_platform_remove_t *remove; /**< Device remove function */
11417c839f7STomasz Duszynski 	rte_platform_dma_map_t *dma_map; /**< Device DMA map function */
11517c839f7STomasz Duszynski 	rte_platform_dma_unmap_t *dma_unmap; /**< Device DMA unmap function */
11617c839f7STomasz Duszynski 	uint32_t drv_flags; /**< Driver flags RTE_PLATFORM_DRV_* */
11717c839f7STomasz Duszynski };
11817c839f7STomasz Duszynski 
11917c839f7STomasz Duszynski /** Device driver needs IOVA as VA and cannot work with IOVA as PA */
12017c839f7STomasz Duszynski #define RTE_PLATFORM_DRV_NEED_IOVA_AS_VA 0x0001
12117c839f7STomasz Duszynski 
12217c839f7STomasz Duszynski /**
12317c839f7STomasz Duszynski  * @internal
12417c839f7STomasz Duszynski  * Helper macros used to convert core device to platform device.
12517c839f7STomasz Duszynski  */
12617c839f7STomasz Duszynski #define RTE_DEV_TO_PLATFORM_DEV(ptr) \
12717c839f7STomasz Duszynski 	container_of(ptr, struct rte_platform_device, device)
12817c839f7STomasz Duszynski 
12917c839f7STomasz Duszynski #define RTE_DEV_TO_PLATFORM_DEV_CONST(ptr) \
13017c839f7STomasz Duszynski 	container_of(ptr, const struct rte_platform_device, device)
13117c839f7STomasz Duszynski 
13217c839f7STomasz Duszynski /** Helper for platform driver registration. */
13317c839f7STomasz Duszynski #define RTE_PMD_REGISTER_PLATFORM(nm, platform_drv) \
13417c839f7STomasz Duszynski static const char *pdrvinit_ ## nm ## _alias; \
13517c839f7STomasz Duszynski RTE_INIT(pdrvinitfn_ ##nm) \
13617c839f7STomasz Duszynski { \
13717c839f7STomasz Duszynski 	(platform_drv).driver.name = RTE_STR(nm); \
13817c839f7STomasz Duszynski 	(platform_drv).driver.alias = pdrvinit_ ## nm ## _alias; \
13917c839f7STomasz Duszynski 	rte_platform_register(&(platform_drv)); \
14017c839f7STomasz Duszynski } \
14117c839f7STomasz Duszynski RTE_PMD_EXPORT_NAME(nm, __COUNTER__)
14217c839f7STomasz Duszynski 
14317c839f7STomasz Duszynski /** Helper for setting platform driver alias. */
14417c839f7STomasz Duszynski #define RTE_PMD_REGISTER_ALIAS(nm, alias) \
14517c839f7STomasz Duszynski static const char *pdrvinit_ ## nm ## _alias = RTE_STR(alias)
14617c839f7STomasz Duszynski 
14717c839f7STomasz Duszynski #ifdef VFIO_PRESENT
14817c839f7STomasz Duszynski 
14917c839f7STomasz Duszynski /**
15017c839f7STomasz Duszynski  * Register a platform device driver.
15117c839f7STomasz Duszynski  *
15217c839f7STomasz Duszynski  * @warning
15317c839f7STomasz Duszynski  * @b EXPERIMENTAL: this API may change without prior notice.
15417c839f7STomasz Duszynski  *
15517c839f7STomasz Duszynski  * @param pdrv
15617c839f7STomasz Duszynski  *   A pointer to a rte_platform_driver structure describing driver to be registered.
15717c839f7STomasz Duszynski  */
15817c839f7STomasz Duszynski __rte_internal
15917c839f7STomasz Duszynski void rte_platform_register(struct rte_platform_driver *pdrv);
16017c839f7STomasz Duszynski 
16117c839f7STomasz Duszynski /**
16217c839f7STomasz Duszynski  * Unregister a platform device driver.
16317c839f7STomasz Duszynski  *
16417c839f7STomasz Duszynski  * @warning
16517c839f7STomasz Duszynski  * @b EXPERIMENTAL: this API may change without prior notice.
16617c839f7STomasz Duszynski  *
16717c839f7STomasz Duszynski  * @param pdrv
16817c839f7STomasz Duszynski  *   A pointer to a rte_platform_driver structure describing driver to be unregistered.
16917c839f7STomasz Duszynski  */
17017c839f7STomasz Duszynski __rte_internal
17117c839f7STomasz Duszynski void rte_platform_unregister(struct rte_platform_driver *pdrv);
17217c839f7STomasz Duszynski 
17317c839f7STomasz Duszynski #else
17417c839f7STomasz Duszynski 
17517c839f7STomasz Duszynski __rte_internal
17617c839f7STomasz Duszynski static inline void
17717c839f7STomasz Duszynski rte_platform_register(struct rte_platform_driver *pdrv __rte_unused)
17817c839f7STomasz Duszynski {
17917c839f7STomasz Duszynski }
18017c839f7STomasz Duszynski 
18117c839f7STomasz Duszynski __rte_internal
18217c839f7STomasz Duszynski static inline void
18317c839f7STomasz Duszynski rte_platform_unregister(struct rte_platform_driver *pdrv __rte_unused)
18417c839f7STomasz Duszynski {
18517c839f7STomasz Duszynski }
18617c839f7STomasz Duszynski 
18717c839f7STomasz Duszynski #endif /* VFIO_PRESENT */
18817c839f7STomasz Duszynski 
18917c839f7STomasz Duszynski #ifdef __cplusplus
19017c839f7STomasz Duszynski }
19117c839f7STomasz Duszynski #endif
19217c839f7STomasz Duszynski 
19317c839f7STomasz Duszynski #endif /* BUS_PLATFORM_DRIVER_H */
194