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