1b36970f2SChengwen Feng /* SPDX-License-Identifier: BSD-3-Clause 2b36970f2SChengwen Feng * Copyright(c) 2021 HiSilicon Limited 3b36970f2SChengwen Feng */ 4b36970f2SChengwen Feng 5b36970f2SChengwen Feng #ifndef RTE_DMADEV_PMD_H 6b36970f2SChengwen Feng #define RTE_DMADEV_PMD_H 7b36970f2SChengwen Feng 8b36970f2SChengwen Feng /** 9b36970f2SChengwen Feng * @file 10b36970f2SChengwen Feng * 11b36970f2SChengwen Feng * DMA Device PMD interface 12b36970f2SChengwen Feng * 13b36970f2SChengwen Feng * Driver facing interface for a DMA device. These are not to be called directly 14b36970f2SChengwen Feng * by any application. 15b36970f2SChengwen Feng */ 16b36970f2SChengwen Feng 171acb7f54SDavid Marchand #include <dev_driver.h> 18e904fd77SThomas Monjalon 191094dd94SDavid Marchand #include <rte_compat.h> 20b36970f2SChengwen Feng #include "rte_dmadev.h" 21b36970f2SChengwen Feng 22b36970f2SChengwen Feng #ifdef __cplusplus 23b36970f2SChengwen Feng extern "C" { 24b36970f2SChengwen Feng #endif 25b36970f2SChengwen Feng 26e0180db1SChengwen Feng struct rte_dma_dev; 27e0180db1SChengwen Feng 28e0180db1SChengwen Feng /** @internal Used to get device information of a device. */ 29e0180db1SChengwen Feng typedef int (*rte_dma_info_get_t)(const struct rte_dma_dev *dev, 30e0180db1SChengwen Feng struct rte_dma_info *dev_info, 31e0180db1SChengwen Feng uint32_t info_sz); 32e0180db1SChengwen Feng 33e0180db1SChengwen Feng /** @internal Used to configure a device. */ 34e0180db1SChengwen Feng typedef int (*rte_dma_configure_t)(struct rte_dma_dev *dev, 35e0180db1SChengwen Feng const struct rte_dma_conf *dev_conf, 36e0180db1SChengwen Feng uint32_t conf_sz); 37e0180db1SChengwen Feng 38e0180db1SChengwen Feng /** @internal Used to start a configured device. */ 39e0180db1SChengwen Feng typedef int (*rte_dma_start_t)(struct rte_dma_dev *dev); 40e0180db1SChengwen Feng 41e0180db1SChengwen Feng /** @internal Used to stop a configured device. */ 42e0180db1SChengwen Feng typedef int (*rte_dma_stop_t)(struct rte_dma_dev *dev); 43e0180db1SChengwen Feng 44e0180db1SChengwen Feng /** @internal Used to close a configured device. */ 45e0180db1SChengwen Feng typedef int (*rte_dma_close_t)(struct rte_dma_dev *dev); 46e0180db1SChengwen Feng 47e0180db1SChengwen Feng /** @internal Used to allocate and set up a virtual DMA channel. */ 48e0180db1SChengwen Feng typedef int (*rte_dma_vchan_setup_t)(struct rte_dma_dev *dev, uint16_t vchan, 49e0180db1SChengwen Feng const struct rte_dma_vchan_conf *conf, 50e0180db1SChengwen Feng uint32_t conf_sz); 51e0180db1SChengwen Feng 52e0180db1SChengwen Feng /** @internal Used to retrieve basic statistics. */ 53e0180db1SChengwen Feng typedef int (*rte_dma_stats_get_t)(const struct rte_dma_dev *dev, 54e0180db1SChengwen Feng uint16_t vchan, struct rte_dma_stats *stats, 55e0180db1SChengwen Feng uint32_t stats_sz); 56e0180db1SChengwen Feng 57e0180db1SChengwen Feng /** @internal Used to reset basic statistics. */ 58e0180db1SChengwen Feng typedef int (*rte_dma_stats_reset_t)(struct rte_dma_dev *dev, uint16_t vchan); 59e0180db1SChengwen Feng 605e0f8591SBruce Richardson /** @internal Used to check if a virtual channel has finished all jobs. */ 615e0f8591SBruce Richardson typedef int (*rte_dma_vchan_status_t)(const struct rte_dma_dev *dev, uint16_t vchan, 625e0f8591SBruce Richardson enum rte_dma_vchan_status *status); 635e0f8591SBruce Richardson 64e0180db1SChengwen Feng /** @internal Used to dump internal information. */ 65e0180db1SChengwen Feng typedef int (*rte_dma_dump_t)(const struct rte_dma_dev *dev, FILE *f); 66e0180db1SChengwen Feng 67e0180db1SChengwen Feng /** 68e0180db1SChengwen Feng * DMA device operations function pointer table. 69e0180db1SChengwen Feng * 70e0180db1SChengwen Feng * @see struct rte_dma_dev:dev_ops 71e0180db1SChengwen Feng */ 72e0180db1SChengwen Feng struct rte_dma_dev_ops { 73e0180db1SChengwen Feng rte_dma_info_get_t dev_info_get; 74e0180db1SChengwen Feng rte_dma_configure_t dev_configure; 75e0180db1SChengwen Feng rte_dma_start_t dev_start; 76e0180db1SChengwen Feng rte_dma_stop_t dev_stop; 77e0180db1SChengwen Feng rte_dma_close_t dev_close; 78e0180db1SChengwen Feng 79e0180db1SChengwen Feng rte_dma_vchan_setup_t vchan_setup; 80e0180db1SChengwen Feng 81e0180db1SChengwen Feng rte_dma_stats_get_t stats_get; 82e0180db1SChengwen Feng rte_dma_stats_reset_t stats_reset; 83e0180db1SChengwen Feng 845e0f8591SBruce Richardson rte_dma_vchan_status_t vchan_status; 85e0180db1SChengwen Feng rte_dma_dump_t dev_dump; 86e0180db1SChengwen Feng }; 872ece65f0SChengwen Feng 882ece65f0SChengwen Feng /** 892ece65f0SChengwen Feng * @internal 902ece65f0SChengwen Feng * The data part, with no function pointers, associated with each DMA device. 912ece65f0SChengwen Feng * 922ece65f0SChengwen Feng * This structure is safe to place in shared memory to be common among different 932ece65f0SChengwen Feng * processes in a multi-process configuration. 942ece65f0SChengwen Feng * 952ece65f0SChengwen Feng * @see struct rte_dma_dev::data 962ece65f0SChengwen Feng */ 97*c6552d9aSTyler Retzlaff struct __rte_cache_aligned rte_dma_dev_data { 982ece65f0SChengwen Feng char dev_name[RTE_DEV_NAME_MAX_LEN]; /**< Unique identifier name */ 992ece65f0SChengwen Feng int16_t dev_id; /**< Device [external] identifier. */ 1002ece65f0SChengwen Feng int16_t numa_node; /**< Local NUMA memory ID. -1 if unknown. */ 1012ece65f0SChengwen Feng void *dev_private; /**< PMD-specific private data. */ 1022ece65f0SChengwen Feng struct rte_dma_conf dev_conf; /**< DMA device configuration. */ 1032ece65f0SChengwen Feng __extension__ 1042ece65f0SChengwen Feng uint8_t dev_started : 1; /**< Device state: STARTED(1)/STOPPED(0). */ 1052ece65f0SChengwen Feng uint64_t reserved[2]; /**< Reserved for future fields */ 106*c6552d9aSTyler Retzlaff }; 1072ece65f0SChengwen Feng 108b36970f2SChengwen Feng /** 109b36970f2SChengwen Feng * Possible states of a DMA device. 110b36970f2SChengwen Feng * 111b36970f2SChengwen Feng * @see struct rte_dma_dev::state 112b36970f2SChengwen Feng */ 113b36970f2SChengwen Feng enum rte_dma_dev_state { 114b36970f2SChengwen Feng RTE_DMA_DEV_UNUSED = 0, /**< Device is unused. */ 115b36970f2SChengwen Feng /** Device is registered, but not ready to be used. */ 116b36970f2SChengwen Feng RTE_DMA_DEV_REGISTERED, 117b36970f2SChengwen Feng /** Device is ready for use. This is set by the PMD. */ 118b36970f2SChengwen Feng RTE_DMA_DEV_READY, 119b36970f2SChengwen Feng }; 120b36970f2SChengwen Feng 121b36970f2SChengwen Feng /** 122b36970f2SChengwen Feng * @internal 123b36970f2SChengwen Feng * The generic data structure associated with each DMA device. 124b36970f2SChengwen Feng */ 125*c6552d9aSTyler Retzlaff struct __rte_cache_aligned rte_dma_dev { 126b36970f2SChengwen Feng /** Device info which supplied during device initialization. */ 127b36970f2SChengwen Feng struct rte_device *device; 1282ece65f0SChengwen Feng struct rte_dma_dev_data *data; /**< Pointer to shared device data. */ 12991e581e5SChengwen Feng /**< Fast-path functions and related data. */ 13091e581e5SChengwen Feng struct rte_dma_fp_object *fp_obj; 131e0180db1SChengwen Feng /** Functions implemented by PMD. */ 132e0180db1SChengwen Feng const struct rte_dma_dev_ops *dev_ops; 133b36970f2SChengwen Feng enum rte_dma_dev_state state; /**< Flag indicating the device state. */ 134b36970f2SChengwen Feng uint64_t reserved[2]; /**< Reserved for future fields. */ 135*c6552d9aSTyler Retzlaff }; 136b36970f2SChengwen Feng 137b36970f2SChengwen Feng /** 138b36970f2SChengwen Feng * @internal 139b36970f2SChengwen Feng * Allocate a new dmadev slot for an DMA device and return the pointer to that 140b36970f2SChengwen Feng * slot for the driver to use. 141b36970f2SChengwen Feng * 142b36970f2SChengwen Feng * @param name 143b36970f2SChengwen Feng * DMA device name. 144b36970f2SChengwen Feng * @param numa_node 145b36970f2SChengwen Feng * Driver's private data's NUMA node. 146b36970f2SChengwen Feng * @param private_data_size 147b36970f2SChengwen Feng * Driver's private data size. 148b36970f2SChengwen Feng * 149b36970f2SChengwen Feng * @return 150b36970f2SChengwen Feng * A pointer to the DMA device slot case of success, 151b36970f2SChengwen Feng * NULL otherwise. 152b36970f2SChengwen Feng */ 153b36970f2SChengwen Feng __rte_internal 154b36970f2SChengwen Feng struct rte_dma_dev *rte_dma_pmd_allocate(const char *name, int numa_node, 155b36970f2SChengwen Feng size_t private_data_size); 156b36970f2SChengwen Feng 157b36970f2SChengwen Feng /** 158b36970f2SChengwen Feng * @internal 159b36970f2SChengwen Feng * Release the specified dmadev. 160b36970f2SChengwen Feng * 161b36970f2SChengwen Feng * @param name 162b36970f2SChengwen Feng * DMA device name. 163b36970f2SChengwen Feng * 164b36970f2SChengwen Feng * @return 165b36970f2SChengwen Feng * - 0 on success, negative on error. 166b36970f2SChengwen Feng */ 167b36970f2SChengwen Feng __rte_internal 168b36970f2SChengwen Feng int rte_dma_pmd_release(const char *name); 169b36970f2SChengwen Feng 170c9e4d060SAmit Prakash Shukla /** 171c9e4d060SAmit Prakash Shukla * @internal 172c9e4d060SAmit Prakash Shukla * Get the rte_dma_dev structure device pointer for the device ID. 173c9e4d060SAmit Prakash Shukla * 174c9e4d060SAmit Prakash Shukla * @param dev_id 175c9e4d060SAmit Prakash Shukla * DMA device index in dmadev library. 176c9e4d060SAmit Prakash Shukla * 177c9e4d060SAmit Prakash Shukla * @return 178c9e4d060SAmit Prakash Shukla * rte_dma_dev structure pointer on success, NULL otherwise. 179c9e4d060SAmit Prakash Shukla */ 180c9e4d060SAmit Prakash Shukla __rte_internal 181c9e4d060SAmit Prakash Shukla struct rte_dma_dev *rte_dma_pmd_get_dev_by_id(int16_t dev_id); 182c9e4d060SAmit Prakash Shukla 183b36970f2SChengwen Feng #ifdef __cplusplus 184b36970f2SChengwen Feng } 185b36970f2SChengwen Feng #endif 186b36970f2SChengwen Feng 187b36970f2SChengwen Feng #endif /* RTE_DMADEV_PMD_H */ 188