1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606  * Copyright 2017 NXP
3d30ea906Sjfb8856606  */
4d30ea906Sjfb8856606 
5d30ea906Sjfb8856606 #ifndef _RTE_RAWDEV_PMD_H_
6d30ea906Sjfb8856606 #define _RTE_RAWDEV_PMD_H_
7d30ea906Sjfb8856606 
8d30ea906Sjfb8856606 /** @file
9d30ea906Sjfb8856606  * RTE RAW PMD APIs
10d30ea906Sjfb8856606  *
11d30ea906Sjfb8856606  * @note
12d30ea906Sjfb8856606  * Driver facing APIs for a raw device. These are not to be called directly by
13d30ea906Sjfb8856606  * any application.
14d30ea906Sjfb8856606  */
15d30ea906Sjfb8856606 
16d30ea906Sjfb8856606 #ifdef __cplusplus
17d30ea906Sjfb8856606 extern "C" {
18d30ea906Sjfb8856606 #endif
19d30ea906Sjfb8856606 
20d30ea906Sjfb8856606 #include <string.h>
21d30ea906Sjfb8856606 
22d30ea906Sjfb8856606 #include <rte_dev.h>
23d30ea906Sjfb8856606 #include <rte_malloc.h>
24d30ea906Sjfb8856606 #include <rte_log.h>
25d30ea906Sjfb8856606 #include <rte_common.h>
26d30ea906Sjfb8856606 
27d30ea906Sjfb8856606 #include "rte_rawdev.h"
28d30ea906Sjfb8856606 
29d30ea906Sjfb8856606 extern int librawdev_logtype;
30d30ea906Sjfb8856606 
31d30ea906Sjfb8856606 /* Logging Macros */
32d30ea906Sjfb8856606 #define RTE_RDEV_LOG(level, fmt, args...) \
33d30ea906Sjfb8856606 	rte_log(RTE_LOG_ ## level, librawdev_logtype, "%s(): " fmt "\n", \
34d30ea906Sjfb8856606 		__func__, ##args)
35d30ea906Sjfb8856606 
36d30ea906Sjfb8856606 #define RTE_RDEV_ERR(fmt, args...) \
37d30ea906Sjfb8856606 	RTE_RDEV_LOG(ERR, fmt, ## args)
38d30ea906Sjfb8856606 #define RTE_RDEV_DEBUG(fmt, args...) \
39d30ea906Sjfb8856606 	RTE_RDEV_LOG(DEBUG, fmt, ## args)
40d30ea906Sjfb8856606 #define RTE_RDEV_INFO(fmt, args...) \
41d30ea906Sjfb8856606 	RTE_RDEV_LOG(INFO, fmt, ## args)
42d30ea906Sjfb8856606 
43d30ea906Sjfb8856606 
44d30ea906Sjfb8856606 /* Macros to check for valid device */
45d30ea906Sjfb8856606 #define RTE_RAWDEV_VALID_DEVID_OR_ERR_RET(dev_id, retval) do { \
46d30ea906Sjfb8856606 	if (!rte_rawdev_pmd_is_valid_dev((dev_id))) { \
47d30ea906Sjfb8856606 		RTE_RDEV_ERR("Invalid dev_id=%d", dev_id); \
48d30ea906Sjfb8856606 		return retval; \
49d30ea906Sjfb8856606 	} \
50d30ea906Sjfb8856606 } while (0)
51d30ea906Sjfb8856606 
52d30ea906Sjfb8856606 #define RTE_RAWDEV_VALID_DEVID_OR_RET(dev_id) do { \
53d30ea906Sjfb8856606 	if (!rte_rawdev_pmd_is_valid_dev((dev_id))) { \
54d30ea906Sjfb8856606 		RTE_RDEV_ERR("Invalid dev_id=%d", dev_id); \
55d30ea906Sjfb8856606 		return; \
56d30ea906Sjfb8856606 	} \
57d30ea906Sjfb8856606 } while (0)
58d30ea906Sjfb8856606 
59d30ea906Sjfb8856606 #define RTE_RAWDEV_DETACHED  (0)
60d30ea906Sjfb8856606 #define RTE_RAWDEV_ATTACHED  (1)
61d30ea906Sjfb8856606 
62d30ea906Sjfb8856606 /* Global structure used for maintaining state of allocated raw devices.
63d30ea906Sjfb8856606  *
64d30ea906Sjfb8856606  * TODO: Can be expanded to <type of raw device>:<count> in future.
65d30ea906Sjfb8856606  *       Applications should be able to select from a number of type of raw
66d30ea906Sjfb8856606  *       devices which were detected or attached to this DPDK instance.
67d30ea906Sjfb8856606  */
68d30ea906Sjfb8856606 struct rte_rawdev_global {
69d30ea906Sjfb8856606 	/**< Number of devices found */
70d30ea906Sjfb8856606 	uint16_t nb_devs;
71d30ea906Sjfb8856606 };
72d30ea906Sjfb8856606 
73d30ea906Sjfb8856606 extern struct rte_rawdev *rte_rawdevs;
74d30ea906Sjfb8856606 /** The pool of rte_rawdev structures. */
75d30ea906Sjfb8856606 
76d30ea906Sjfb8856606 /**
77d30ea906Sjfb8856606  * Get the rte_rawdev structure device pointer for the named device.
78d30ea906Sjfb8856606  *
79d30ea906Sjfb8856606  * @param name
80d30ea906Sjfb8856606  *   device name to select the device structure.
81d30ea906Sjfb8856606  *
82d30ea906Sjfb8856606  * @return
83d30ea906Sjfb8856606  *   - The rte_rawdev structure pointer for the given device ID.
84d30ea906Sjfb8856606  */
85d30ea906Sjfb8856606 static inline struct rte_rawdev *
rte_rawdev_pmd_get_named_dev(const char * name)86d30ea906Sjfb8856606 rte_rawdev_pmd_get_named_dev(const char *name)
87d30ea906Sjfb8856606 {
88d30ea906Sjfb8856606 	struct rte_rawdev *dev;
89d30ea906Sjfb8856606 	unsigned int i;
90d30ea906Sjfb8856606 
91d30ea906Sjfb8856606 	if (name == NULL)
92d30ea906Sjfb8856606 		return NULL;
93d30ea906Sjfb8856606 
94d30ea906Sjfb8856606 	for (i = 0; i < RTE_RAWDEV_MAX_DEVS; i++) {
95d30ea906Sjfb8856606 		dev = &rte_rawdevs[i];
96d30ea906Sjfb8856606 		if ((dev->attached == RTE_RAWDEV_ATTACHED) &&
97d30ea906Sjfb8856606 		   (strcmp(dev->name, name) == 0))
98d30ea906Sjfb8856606 			return dev;
99d30ea906Sjfb8856606 	}
100d30ea906Sjfb8856606 
101d30ea906Sjfb8856606 	return NULL;
102d30ea906Sjfb8856606 }
103d30ea906Sjfb8856606 
104d30ea906Sjfb8856606 /**
105d30ea906Sjfb8856606  * Validate if the raw device index is a valid attached raw device.
106d30ea906Sjfb8856606  *
107d30ea906Sjfb8856606  * @param dev_id
108d30ea906Sjfb8856606  *   raw device index.
109d30ea906Sjfb8856606  *
110d30ea906Sjfb8856606  * @return
111d30ea906Sjfb8856606  *   - If the device index is valid (1) or not (0).
112d30ea906Sjfb8856606  */
113d30ea906Sjfb8856606 static inline unsigned
rte_rawdev_pmd_is_valid_dev(uint8_t dev_id)114d30ea906Sjfb8856606 rte_rawdev_pmd_is_valid_dev(uint8_t dev_id)
115d30ea906Sjfb8856606 {
116d30ea906Sjfb8856606 	struct rte_rawdev *dev;
117d30ea906Sjfb8856606 
118d30ea906Sjfb8856606 	if (dev_id >= RTE_RAWDEV_MAX_DEVS)
119d30ea906Sjfb8856606 		return 0;
120d30ea906Sjfb8856606 
121d30ea906Sjfb8856606 	dev = &rte_rawdevs[dev_id];
122d30ea906Sjfb8856606 	if (dev->attached != RTE_RAWDEV_ATTACHED)
123d30ea906Sjfb8856606 		return 0;
124d30ea906Sjfb8856606 	else
125d30ea906Sjfb8856606 		return 1;
126d30ea906Sjfb8856606 }
127d30ea906Sjfb8856606 
128d30ea906Sjfb8856606 /**
129d30ea906Sjfb8856606  * Definitions of all functions exported by a driver through the
130d30ea906Sjfb8856606  * the generic structure of type *rawdev_ops* supplied in the
131d30ea906Sjfb8856606  * *rte_rawdev* structure associated with a device.
132d30ea906Sjfb8856606  */
133d30ea906Sjfb8856606 
134d30ea906Sjfb8856606 /**
135d30ea906Sjfb8856606  * Get device information of a device.
136d30ea906Sjfb8856606  *
137d30ea906Sjfb8856606  * @param dev
138d30ea906Sjfb8856606  *   Raw device pointer
139d30ea906Sjfb8856606  * @param dev_info
140d30ea906Sjfb8856606  *   Raw device information structure
141*2d9fd380Sjfb8856606  * @param dev_private_size
142*2d9fd380Sjfb8856606  *   The size of the structure pointed to by dev_info->dev_private
143d30ea906Sjfb8856606  *
144d30ea906Sjfb8856606  * @return
145*2d9fd380Sjfb8856606  *   Returns 0 on success, negative error code on failure
146d30ea906Sjfb8856606  */
147*2d9fd380Sjfb8856606 typedef int (*rawdev_info_get_t)(struct rte_rawdev *dev,
148*2d9fd380Sjfb8856606 				  rte_rawdev_obj_t dev_info,
149*2d9fd380Sjfb8856606 				  size_t dev_private_size);
150d30ea906Sjfb8856606 
151d30ea906Sjfb8856606 /**
152d30ea906Sjfb8856606  * Configure a device.
153d30ea906Sjfb8856606  *
154d30ea906Sjfb8856606  * @param dev
155d30ea906Sjfb8856606  *   Raw device pointer
156d30ea906Sjfb8856606  * @param config
157d30ea906Sjfb8856606  *   Void object containing device specific configuration
158d30ea906Sjfb8856606  *
159d30ea906Sjfb8856606  * @return
160d30ea906Sjfb8856606  *   Returns 0 on success
161d30ea906Sjfb8856606  */
162d30ea906Sjfb8856606 typedef int (*rawdev_configure_t)(const struct rte_rawdev *dev,
163*2d9fd380Sjfb8856606 				  rte_rawdev_obj_t config,
164*2d9fd380Sjfb8856606 				  size_t config_size);
165d30ea906Sjfb8856606 
166d30ea906Sjfb8856606 /**
167d30ea906Sjfb8856606  * Start a configured device.
168d30ea906Sjfb8856606  *
169d30ea906Sjfb8856606  * @param dev
170d30ea906Sjfb8856606  *   Raw device pointer
171d30ea906Sjfb8856606  *
172d30ea906Sjfb8856606  * @return
173d30ea906Sjfb8856606  *   Returns 0 on success
174d30ea906Sjfb8856606  */
175d30ea906Sjfb8856606 typedef int (*rawdev_start_t)(struct rte_rawdev *dev);
176d30ea906Sjfb8856606 
177d30ea906Sjfb8856606 /**
178d30ea906Sjfb8856606  * Stop a configured device.
179d30ea906Sjfb8856606  *
180d30ea906Sjfb8856606  * @param dev
181d30ea906Sjfb8856606  *   Raw device pointer
182d30ea906Sjfb8856606  */
183d30ea906Sjfb8856606 typedef void (*rawdev_stop_t)(struct rte_rawdev *dev);
184d30ea906Sjfb8856606 
185d30ea906Sjfb8856606 /**
186d30ea906Sjfb8856606  * Close a configured device.
187d30ea906Sjfb8856606  *
188d30ea906Sjfb8856606  * @param dev
189d30ea906Sjfb8856606  *   Raw device pointer
190d30ea906Sjfb8856606  *
191d30ea906Sjfb8856606  * @return
192d30ea906Sjfb8856606  * - 0 on success
193d30ea906Sjfb8856606  * - (-EAGAIN) if can't close as device is busy
194d30ea906Sjfb8856606  */
195d30ea906Sjfb8856606 typedef int (*rawdev_close_t)(struct rte_rawdev *dev);
196d30ea906Sjfb8856606 
197d30ea906Sjfb8856606 /**
198d30ea906Sjfb8856606  * Reset a configured device.
199d30ea906Sjfb8856606  *
200d30ea906Sjfb8856606  * @param dev
201d30ea906Sjfb8856606  *   Raw device pointer
202d30ea906Sjfb8856606  * @return
203d30ea906Sjfb8856606  *   0 for success
204d30ea906Sjfb8856606  *   !0 for failure
205d30ea906Sjfb8856606  */
206d30ea906Sjfb8856606 typedef int (*rawdev_reset_t)(struct rte_rawdev *dev);
207d30ea906Sjfb8856606 
208d30ea906Sjfb8856606 /**
209d30ea906Sjfb8856606  * Retrieve the current raw queue configuration.
210d30ea906Sjfb8856606  *
211d30ea906Sjfb8856606  * @param dev
212d30ea906Sjfb8856606  *   Raw device pointer
213d30ea906Sjfb8856606  * @param queue_id
214d30ea906Sjfb8856606  *   Raw device queue index
215d30ea906Sjfb8856606  * @param[out] queue_conf
216d30ea906Sjfb8856606  *   Raw device queue configuration structure
217d30ea906Sjfb8856606  *
218*2d9fd380Sjfb8856606  * @return
219*2d9fd380Sjfb8856606  *   Returns 0 on success, negative errno on failure
220d30ea906Sjfb8856606  */
221*2d9fd380Sjfb8856606 typedef int (*rawdev_queue_conf_get_t)(struct rte_rawdev *dev,
222d30ea906Sjfb8856606 					uint16_t queue_id,
223*2d9fd380Sjfb8856606 					rte_rawdev_obj_t queue_conf,
224*2d9fd380Sjfb8856606 					size_t queue_conf_size);
225d30ea906Sjfb8856606 
226d30ea906Sjfb8856606 /**
227d30ea906Sjfb8856606  * Setup an raw queue.
228d30ea906Sjfb8856606  *
229d30ea906Sjfb8856606  * @param dev
230d30ea906Sjfb8856606  *   Raw device pointer
231d30ea906Sjfb8856606  * @param queue_id
232d30ea906Sjfb8856606  *   Rawqueue index
233d30ea906Sjfb8856606  * @param queue_conf
234d30ea906Sjfb8856606  *   Rawqueue configuration structure
235d30ea906Sjfb8856606  *
236d30ea906Sjfb8856606  * @return
237d30ea906Sjfb8856606  *   Returns 0 on success.
238d30ea906Sjfb8856606  */
239d30ea906Sjfb8856606 typedef int (*rawdev_queue_setup_t)(struct rte_rawdev *dev,
240d30ea906Sjfb8856606 				    uint16_t queue_id,
241*2d9fd380Sjfb8856606 				    rte_rawdev_obj_t queue_conf,
242*2d9fd380Sjfb8856606 				    size_t queue_conf_size);
243d30ea906Sjfb8856606 
244d30ea906Sjfb8856606 /**
245d30ea906Sjfb8856606  * Release resources allocated by given raw queue.
246d30ea906Sjfb8856606  *
247d30ea906Sjfb8856606  * @param dev
248d30ea906Sjfb8856606  *   Raw device pointer
249d30ea906Sjfb8856606  * @param queue_id
250d30ea906Sjfb8856606  *   Raw queue index
251d30ea906Sjfb8856606  *
252d30ea906Sjfb8856606  */
253d30ea906Sjfb8856606 typedef int (*rawdev_queue_release_t)(struct rte_rawdev *dev,
254d30ea906Sjfb8856606 				      uint16_t queue_id);
255d30ea906Sjfb8856606 
256d30ea906Sjfb8856606 /**
257d30ea906Sjfb8856606  * Get the count of number of queues configured on this device.
258d30ea906Sjfb8856606  *
259d30ea906Sjfb8856606  * Another way to fetch this information is to fetch the device configuration.
260d30ea906Sjfb8856606  * But, that assumes that the device configuration managed by the driver has
261d30ea906Sjfb8856606  * that kind of information.
262d30ea906Sjfb8856606  *
263d30ea906Sjfb8856606  * This function helps in getting queue count supported, independently. It
264d30ea906Sjfb8856606  * can help in cases where iterator needs to be implemented.
265d30ea906Sjfb8856606  *
266d30ea906Sjfb8856606  * @param
267d30ea906Sjfb8856606  *   Raw device pointer
268d30ea906Sjfb8856606  * @return
269d30ea906Sjfb8856606  *   Number of queues; 0 is assumed to be a valid response.
270d30ea906Sjfb8856606  *
271d30ea906Sjfb8856606  */
272d30ea906Sjfb8856606 typedef uint16_t (*rawdev_queue_count_t)(struct rte_rawdev *dev);
273d30ea906Sjfb8856606 
274d30ea906Sjfb8856606 /**
275d30ea906Sjfb8856606  * Enqueue an array of raw buffers to the device.
276d30ea906Sjfb8856606  *
277d30ea906Sjfb8856606  * Buffer being used is opaque - it can be obtained from mempool or from
278d30ea906Sjfb8856606  * any other source. Interpretation of buffer is responsibility of driver.
279d30ea906Sjfb8856606  *
280d30ea906Sjfb8856606  * @param dev
281d30ea906Sjfb8856606  *   Raw device pointer
282d30ea906Sjfb8856606  * @param bufs
283d30ea906Sjfb8856606  *   array of buffers
284d30ea906Sjfb8856606  * @param count
285d30ea906Sjfb8856606  *   number of buffers passed
286d30ea906Sjfb8856606  * @param context
287d30ea906Sjfb8856606  *   an opaque object representing context of the call; for example, an
288d30ea906Sjfb8856606  *   application can pass information about the queues on which enqueue needs
289d30ea906Sjfb8856606  *   to be done. Or, the enqueue operation might be passed reference to an
2901646932aSjfb8856606  *   object containing a callback (agreed upon between application and driver).
291d30ea906Sjfb8856606  *
292d30ea906Sjfb8856606  * @return
293d30ea906Sjfb8856606  *   >=0 Count of buffers successfully enqueued (0: no buffers enqueued)
294d30ea906Sjfb8856606  *   <0 Error count in case of error
295d30ea906Sjfb8856606  */
296d30ea906Sjfb8856606 typedef int (*rawdev_enqueue_bufs_t)(struct rte_rawdev *dev,
297d30ea906Sjfb8856606 				     struct rte_rawdev_buf **buffers,
298d30ea906Sjfb8856606 				     unsigned int count,
299d30ea906Sjfb8856606 				     rte_rawdev_obj_t context);
300d30ea906Sjfb8856606 
301d30ea906Sjfb8856606 /**
302d30ea906Sjfb8856606  * Dequeue an array of raw buffers from the device.
303d30ea906Sjfb8856606  *
304d30ea906Sjfb8856606  * @param dev
305d30ea906Sjfb8856606  *   Raw device pointer
306d30ea906Sjfb8856606  * @param bufs
307d30ea906Sjfb8856606  *   array of buffers
308d30ea906Sjfb8856606  * @param count
309d30ea906Sjfb8856606  *   Max buffers expected to be dequeued
310d30ea906Sjfb8856606  * @param context
311d30ea906Sjfb8856606  *   an opaque object representing context of the call. Based on this object,
312d30ea906Sjfb8856606  *   the application and driver can coordinate for dequeue operation involving
313d30ea906Sjfb8856606  *   agreed upon semantics. For example, queue information/id on which Dequeue
314d30ea906Sjfb8856606  *   needs to be performed.
315d30ea906Sjfb8856606  * @return
316d30ea906Sjfb8856606  *   >0, ~0: Count of buffers returned
317d30ea906Sjfb8856606  *   <0: Error
318d30ea906Sjfb8856606  *   Whether short dequeue is success or failure is decided between app and
319d30ea906Sjfb8856606  *   driver.
320d30ea906Sjfb8856606  */
321d30ea906Sjfb8856606 typedef int (*rawdev_dequeue_bufs_t)(struct rte_rawdev *dev,
322d30ea906Sjfb8856606 				     struct rte_rawdev_buf **buffers,
323d30ea906Sjfb8856606 				     unsigned int count,
324d30ea906Sjfb8856606 				     rte_rawdev_obj_t context);
325d30ea906Sjfb8856606 
326d30ea906Sjfb8856606 /**
327d30ea906Sjfb8856606  * Dump internal information
328d30ea906Sjfb8856606  *
329d30ea906Sjfb8856606  * @param dev
330d30ea906Sjfb8856606  *   Raw device pointer
331d30ea906Sjfb8856606  * @param f
332d30ea906Sjfb8856606  *   A pointer to a file for output
333d30ea906Sjfb8856606  * @return
334d30ea906Sjfb8856606  *   0 for success,
335d30ea906Sjfb8856606  *   !0 Error
336d30ea906Sjfb8856606  *
337d30ea906Sjfb8856606  */
338d30ea906Sjfb8856606 typedef int (*rawdev_dump_t)(struct rte_rawdev *dev, FILE *f);
339d30ea906Sjfb8856606 
340d30ea906Sjfb8856606 /**
341d30ea906Sjfb8856606  * Get an attribute value from implementation.
342d30ea906Sjfb8856606  * Attribute is an opaque handle agreed upon between application and PMD.
343d30ea906Sjfb8856606  *
344d30ea906Sjfb8856606  * @param dev
345d30ea906Sjfb8856606  *   Raw device pointer
346d30ea906Sjfb8856606  * @param attr_name
347d30ea906Sjfb8856606  *   Opaque object representing an attribute in implementation.
348d30ea906Sjfb8856606  * @param attr_value [out]
349d30ea906Sjfb8856606  *   Opaque response to the attribute value. In case of error, this remains
350d30ea906Sjfb8856606  *   untouched. This is double pointer of void type.
351d30ea906Sjfb8856606  * @return
352d30ea906Sjfb8856606  *   0 for success
353d30ea906Sjfb8856606  *  !0 Error; attr_value remains untouched in case of error.
354d30ea906Sjfb8856606  */
355d30ea906Sjfb8856606 typedef int (*rawdev_get_attr_t)(struct rte_rawdev *dev,
356d30ea906Sjfb8856606 				 const char *attr_name,
357d30ea906Sjfb8856606 				 uint64_t *attr_value);
358d30ea906Sjfb8856606 
359d30ea906Sjfb8856606 /**
360d30ea906Sjfb8856606  * Set an attribute value.
361d30ea906Sjfb8856606  * Attribute is an opaque handle agreed upon between application and PMD.
362d30ea906Sjfb8856606  *
363d30ea906Sjfb8856606  * @param dev
364d30ea906Sjfb8856606  *   Raw device pointer
365d30ea906Sjfb8856606  * @param attr_name
366d30ea906Sjfb8856606  *   Opaque object representing an attribute in implementation.
367d30ea906Sjfb8856606  * @param attr_value
368d30ea906Sjfb8856606  *   Value of the attribute represented by attr_name
369d30ea906Sjfb8856606  * @return
370d30ea906Sjfb8856606  *   0 for success
371d30ea906Sjfb8856606  *  !0 Error
372d30ea906Sjfb8856606  */
373d30ea906Sjfb8856606 typedef int (*rawdev_set_attr_t)(struct rte_rawdev *dev,
374d30ea906Sjfb8856606 				 const char *attr_name,
375d30ea906Sjfb8856606 				 const uint64_t attr_value);
376d30ea906Sjfb8856606 
377d30ea906Sjfb8856606 /**
378d30ea906Sjfb8856606  * Retrieve a set of statistics from device.
379d30ea906Sjfb8856606  * Note: Being a raw device, the stats are specific to the device being
380d30ea906Sjfb8856606  * implemented thus represented as xstats.
381d30ea906Sjfb8856606  *
382d30ea906Sjfb8856606  * @param dev
383d30ea906Sjfb8856606  *   Raw device pointer
384d30ea906Sjfb8856606  * @param ids
385d30ea906Sjfb8856606  *   The stat ids to retrieve
386d30ea906Sjfb8856606  * @param values
387d30ea906Sjfb8856606  *   The returned stat values
388d30ea906Sjfb8856606  * @param n
389d30ea906Sjfb8856606  *   The number of id values and entries in the values array
390d30ea906Sjfb8856606  * @return
391d30ea906Sjfb8856606  *   The number of stat values successfully filled into the values array
392d30ea906Sjfb8856606  */
393d30ea906Sjfb8856606 typedef int (*rawdev_xstats_get_t)(const struct rte_rawdev *dev,
394d30ea906Sjfb8856606 		const unsigned int ids[], uint64_t values[], unsigned int n);
395d30ea906Sjfb8856606 
396d30ea906Sjfb8856606 /**
397d30ea906Sjfb8856606  * Resets the statistic values in xstats for the device.
398d30ea906Sjfb8856606  */
399d30ea906Sjfb8856606 typedef int (*rawdev_xstats_reset_t)(struct rte_rawdev *dev,
400d30ea906Sjfb8856606 		const uint32_t ids[],
401d30ea906Sjfb8856606 		uint32_t nb_ids);
402d30ea906Sjfb8856606 
403d30ea906Sjfb8856606 /**
404d30ea906Sjfb8856606  * Get names of extended stats of an raw device
405d30ea906Sjfb8856606  *
406d30ea906Sjfb8856606  * @param dev
407d30ea906Sjfb8856606  *   Raw device pointer
408d30ea906Sjfb8856606  * @param xstats_names
409d30ea906Sjfb8856606  *   Array of name values to be filled in
410d30ea906Sjfb8856606  * @param size
411d30ea906Sjfb8856606  *   Number of values in the xstats_names array
412d30ea906Sjfb8856606  * @return
413d30ea906Sjfb8856606  *   When size >= the number of stats, return the number of stat values filled
414d30ea906Sjfb8856606  *   into the array.
415d30ea906Sjfb8856606  *   When size < the number of available stats, return the number of stats
416d30ea906Sjfb8856606  *   values, and do not fill in any data into xstats_names.
417d30ea906Sjfb8856606  */
418d30ea906Sjfb8856606 typedef int (*rawdev_xstats_get_names_t)(const struct rte_rawdev *dev,
419d30ea906Sjfb8856606 		struct rte_rawdev_xstats_name *xstats_names,
420d30ea906Sjfb8856606 		unsigned int size);
421d30ea906Sjfb8856606 
422d30ea906Sjfb8856606 /**
423d30ea906Sjfb8856606  * Get value of one stats and optionally return its id
424d30ea906Sjfb8856606  *
425d30ea906Sjfb8856606  * @param dev
426d30ea906Sjfb8856606  *   Raw device pointer
427d30ea906Sjfb8856606  * @param name
428d30ea906Sjfb8856606  *   The name of the stat to retrieve
429d30ea906Sjfb8856606  * @param id
430d30ea906Sjfb8856606  *   Pointer to an unsigned int where we store the stat-id.
431d30ea906Sjfb8856606  *   This pointer may be null if the id is not required.
432d30ea906Sjfb8856606  * @return
433d30ea906Sjfb8856606  *   The value of the stat, or (uint64_t)-1 if the stat is not found.
434d30ea906Sjfb8856606  *   If the stat is not found, the id value will be returned as (unsigned)-1,
435d30ea906Sjfb8856606  *   if id pointer is non-NULL
436d30ea906Sjfb8856606  */
437d30ea906Sjfb8856606 typedef uint64_t (*rawdev_xstats_get_by_name_t)(const struct rte_rawdev *dev,
438d30ea906Sjfb8856606 						const char *name,
439d30ea906Sjfb8856606 						unsigned int *id);
440d30ea906Sjfb8856606 
441d30ea906Sjfb8856606 /**
442d30ea906Sjfb8856606  * Get firmware/device-stack status.
443d30ea906Sjfb8856606  * Implementation to allocate buffer for returning information.
444d30ea906Sjfb8856606  *
445d30ea906Sjfb8856606  * @param dev
446d30ea906Sjfb8856606  *   Raw device pointer
447d30ea906Sjfb8856606  * @param status
448d30ea906Sjfb8856606  *   void block containing device specific status information
449d30ea906Sjfb8856606  * @return
450d30ea906Sjfb8856606  *   0 for success,
451d30ea906Sjfb8856606  *   !0 for failure, with undefined value in `status_info`
452d30ea906Sjfb8856606  */
453d30ea906Sjfb8856606 typedef int (*rawdev_firmware_status_get_t)(struct rte_rawdev *dev,
454d30ea906Sjfb8856606 					    rte_rawdev_obj_t status_info);
455d30ea906Sjfb8856606 
456d30ea906Sjfb8856606 /**
457d30ea906Sjfb8856606  * Get firmware version information
458d30ea906Sjfb8856606  *
459d30ea906Sjfb8856606  * @param dev
460d30ea906Sjfb8856606  *   Raw device pointer
461d30ea906Sjfb8856606  * @param version_info
462d30ea906Sjfb8856606  *   void pointer to version information returned by device
463d30ea906Sjfb8856606  * @return
464d30ea906Sjfb8856606  *   0 for success,
465d30ea906Sjfb8856606  *   !0 for failure, with undefined value in `version_info`
466d30ea906Sjfb8856606  */
467d30ea906Sjfb8856606 typedef int (*rawdev_firmware_version_get_t)(struct rte_rawdev *dev,
468d30ea906Sjfb8856606 					     rte_rawdev_obj_t version_info);
469d30ea906Sjfb8856606 
470d30ea906Sjfb8856606 /**
4711646932aSjfb8856606  * Load firmware from a buffer (DMA'able)
472d30ea906Sjfb8856606  *
473d30ea906Sjfb8856606  * @param dev
474d30ea906Sjfb8856606  *   Raw device pointer
475d30ea906Sjfb8856606  * @param firmware_file
476d30ea906Sjfb8856606  *   file pointer to firmware area
477d30ea906Sjfb8856606  * @return
478d30ea906Sjfb8856606  *   >0, ~0: for successful load
479d30ea906Sjfb8856606  *   <0: for failure
480d30ea906Sjfb8856606  *
481d30ea906Sjfb8856606  * @see Application may use 'firmware_version_get` for ascertaining successful
482d30ea906Sjfb8856606  * load
483d30ea906Sjfb8856606  */
484d30ea906Sjfb8856606 typedef int (*rawdev_firmware_load_t)(struct rte_rawdev *dev,
485d30ea906Sjfb8856606 				      rte_rawdev_obj_t firmware_buf);
486d30ea906Sjfb8856606 
487d30ea906Sjfb8856606 /**
4881646932aSjfb8856606  * Unload firmware
489d30ea906Sjfb8856606  *
490d30ea906Sjfb8856606  * @param dev
491d30ea906Sjfb8856606  *   Raw device pointer
492d30ea906Sjfb8856606  * @return
493d30ea906Sjfb8856606  *   >0, ~0 for successful unloading
494d30ea906Sjfb8856606  *   <0 for failure in unloading
495d30ea906Sjfb8856606  *
496d30ea906Sjfb8856606  * Note: Application can use the `firmware_status_get` or
497d30ea906Sjfb8856606  * `firmware_version_get` to get result of unload.
498d30ea906Sjfb8856606  */
499d30ea906Sjfb8856606 typedef int (*rawdev_firmware_unload_t)(struct rte_rawdev *dev);
500d30ea906Sjfb8856606 
501d30ea906Sjfb8856606 /**
502d30ea906Sjfb8856606  * Start rawdev selftest
503d30ea906Sjfb8856606  *
504d30ea906Sjfb8856606  * @return
505d30ea906Sjfb8856606  *   Return 0 on success
506d30ea906Sjfb8856606  */
5074418919fSjohnjiang typedef int (*rawdev_selftest_t)(uint16_t dev_id);
508d30ea906Sjfb8856606 
509d30ea906Sjfb8856606 /** Rawdevice operations function pointer table */
510d30ea906Sjfb8856606 struct rte_rawdev_ops {
511d30ea906Sjfb8856606 	/**< Get device info. */
512d30ea906Sjfb8856606 	rawdev_info_get_t dev_info_get;
513d30ea906Sjfb8856606 	/**< Configure device. */
514d30ea906Sjfb8856606 	rawdev_configure_t dev_configure;
515d30ea906Sjfb8856606 	/**< Start device. */
516d30ea906Sjfb8856606 	rawdev_start_t dev_start;
517d30ea906Sjfb8856606 	/**< Stop device. */
518d30ea906Sjfb8856606 	rawdev_stop_t dev_stop;
519d30ea906Sjfb8856606 	/**< Close device. */
520d30ea906Sjfb8856606 	rawdev_close_t dev_close;
521d30ea906Sjfb8856606 	/**< Reset device. */
522d30ea906Sjfb8856606 	rawdev_reset_t dev_reset;
523d30ea906Sjfb8856606 
524d30ea906Sjfb8856606 	/**< Get raw queue configuration. */
525d30ea906Sjfb8856606 	rawdev_queue_conf_get_t queue_def_conf;
526d30ea906Sjfb8856606 	/**< Set up an raw queue. */
527d30ea906Sjfb8856606 	rawdev_queue_setup_t queue_setup;
528d30ea906Sjfb8856606 	/**< Release an raw queue. */
529d30ea906Sjfb8856606 	rawdev_queue_release_t queue_release;
530d30ea906Sjfb8856606 	/**< Get the number of queues attached to the device */
531d30ea906Sjfb8856606 	rawdev_queue_count_t queue_count;
532d30ea906Sjfb8856606 
533d30ea906Sjfb8856606 	/**< Enqueue an array of raw buffers to device. */
534d30ea906Sjfb8856606 	rawdev_enqueue_bufs_t enqueue_bufs;
535d30ea906Sjfb8856606 	/**< Dequeue an array of raw buffers from device. */
536d30ea906Sjfb8856606 	/** TODO: Callback based enqueue and dequeue support */
537d30ea906Sjfb8856606 	rawdev_dequeue_bufs_t dequeue_bufs;
538d30ea906Sjfb8856606 
539d30ea906Sjfb8856606 	/* Dump internal information */
540d30ea906Sjfb8856606 	rawdev_dump_t dump;
541d30ea906Sjfb8856606 
542d30ea906Sjfb8856606 	/**< Get an attribute managed by the implementation */
543d30ea906Sjfb8856606 	rawdev_get_attr_t attr_get;
544d30ea906Sjfb8856606 	/**< Set an attribute managed by the implementation */
545d30ea906Sjfb8856606 	rawdev_set_attr_t attr_set;
546d30ea906Sjfb8856606 
547d30ea906Sjfb8856606 	/**< Get extended device statistics. */
548d30ea906Sjfb8856606 	rawdev_xstats_get_t xstats_get;
549d30ea906Sjfb8856606 	/**< Get names of extended stats. */
550d30ea906Sjfb8856606 	rawdev_xstats_get_names_t xstats_get_names;
551d30ea906Sjfb8856606 	/**< Get one value by name. */
552d30ea906Sjfb8856606 	rawdev_xstats_get_by_name_t xstats_get_by_name;
553d30ea906Sjfb8856606 	/**< Reset the statistics values in xstats. */
554d30ea906Sjfb8856606 	rawdev_xstats_reset_t xstats_reset;
555d30ea906Sjfb8856606 
5561646932aSjfb8856606 	/**< Obtain firmware status */
557d30ea906Sjfb8856606 	rawdev_firmware_status_get_t firmware_status_get;
558d30ea906Sjfb8856606 	/**< Obtain firmware version information */
559d30ea906Sjfb8856606 	rawdev_firmware_version_get_t firmware_version_get;
560d30ea906Sjfb8856606 	/**< Load firmware */
561d30ea906Sjfb8856606 	rawdev_firmware_load_t firmware_load;
562d30ea906Sjfb8856606 	/**< Unload firmware */
563d30ea906Sjfb8856606 	rawdev_firmware_unload_t firmware_unload;
564d30ea906Sjfb8856606 
565d30ea906Sjfb8856606 	/**< Device selftest function */
566d30ea906Sjfb8856606 	rawdev_selftest_t dev_selftest;
567d30ea906Sjfb8856606 };
568d30ea906Sjfb8856606 
569d30ea906Sjfb8856606 /**
570d30ea906Sjfb8856606  * Allocates a new rawdev slot for an raw device and returns the pointer
571d30ea906Sjfb8856606  * to that slot for the driver to use.
572d30ea906Sjfb8856606  *
573d30ea906Sjfb8856606  * @param name
574d30ea906Sjfb8856606  *   Unique identifier name for each device
575d30ea906Sjfb8856606  * @param dev_private_size
5764418919fSjohnjiang  *   Size of private data memory allocated within rte_rawdev object.
5774418919fSjohnjiang  *   Set to 0 to disable internal memory allocation and allow for
5784418919fSjohnjiang  *   self-allocation.
579d30ea906Sjfb8856606  * @param socket_id
580d30ea906Sjfb8856606  *   Socket to allocate resources on.
581d30ea906Sjfb8856606  * @return
582d30ea906Sjfb8856606  *   - Slot in the rte_dev_devices array for a new device;
583d30ea906Sjfb8856606  */
584d30ea906Sjfb8856606 struct rte_rawdev *
585d30ea906Sjfb8856606 rte_rawdev_pmd_allocate(const char *name, size_t dev_private_size,
586d30ea906Sjfb8856606 			int socket_id);
587d30ea906Sjfb8856606 
588d30ea906Sjfb8856606 /**
589d30ea906Sjfb8856606  * Release the specified rawdev device.
590d30ea906Sjfb8856606  *
591d30ea906Sjfb8856606  * @param rawdev
592d30ea906Sjfb8856606  * The *rawdev* pointer is the address of the *rte_rawdev* structure.
593d30ea906Sjfb8856606  * @return
594d30ea906Sjfb8856606  *   - 0 on success, negative on error
595d30ea906Sjfb8856606  */
596d30ea906Sjfb8856606 int
597d30ea906Sjfb8856606 rte_rawdev_pmd_release(struct rte_rawdev *rawdev);
598d30ea906Sjfb8856606 
599d30ea906Sjfb8856606 /**
600d30ea906Sjfb8856606  * Creates a new raw device and returns the pointer to that device.
601d30ea906Sjfb8856606  *
602d30ea906Sjfb8856606  * @param name
603d30ea906Sjfb8856606  *   Pointer to a character array containing name of the device
604d30ea906Sjfb8856606  * @param dev_private_size
605d30ea906Sjfb8856606  *   Size of raw PMDs private data
606d30ea906Sjfb8856606  * @param socket_id
607d30ea906Sjfb8856606  *   Socket to allocate resources on.
608d30ea906Sjfb8856606  *
609d30ea906Sjfb8856606  * @return
610d30ea906Sjfb8856606  *   - Raw device pointer if device is successfully created.
611d30ea906Sjfb8856606  *   - NULL if device cannot be created.
612d30ea906Sjfb8856606  */
613d30ea906Sjfb8856606 struct rte_rawdev *
614d30ea906Sjfb8856606 rte_rawdev_pmd_init(const char *name, size_t dev_private_size,
615d30ea906Sjfb8856606 		    int socket_id);
616d30ea906Sjfb8856606 
617d30ea906Sjfb8856606 /**
618d30ea906Sjfb8856606  * Destroy a raw device
619d30ea906Sjfb8856606  *
620d30ea906Sjfb8856606  * @param name
621d30ea906Sjfb8856606  *   Name of the device
622d30ea906Sjfb8856606  * @return
623d30ea906Sjfb8856606  *   - 0 on success, negative on error
624d30ea906Sjfb8856606  */
625d30ea906Sjfb8856606 int
626d30ea906Sjfb8856606 rte_rawdev_pmd_uninit(const char *name);
627d30ea906Sjfb8856606 
628d30ea906Sjfb8856606 #ifdef __cplusplus
629d30ea906Sjfb8856606 }
630d30ea906Sjfb8856606 #endif
631d30ea906Sjfb8856606 
632d30ea906Sjfb8856606 #endif /* _RTE_RAWDEV_PMD_H_ */
633