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_ */ 639