/* SPDX-License-Identifier: BSD-3-Clause * Copyright(C) 2023 Marvell. */ #ifndef BUS_PLATFORM_DRIVER_H #define BUS_PLATFORM_DRIVER_H /** * @file * Platform bus interface. */ #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #include #include /* Forward declarations */ struct rte_platform_bus; struct rte_platform_device; struct rte_platform_driver; /** * Initialization function for the driver called during platform device probing. * * @param pdev * Pointer to the platform device. * @return * 0 on success, negative value otherwise. */ typedef int (rte_platform_probe_t)(struct rte_platform_device *pdev); /** * Removal function for the driver called during platform device removal. * * @param pdev * Pointer to the platform device. * @return * 0 on success, negative value otherwise. */ typedef int (rte_platform_remove_t)(struct rte_platform_device *pdev); /** * Driver specific DMA mapping. * * @param pdev * Pointer to the platform device. * @param addr * Starting virtual address of memory to be mapped. * @param iova * Starting IOVA address of memory to be mapped. * @param len * Length of memory segment being mapped. * @return * - 0 on success, negative value and rte_errno is set otherwise. */ typedef int (rte_platform_dma_map_t)(struct rte_platform_device *pdev, void *addr, uint64_t iova, size_t len); /** * Driver specific DMA unmapping. * * @param pdev * Pointer to the platform device. * @param addr * Starting virtual address of memory to be mapped. * @param iova * Starting IOVA address of memory to be mapped. * @param len * Length of memory segment being mapped. * @return * - 0 on success, negative value and rte_errno is set otherwise. */ typedef int (rte_platform_dma_unmap_t)(struct rte_platform_device *pdev, void *addr, uint64_t iova, size_t len); /** * A structure describing a platform device resource. */ struct rte_platform_resource { char *name; /**< Resource name specified via reg-names prop in device-tree */ struct rte_mem_resource mem; /**< Memory resource */ }; /** * A structure describing a platform device. */ struct rte_platform_device { RTE_TAILQ_ENTRY(rte_platform_device) next; /**< Next attached platform device */ struct rte_device device; /**< Core device */ struct rte_platform_driver *driver; /**< Matching device driver */ char name[RTE_DEV_NAME_MAX_LEN]; /**< Device name */ unsigned int num_resource; /**< Number of device resources */ struct rte_platform_resource *resource; /**< Device resources */ int dev_fd; /**< VFIO device fd */ }; /** * A structure describing a platform device driver. */ struct rte_platform_driver { RTE_TAILQ_ENTRY(rte_platform_driver) next; /**< Next available platform driver */ struct rte_driver driver; /**< Core driver */ rte_platform_probe_t *probe; /**< Device probe function */ rte_platform_remove_t *remove; /**< Device remove function */ rte_platform_dma_map_t *dma_map; /**< Device DMA map function */ rte_platform_dma_unmap_t *dma_unmap; /**< Device DMA unmap function */ uint32_t drv_flags; /**< Driver flags RTE_PLATFORM_DRV_* */ }; /** Device driver needs IOVA as VA and cannot work with IOVA as PA */ #define RTE_PLATFORM_DRV_NEED_IOVA_AS_VA 0x0001 /** * @internal * Helper macros used to convert core device to platform device. */ #define RTE_DEV_TO_PLATFORM_DEV(ptr) \ container_of(ptr, struct rte_platform_device, device) #define RTE_DEV_TO_PLATFORM_DEV_CONST(ptr) \ container_of(ptr, const struct rte_platform_device, device) /** Helper for platform driver registration. */ #define RTE_PMD_REGISTER_PLATFORM(nm, platform_drv) \ static const char *pdrvinit_ ## nm ## _alias; \ RTE_INIT(pdrvinitfn_ ##nm) \ { \ (platform_drv).driver.name = RTE_STR(nm); \ (platform_drv).driver.alias = pdrvinit_ ## nm ## _alias; \ rte_platform_register(&(platform_drv)); \ } \ RTE_PMD_EXPORT_NAME(nm, __COUNTER__) /** Helper for setting platform driver alias. */ #define RTE_PMD_REGISTER_ALIAS(nm, alias) \ static const char *pdrvinit_ ## nm ## _alias = RTE_STR(alias) #ifdef VFIO_PRESENT /** * Register a platform device driver. * * @warning * @b EXPERIMENTAL: this API may change without prior notice. * * @param pdrv * A pointer to a rte_platform_driver structure describing driver to be registered. */ __rte_internal void rte_platform_register(struct rte_platform_driver *pdrv); /** * Unregister a platform device driver. * * @warning * @b EXPERIMENTAL: this API may change without prior notice. * * @param pdrv * A pointer to a rte_platform_driver structure describing driver to be unregistered. */ __rte_internal void rte_platform_unregister(struct rte_platform_driver *pdrv); #else __rte_internal static inline void rte_platform_register(struct rte_platform_driver *pdrv __rte_unused) { } __rte_internal static inline void rte_platform_unregister(struct rte_platform_driver *pdrv __rte_unused) { } #endif /* VFIO_PRESENT */ #ifdef __cplusplus } #endif #endif /* BUS_PLATFORM_DRIVER_H */