]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/ice/ice_rdma.h
dwc: Rename if_dwc.h to dwc1000_reg.h
[FreeBSD/FreeBSD.git] / sys / dev / ice / ice_rdma.h
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