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