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