1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause 2d30ea906Sjfb8856606 * Copyright(c) 2017 Intel Corporation 3d30ea906Sjfb8856606 */ 4d30ea906Sjfb8856606 5d30ea906Sjfb8856606 #ifndef _RTE_BBDEV_PMD_H_ 6d30ea906Sjfb8856606 #define _RTE_BBDEV_PMD_H_ 7d30ea906Sjfb8856606 8d30ea906Sjfb8856606 /** 9d30ea906Sjfb8856606 * @file rte_bbdev_pmd.h 10d30ea906Sjfb8856606 * 11d30ea906Sjfb8856606 * Wireless base band driver-facing APIs. 12d30ea906Sjfb8856606 * 13d30ea906Sjfb8856606 * @warning 14d30ea906Sjfb8856606 * @b EXPERIMENTAL: this API may change without prior notice 15d30ea906Sjfb8856606 * 16d30ea906Sjfb8856606 * This API provides the mechanism for device drivers to register with the 17d30ea906Sjfb8856606 * bbdev interface. User applications should not use this API. 18d30ea906Sjfb8856606 */ 19d30ea906Sjfb8856606 20d30ea906Sjfb8856606 #ifdef __cplusplus 21d30ea906Sjfb8856606 extern "C" { 22d30ea906Sjfb8856606 #endif 23d30ea906Sjfb8856606 24d30ea906Sjfb8856606 #include <stdint.h> 25d30ea906Sjfb8856606 #include <rte_log.h> 26d30ea906Sjfb8856606 27d30ea906Sjfb8856606 #include "rte_bbdev.h" 28d30ea906Sjfb8856606 29d30ea906Sjfb8856606 /** Suggested value for SW based devices */ 30d30ea906Sjfb8856606 #define RTE_BBDEV_DEFAULT_MAX_NB_QUEUES RTE_MAX_LCORE 31d30ea906Sjfb8856606 32d30ea906Sjfb8856606 /** Suggested value for SW based devices */ 33d30ea906Sjfb8856606 #define RTE_BBDEV_QUEUE_SIZE_LIMIT 16384 34d30ea906Sjfb8856606 35d30ea906Sjfb8856606 /** 36d30ea906Sjfb8856606 * @internal 37d30ea906Sjfb8856606 * Allocates a new slot for a bbdev and returns the pointer to that slot 38d30ea906Sjfb8856606 * for the driver to use. 39d30ea906Sjfb8856606 * 40d30ea906Sjfb8856606 * @param name 41d30ea906Sjfb8856606 * Unique identifier name for each bbdev device 42d30ea906Sjfb8856606 * 43d30ea906Sjfb8856606 * @return 44d30ea906Sjfb8856606 * - Slot in the rte_bbdev array for a new device; 45d30ea906Sjfb8856606 */ 464418919fSjohnjiang __rte_experimental 474418919fSjohnjiang struct rte_bbdev * 48d30ea906Sjfb8856606 rte_bbdev_allocate(const char *name); 49d30ea906Sjfb8856606 50d30ea906Sjfb8856606 /** 51d30ea906Sjfb8856606 * @internal 52d30ea906Sjfb8856606 * Release the specified bbdev. 53d30ea906Sjfb8856606 * 54d30ea906Sjfb8856606 * @param bbdev 55d30ea906Sjfb8856606 * The *bbdev* pointer is the address of the *rte_bbdev* structure. 56d30ea906Sjfb8856606 * @return 57d30ea906Sjfb8856606 * - 0 on success, negative on error 58d30ea906Sjfb8856606 */ 594418919fSjohnjiang __rte_experimental 604418919fSjohnjiang int 61d30ea906Sjfb8856606 rte_bbdev_release(struct rte_bbdev *bbdev); 62d30ea906Sjfb8856606 63d30ea906Sjfb8856606 /** 64d30ea906Sjfb8856606 * Get the device structure for a named device. 65d30ea906Sjfb8856606 * 66d30ea906Sjfb8856606 * @param name 67d30ea906Sjfb8856606 * Name of the device 68d30ea906Sjfb8856606 * 69d30ea906Sjfb8856606 * @return 70d30ea906Sjfb8856606 * - The device structure pointer, or 71d30ea906Sjfb8856606 * - NULL otherwise 72d30ea906Sjfb8856606 * 73d30ea906Sjfb8856606 */ 744418919fSjohnjiang __rte_experimental 754418919fSjohnjiang struct rte_bbdev * 76d30ea906Sjfb8856606 rte_bbdev_get_named_dev(const char *name); 77d30ea906Sjfb8856606 78d30ea906Sjfb8856606 /** 79d30ea906Sjfb8856606 * Definitions of all functions exported by a driver through the the generic 80d30ea906Sjfb8856606 * structure of type *rte_bbdev_ops* supplied in the *rte_bbdev* structure 81d30ea906Sjfb8856606 * associated with a device. 82d30ea906Sjfb8856606 */ 83d30ea906Sjfb8856606 84d30ea906Sjfb8856606 /** @internal Function used to configure device memory. */ 85d30ea906Sjfb8856606 typedef int (*rte_bbdev_setup_queues_t)(struct rte_bbdev *dev, 86d30ea906Sjfb8856606 uint16_t num_queues, int socket_id); 87d30ea906Sjfb8856606 88d30ea906Sjfb8856606 /** @internal Function used to configure interrupts for a device. */ 89d30ea906Sjfb8856606 typedef int (*rte_bbdev_intr_enable_t)(struct rte_bbdev *dev); 90d30ea906Sjfb8856606 91d30ea906Sjfb8856606 /** @internal Function to allocate and configure a device queue. */ 92d30ea906Sjfb8856606 typedef int (*rte_bbdev_queue_setup_t)(struct rte_bbdev *dev, 93d30ea906Sjfb8856606 uint16_t queue_id, const struct rte_bbdev_queue_conf *conf); 94d30ea906Sjfb8856606 95d30ea906Sjfb8856606 /* 96d30ea906Sjfb8856606 * @internal 97d30ea906Sjfb8856606 * Function to release memory resources allocated for a device queue. 98d30ea906Sjfb8856606 */ 99d30ea906Sjfb8856606 typedef int (*rte_bbdev_queue_release_t)(struct rte_bbdev *dev, 100d30ea906Sjfb8856606 uint16_t queue_id); 101d30ea906Sjfb8856606 102d30ea906Sjfb8856606 /** @internal Function to start a configured device. */ 103d30ea906Sjfb8856606 typedef int (*rte_bbdev_start_t)(struct rte_bbdev *dev); 104d30ea906Sjfb8856606 105d30ea906Sjfb8856606 /** @internal Function to stop a device. */ 106d30ea906Sjfb8856606 typedef void (*rte_bbdev_stop_t)(struct rte_bbdev *dev); 107d30ea906Sjfb8856606 108d30ea906Sjfb8856606 /** @internal Function to close a device. */ 109d30ea906Sjfb8856606 typedef int (*rte_bbdev_close_t)(struct rte_bbdev *dev); 110d30ea906Sjfb8856606 111d30ea906Sjfb8856606 /** @internal Function to start a device queue. */ 112d30ea906Sjfb8856606 typedef int (*rte_bbdev_queue_start_t)(struct rte_bbdev *dev, 113d30ea906Sjfb8856606 uint16_t queue_id); 114d30ea906Sjfb8856606 115d30ea906Sjfb8856606 /** @internal Function to stop a device queue. */ 116d30ea906Sjfb8856606 typedef int (*rte_bbdev_queue_stop_t)(struct rte_bbdev *dev, uint16_t queue_id); 117d30ea906Sjfb8856606 118d30ea906Sjfb8856606 /** @internal Function to read stats from a device. */ 119d30ea906Sjfb8856606 typedef void (*rte_bbdev_stats_get_t)(struct rte_bbdev *dev, 120d30ea906Sjfb8856606 struct rte_bbdev_stats *stats); 121d30ea906Sjfb8856606 122d30ea906Sjfb8856606 /** @internal Function to reset stats on a device. */ 123d30ea906Sjfb8856606 typedef void (*rte_bbdev_stats_reset_t)(struct rte_bbdev *dev); 124d30ea906Sjfb8856606 125d30ea906Sjfb8856606 /** @internal Function to retrieve specific information of a device. */ 126d30ea906Sjfb8856606 typedef void (*rte_bbdev_info_get_t)(struct rte_bbdev *dev, 127d30ea906Sjfb8856606 struct rte_bbdev_driver_info *dev_info); 128d30ea906Sjfb8856606 129d30ea906Sjfb8856606 /* 130d30ea906Sjfb8856606 * @internal 131d30ea906Sjfb8856606 * Function to enable interrupt for next op on a queue of a device. 132d30ea906Sjfb8856606 */ 133d30ea906Sjfb8856606 typedef int (*rte_bbdev_queue_intr_enable_t)(struct rte_bbdev *dev, 134d30ea906Sjfb8856606 uint16_t queue_id); 135d30ea906Sjfb8856606 136d30ea906Sjfb8856606 /* 137d30ea906Sjfb8856606 * @internal 138d30ea906Sjfb8856606 * Function to disable interrupt for next op on a queue of a device. 139d30ea906Sjfb8856606 */ 140d30ea906Sjfb8856606 typedef int (*rte_bbdev_queue_intr_disable_t)(struct rte_bbdev *dev, 141d30ea906Sjfb8856606 uint16_t queue_id); 142d30ea906Sjfb8856606 143d30ea906Sjfb8856606 /** 144d30ea906Sjfb8856606 * Operations implemented by drivers. Fields marked as "Required" must be 145d30ea906Sjfb8856606 * provided by a driver for a device to have basic functionality. "Optional" 146d30ea906Sjfb8856606 * fields are for non-vital operations 147d30ea906Sjfb8856606 */ 148d30ea906Sjfb8856606 struct rte_bbdev_ops { 149*0c6bd470Sfengbojiang /** Allocate and configure device memory. Optional. */ 150d30ea906Sjfb8856606 rte_bbdev_setup_queues_t setup_queues; 151*0c6bd470Sfengbojiang /** Configure interrupts. Optional. */ 152d30ea906Sjfb8856606 rte_bbdev_intr_enable_t intr_enable; 153*0c6bd470Sfengbojiang /** Start device. Optional. */ 154d30ea906Sjfb8856606 rte_bbdev_start_t start; 155*0c6bd470Sfengbojiang /** Stop device. Optional. */ 156d30ea906Sjfb8856606 rte_bbdev_stop_t stop; 157*0c6bd470Sfengbojiang /** Close device. Optional. */ 158d30ea906Sjfb8856606 rte_bbdev_close_t close; 159d30ea906Sjfb8856606 160*0c6bd470Sfengbojiang /** Get device info. Required. */ 161d30ea906Sjfb8856606 rte_bbdev_info_get_t info_get; 162d30ea906Sjfb8856606 /** Get device statistics. Optional. */ 163d30ea906Sjfb8856606 rte_bbdev_stats_get_t stats_get; 164d30ea906Sjfb8856606 /** Reset device statistics. Optional. */ 165d30ea906Sjfb8856606 rte_bbdev_stats_reset_t stats_reset; 166d30ea906Sjfb8856606 167d30ea906Sjfb8856606 /** Set up a device queue. Required. */ 168d30ea906Sjfb8856606 rte_bbdev_queue_setup_t queue_setup; 169d30ea906Sjfb8856606 /** Release a queue. Required. */ 170d30ea906Sjfb8856606 rte_bbdev_queue_release_t queue_release; 171d30ea906Sjfb8856606 /** Start a queue. Optional. */ 172d30ea906Sjfb8856606 rte_bbdev_queue_start_t queue_start; 173*0c6bd470Sfengbojiang /** Stop a queue pair. Optional. */ 174d30ea906Sjfb8856606 rte_bbdev_queue_stop_t queue_stop; 175d30ea906Sjfb8856606 176d30ea906Sjfb8856606 /** Enable queue interrupt. Optional */ 177d30ea906Sjfb8856606 rte_bbdev_queue_intr_enable_t queue_intr_enable; 178d30ea906Sjfb8856606 /** Disable queue interrupt. Optional */ 179d30ea906Sjfb8856606 rte_bbdev_queue_intr_disable_t queue_intr_disable; 180d30ea906Sjfb8856606 }; 181d30ea906Sjfb8856606 182d30ea906Sjfb8856606 /** 183d30ea906Sjfb8856606 * Executes all the user application registered callbacks for the specific 184d30ea906Sjfb8856606 * device and event type. 185d30ea906Sjfb8856606 * 186d30ea906Sjfb8856606 * @param dev 187d30ea906Sjfb8856606 * Pointer to the device structure. 188d30ea906Sjfb8856606 * @param event 189d30ea906Sjfb8856606 * Event type. 190d30ea906Sjfb8856606 * @param ret_param 191d30ea906Sjfb8856606 * To pass data back to user application. 192d30ea906Sjfb8856606 */ 1934418919fSjohnjiang __rte_experimental 1944418919fSjohnjiang void 195d30ea906Sjfb8856606 rte_bbdev_pmd_callback_process(struct rte_bbdev *dev, 196d30ea906Sjfb8856606 enum rte_bbdev_event_type event, void *ret_param); 197d30ea906Sjfb8856606 198d30ea906Sjfb8856606 #ifdef __cplusplus 199d30ea906Sjfb8856606 } 200d30ea906Sjfb8856606 #endif 201d30ea906Sjfb8856606 202d30ea906Sjfb8856606 #endif /* _RTE_BBDEV_PMD_H_ */ 203