xref: /dpdk/lib/dmadev/rte_dmadev_pmd.h (revision c6552d9a8deffa448de2d5e2e726f50508c1efd2)
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