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