xref: /freebsd/sys/dev/ice/ice_rdma.h (revision 02e9120893770924227138ba49df1edb3896112a)
1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /*  Copyright (c) 2023, Intel Corporation
3  *  All rights reserved.
4  *
5  *  Redistribution and use in source and binary forms, with or without
6  *  modification, are permitted provided that the following conditions are met:
7  *
8  *   1. Redistributions of source code must retain the above copyright notice,
9  *      this list of conditions and the following disclaimer.
10  *
11  *   2. Redistributions in binary form must reproduce the above copyright
12  *      notice, this list of conditions and the following disclaimer in the
13  *      documentation and/or other materials provided with the distribution.
14  *
15  *   3. Neither the name of the Intel Corporation nor the names of its
16  *      contributors may be used to endorse or promote products derived from
17  *      this software without specific prior written permission.
18  *
19  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  *  POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 /**
33  * @file ice_rdma.h
34  * @brief header file for RDMA client interface functions
35  *
36  * Contains definitions and function calls shared by the ice driver and the
37  * RDMA client interface driver.
38  *
39  * Since these definitions are shared between drivers it is important that any
40  * changes are considered carefully for backwards compatibility.
41  */
42 #ifndef _ICE_RDMA_H_
43 #define _ICE_RDMA_H_
44 
45 /*
46  * The RDMA client interface version is used to help determine
47  * incompatibilities between the interface definition shared between the main
48  * driver and the client driver.
49  *
50  * It will follows the semantic version guidelines, that is:
51  * Given the version number MAJOR.MINOR.PATCH, increment the:
52  *
53  * MAJOR version when you make incompatible changes,
54  * MINOR version when you add functionality in a backwards-compatible manner, and
55  * PATCH version when you make backwards-compatible bug fixes.
56  *
57  * Any change to this file, or one of the kobject interface files must come
58  * with an associated change in one of the MAJOR, MINOR, or PATCH versions,
59  * and care must be taken that backwards incompatible changes MUST increment
60  * the MAJOR version.
61  *
62  * Note: Until the MAJOR version is set to at least 1, the above semantic
63  * version guarantees may not hold, and this interface should not be
64  * considered stable.
65  */
66 #define ICE_RDMA_MAJOR_VERSION 1
67 #define ICE_RDMA_MINOR_VERSION 1
68 #define ICE_RDMA_PATCH_VERSION 0
69 
70 /**
71  * @def ICE_RDMA_MAX_MSIX
72  * @brief Maximum number of MSI-X vectors that will be reserved
73  *
74  * Defines the maximum number of MSI-X vectors that an RDMA interface will
75  * have reserved in advance. Does not guarantee that many vectors have
76  * actually been enabled.
77  */
78 #define ICE_RDMA_MAX_MSIX 64
79 
80 /**
81  * @struct ice_rdma_info
82  * @brief RDMA information from the client driver
83  *
84  * The RDMA client driver will fill in this structure and pass its contents
85  * back to the main driver using the ice_rdma_register function.
86  *
87  * It should fill the version in with the ICE_RDMA_* versions as defined in
88  * the ice_rdma.h header.
89  *
90  * Additionally it must provide a pointer to a kobject class which extends the
91  * ice_rdma_di_class with the operations defined in the rdma_if.m interface.
92  *
93  * If the version specified is not compatible, then the registration will
94  * of the RDMA driver will fail.
95  *
96  * @var ice_rdma_info::major_version
97  * 	describe major changes in the interface
98  * @var ice_rdma_info::minor_version
99  * 	describe changes and fixes with backward compatibility
100  * @var ice_rdma_info::patch_version
101  * 	changes without impact on compatibility or features
102  * @var ice_rdma_info::rdma_class
103  * 	kobject class
104  */
105 struct ice_rdma_info {
106 	uint16_t major_version;
107 	uint16_t minor_version;
108 	uint16_t patch_version;
109 
110 	kobj_class_t rdma_class;
111 };
112 
113 #define ICE_RDMA_MAX_USER_PRIORITY	8
114 #define ICE_RDMA_MAX_MSIX		64
115 
116 /* Declare the ice_rdma_di kobject class */
117 DECLARE_CLASS(ice_rdma_di_class);
118 
119 /**
120  * @struct ice_rdma_msix_mapping
121  * @brief MSI-X mapping requested by the peer RDMA driver
122  *
123  * Defines a mapping for MSI-X vectors being requested by the peer RDMA driver
124  * for a given PF.
125  *
126  */
127 struct ice_rdma_msix_mapping {
128 	uint8_t itr_indx;
129 	int aeq_vector;
130 	int ceq_cnt;
131 	int *ceq_vector;
132 };
133 
134 /**
135  * @struct ice_rdma_msix
136  * @brief RDMA MSI-X vectors reserved for the peer RDMA driver
137  *
138  * Defines the segment of the MSI-X vectors for use by the RDMA driver. These
139  * are reserved by the PF when it initializes.
140  */
141 struct ice_rdma_msix {
142 	int base;
143 	int count;
144 };
145 
146 /**
147  * @struct ice_qos_info
148  * @brief QoS information to be shared with RDMA driver
149  */
150 struct ice_qos_info {
151 	uint64_t tc_ctx;
152 	uint8_t rel_bw;
153 	uint8_t prio_type;
154 	uint8_t egress_virt_up;
155 	uint8_t ingress_virt_up;
156 };
157 
158 /**
159  * @struct ice_qos_app_priority_table
160  * @brief Application priority data
161  */
162 struct ice_qos_app_priority_table {
163 	uint16_t prot_id;
164 	uint8_t priority;
165 	uint8_t selector;
166 };
167 
168 #define IEEE_8021QAZ_MAX_TCS  8
169 #define ICE_TC_MAX_USER_PRIORITY 8
170 #define ICE_QOS_MAX_APPS 32
171 #define ICE_QOS_DSCP_NUM_VAL 64
172 
173 /**
174  * @struct ice_qos_params
175  * @brief Holds all necessary data for RDMA to work with DCB
176  *
177  * Struct to hold QoS info
178  * @var ice_qos_params::tc_info
179  *	traffic class information
180  * @var ice_qos_params::up2tc
181  *	mapping from user priority to traffic class
182  * @var ice_qos_params::vsi_relative_bw
183  *	bandwidth settings
184  * @var ice_qos_params::vsi_priority_type
185  *	priority type
186  * @var ice_qos_params::num_apps
187  *	app count
188  * @var ice_qos_params::pfc_mode
189  *	PFC mode
190  * @var ice_qos_params::dscp_map
191  *	dscp mapping
192  * @var ice_qos_params::apps
193  *	apps
194  * @var ice_qos_params::num_tc
195  *	number of traffic classes
196 };
197  */
198 struct ice_qos_params {
199 	struct ice_qos_info tc_info[IEEE_8021QAZ_MAX_TCS];
200 	uint8_t up2tc[ICE_TC_MAX_USER_PRIORITY];
201 	uint8_t vsi_relative_bw;
202 	uint8_t vsi_priority_type;
203 	uint32_t num_apps;
204 	uint8_t pfc_mode;
205 	uint8_t dscp_map[ICE_QOS_DSCP_NUM_VAL];
206 	struct ice_qos_app_priority_table apps[ICE_QOS_MAX_APPS];
207 	uint8_t num_tc;
208 };
209 
210 /**
211  * @struct ice_rdma_peer
212  * @brief RDMA driver information
213  *
214  * Shared structure used by the RDMA client driver when talking with the main
215  * device driver.
216  *
217  * Because the definition of this structure is shared between the two drivers,
218  * its ABI should be handled carefully.
219  *
220  * @var ice_rdma_peer::ifp
221  *	pointer to ifnet structure
222  * @var ice_rdma_peer::dev
223  *	device pointer
224  * @var ice_rdma_peer::pci_mem
225  *	information about PCI
226  * @var ice_rdma_peer::initial_qos_info
227  *	initial information on QoS
228  * @var ice_rdma_peer::msix
229  *	info about msix vectors
230  * @var ice_rdma_peer::mtu
231  *	initial mtu size
232  * @var ice_rdma_peer::pf_vsi_num
233  *	id of vsi
234  * @var ice_rdma_peer::pf_id
235  *	id of PF
236  */
237 struct ice_rdma_peer {
238 	/**
239 	 * The KOBJ_FIELDS macro must come first, in order for it to be used
240 	 * as a kobject.
241 	 */
242 	KOBJ_FIELDS;
243 
244 	struct ifnet *ifp;
245 	device_t dev;
246 	struct resource *pci_mem;
247 	struct ice_qos_params initial_qos_info;
248 	struct ice_rdma_msix msix;
249 	uint16_t mtu;
250 	uint16_t pf_vsi_num;
251 	uint8_t pf_id;
252 };
253 
254 /**
255  * @enum ice_res_type
256  * @brief enum for type of resource registration
257  *
258  * enum for type of resource registration.
259  * created for plausible compatibility with IDC
260  */
261 enum ice_res_type {
262 	ICE_INVAL_RES = 0x0,
263 	ICE_RDMA_QSET_ALLOC = 0x8,
264 	ICE_RDMA_QSET_FREE = 0x18,
265 };
266 
267 /**
268  * @struct ice_rdma_qset_params
269  * @brief struct to hold per RDMA Qset info
270  *
271  * @var ice_rdma_qset_params::teid
272  *	qset teid
273  * @var ice_rdma_qset_params::qs_handle
274  *	qset from rdma driver
275  * @var ice_rdma_qset_params::vsi_id
276  *	vsi index
277  * @var ice_rdma_qset_params::tc
278  *	traffic class to which qset should belong to
279  * @var ice_rdma_qset_params::reserved
280  *	for future use
281  */
282 struct ice_rdma_qset_params {
283 	uint32_t teid;
284 	uint16_t qs_handle;
285 	uint16_t vsi_id;
286 	uint8_t tc;
287 	uint8_t reserved[3];
288 };
289 
290 #define ICE_MAX_TXQ_PER_TXQG 128
291 /**
292  * @struct ice_rdma_qset_update
293  * @brief struct used to register and unregister qsets for RDMA driver
294  *
295  * @var ice_rdma_qset_update::res_type
296  *	ALLOC or FREE
297  * @var ice_rdma_qset_update::cnt_req
298  *	how many qsets are requested
299  * @var ice_rdma_qset_update::res_allocated
300  *	how many qsets are allocated
301  * @var ice_rdma_qset_update::qsets
302  *	rdma qset info
303  */
304 struct ice_rdma_qset_update {
305 	enum ice_res_type res_type;
306 	uint16_t cnt_req;
307 	uint16_t res_allocated;
308 	uint32_t res_handle;
309 	struct ice_rdma_qset_params qsets;
310 };
311 
312 /**
313  * @enum ice_rdma_event_type
314  * @brief enum for type of event from base driver
315  */
316 enum ice_rdma_event_type {
317 	ICE_RDMA_EVENT_NONE = 0,
318 	ICE_RDMA_EVENT_LINK_CHANGE,
319 	ICE_RDMA_EVENT_MTU_CHANGE,
320 	ICE_RDMA_EVENT_TC_CHANGE,
321 	ICE_RDMA_EVENT_API_CHANGE,
322 	ICE_RDMA_EVENT_CRIT_ERR,
323 	ICE_RDMA_EVENT_RESET,
324 	ICE_RDMA_EVENT_QSET_REGISTER,
325 	ICE_RDMA_EVENT_VSI_FILTER_UPDATE,
326 	ICE_RDMA_EVENT_LAST
327 };
328 
329 /**
330  * @struct ice_rdma_event
331  * @brief struct for event information to pass to RDMA driver
332  *
333  * @var ice_rdma_event::type
334  *	event type
335  */
336 struct ice_rdma_event {
337 	enum ice_rdma_event_type type;
338 	union {
339 		/* link change event */
340 		struct {
341 			int linkstate;
342 			uint64_t baudrate;
343 		};
344 		/* MTU change event */
345 		int mtu;
346 		/*
347 		 * TC/QoS/DCB change event
348 		 * prep: if true, this is a pre-event, post-event otherwise
349 		 */
350 		struct {
351 			struct ice_qos_params port_qos;
352 			bool prep;
353 		};
354 		/*
355 		 * CRIT_ERR event
356 		 */
357 		uint32_t oicr_reg;
358 	};
359 };
360 
361 /**
362  * @struct ice_rdma_request
363  * @brief struct with data for a request from the RDMA driver
364  *
365  * @var ice_rdma_request::type
366  *	event type
367  */
368 struct ice_rdma_request {
369 	enum ice_rdma_event_type type;
370 	union {
371 		struct {
372 			struct ice_rdma_qset_update res;
373 		};
374 		struct {
375 			bool enable_filter;
376 		};
377 	};
378 };
379 
380 int ice_rdma_register(struct ice_rdma_info *info);
381 int ice_rdma_unregister(void);
382 
383 #endif
384