1 /*-
2 * SPDX-License-Identifier: GPL-2.0 or Linux-OpenIB
3 *
4 * Copyright (c) 2021 - 2023 Intel Corporation
5 *
6 * This software is available to you under a choice of one of two
7 * licenses. You may choose to be licensed under the terms of the GNU
8 * General Public License (GPL) Version 2, available from the file
9 * COPYING in the main directory of this source tree, or the
10 * OpenFabrics.org BSD license below:
11 *
12 * Redistribution and use in source and binary forms, with or
13 * without modification, are permitted provided that the following
14 * conditions are met:
15 *
16 * - Redistributions of source code must retain the above
17 * copyright notice, this list of conditions and the following
18 * disclaimer.
19 *
20 * - Redistributions in binary form must reproduce the above
21 * copyright notice, this list of conditions and the following
22 * disclaimer in the documentation and/or other materials
23 * provided with the distribution.
24 *
25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32 * SOFTWARE.
33 */
34
35 #ifndef FBSD_KCOMPAT_H
36 #define FBSD_KCOMPAT_H
37 #include "ice_rdma.h"
38
39 #define TASKLET_DATA_TYPE unsigned long
40 #define TASKLET_FUNC_TYPE void (*)(TASKLET_DATA_TYPE)
41
42 #ifndef tasklet_setup
43 #define tasklet_setup(tasklet, callback) \
44 tasklet_init((tasklet), (TASKLET_FUNC_TYPE)(callback), \
45 (TASKLET_DATA_TYPE)(tasklet))
46 #endif
47 #ifndef from_tasklet
48 #define from_tasklet(var, callback_tasklet, tasklet_fieldname) \
49 container_of(callback_tasklet, typeof(*var), tasklet_fieldname)
50 #endif
51
52 #define set_ibdev_dma_device(ibdev, dev) \
53 ibdev.dma_device = (dev)
54 #define set_max_sge(props, rf) \
55 ((props)->max_sge = (rf)->sc_dev.hw_attrs.uk_attrs.max_hw_wq_frags)
56 #define kmap(pg) page_address(pg)
57 #define kmap_local_page(pg) page_address(pg)
58 #define kunmap(pg)
59 #define kunmap_local(pg)
60
61 #define IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION IB_CQ_FLAGS_TIMESTAMP_COMPLETION
62 #ifndef IB_QP_ATTR_STANDARD_BITS
63 #define IB_QP_ATTR_STANDARD_BITS GENMASK(20, 0)
64 #endif
65
66 #define IRDMA_QOS_MODE_VLAN 0x0
67 #define IRDMA_QOS_MODE_DSCP 0x1
68
69 #define IRDMA_VER_LEN 24
70
71 void kc_set_roce_uverbs_cmd_mask(struct irdma_device *iwdev);
72 void kc_set_rdma_uverbs_cmd_mask(struct irdma_device *iwdev);
73
74 struct irdma_tunable_info {
75 struct sysctl_ctx_list irdma_sysctl_ctx;
76 struct sysctl_oid *irdma_sysctl_tree;
77 struct sysctl_oid *qos_sysctl_tree;
78 struct sysctl_oid *sws_sysctl_tree;
79 char drv_ver[IRDMA_VER_LEN];
80 u8 roce_ena;
81 };
82
83 typedef u_int if_addr_cb_t(void *, struct ifaddr *, u_int);
84 typedef int (*if_foreach_cb_t)(if_t, void *);
85 struct if_iter {
86 void *context[4];
87 };
88
89 u_int if_foreach_addr_type(if_t ifp, int type, if_addr_cb_t cb, void *cb_arg);
90 int if_foreach(if_foreach_cb_t cb, void *cb_arg);
91 if_t if_iter_start(struct if_iter *iter);
92 if_t if_iter_next(struct if_iter *iter);
93 void if_iter_finish(struct if_iter *iter);
94 #define if_getdunit(ifp) ifp->if_dunit
95 #define if_getindex(ifp) ifp->if_index
96 #define if_getlinkstate(ndev) ndev->if_link_state
97 #define if_getvlantrunk(ifp) ifp->if_vlantrunk
98 #define if_getvnet(ndev) ndev->if_vnet
irdma_iw_query_pkey(struct ib_device * ibdev,u8 port,u16 index,u16 * pkey)99 static inline int irdma_iw_query_pkey(struct ib_device *ibdev, u8 port, u16 index,
100 u16 *pkey)
101 {
102 *pkey = 0;
103 return 0;
104 }
105
cq_validate_flags(u32 flags,u8 hw_rev)106 static inline int cq_validate_flags(u32 flags, u8 hw_rev)
107 {
108 /* GEN1 does not support CQ create flags */
109 if (hw_rev == IRDMA_GEN_1)
110 return flags ? -EOPNOTSUPP : 0;
111
112 return flags & ~IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION ? -EOPNOTSUPP : 0;
113 }
114
irdma_next_pbl_addr(u64 * pbl,struct irdma_pble_info ** pinfo,u32 * idx)115 static inline u64 *irdma_next_pbl_addr(u64 *pbl, struct irdma_pble_info **pinfo,
116 u32 *idx)
117 {
118 *idx += 1;
119 if (!(*pinfo) || *idx != (*pinfo)->cnt)
120 return ++pbl;
121 *idx = 0;
122 (*pinfo)++;
123
124 return (*pinfo)->addr;
125 }
126
127 static inline struct vnet *
irdma_cmid_to_vnet(struct iw_cm_id * cm_id)128 irdma_cmid_to_vnet(struct iw_cm_id *cm_id)
129 {
130 struct rdma_cm_id *rdma_id;
131
132 if (!cm_id)
133 return &init_net;
134
135 rdma_id = (struct rdma_cm_id *)cm_id->context;
136
137 return rdma_id->route.addr.dev_addr.net;
138 }
139
140 struct ib_cq *irdma_create_cq(struct ib_device *ibdev,
141 const struct ib_cq_init_attr *attr,
142 struct ib_ucontext *context,
143 struct ib_udata *udata);
144 struct ib_qp *irdma_create_qp(struct ib_pd *ibpd,
145 struct ib_qp_init_attr *init_attr,
146 struct ib_udata *udata);
147 struct ib_ah *irdma_create_ah(struct ib_pd *ibpd,
148 struct ib_ah_attr *attr,
149 struct ib_udata *udata);
150 struct ib_ah *irdma_create_ah_stub(struct ib_pd *ibpd,
151 struct ib_ah_attr *attr,
152 struct ib_udata *udata);
153 void irdma_ether_copy(u8 *dmac, struct ib_ah_attr *attr);
154 int irdma_destroy_ah(struct ib_ah *ibah);
155 int irdma_destroy_ah_stub(struct ib_ah *ibah);
156 int irdma_destroy_qp(struct ib_qp *ibqp);
157 int irdma_dereg_mr(struct ib_mr *ib_mr);
158 int ib_get_eth_speed(struct ib_device *dev, u32 port_num, u8 *speed, u8 *width);
159 enum rdma_link_layer irdma_get_link_layer(struct ib_device *ibdev,
160 u8 port_num);
161 int irdma_roce_port_immutable(struct ib_device *ibdev, u8 port_num,
162 struct ib_port_immutable *immutable);
163 int irdma_iw_port_immutable(struct ib_device *ibdev, u8 port_num,
164 struct ib_port_immutable *immutable);
165 int irdma_query_gid(struct ib_device *ibdev, u8 port, int index,
166 union ib_gid *gid);
167 int irdma_query_gid_roce(struct ib_device *ibdev, u8 port, int index,
168 union ib_gid *gid);
169 int irdma_query_pkey(struct ib_device *ibdev, u8 port, u16 index,
170 u16 *pkey);
171 int irdma_query_port(struct ib_device *ibdev, u8 port,
172 struct ib_port_attr *props);
173 struct rdma_hw_stats *irdma_alloc_hw_stats(struct ib_device *ibdev, u8 port_num);
174 int irdma_get_hw_stats(struct ib_device *ibdev,
175 struct rdma_hw_stats *stats, u8 port_num,
176 int index);
177
178 void irdma_request_reset(struct irdma_pci_f *rf);
179 int irdma_register_qset(struct irdma_sc_vsi *vsi,
180 struct irdma_ws_node *tc_node);
181 void irdma_unregister_qset(struct irdma_sc_vsi *vsi,
182 struct irdma_ws_node *tc_node);
183 void ib_unregister_device(struct ib_device *ibdev);
184 int rdma_user_mmap_io(struct ib_ucontext *ucontext, struct vm_area_struct *vma,
185 unsigned long pfn, unsigned long size, pgprot_t prot);
186 void irdma_disassociate_ucontext(struct ib_ucontext *context);
187 int kc_irdma_set_roce_cm_info(struct irdma_qp *iwqp,
188 struct ib_qp_attr *attr,
189 u16 *vlan_id);
190
191 void kc_set_loc_seq_num_mss(struct irdma_cm_node *cm_node);
192 u16 kc_rdma_get_udp_sport(u32 fl, u32 lqpn, u32 rqpn);
193
194 void irdma_get_dev_fw_str(struct ib_device *dev, char *str, size_t str_len);
195
196 int irdma_modify_port(struct ib_device *ibdev, u8 port, int mask,
197 struct ib_port_modify *props);
198 int irdma_get_dst_mac(struct irdma_cm_node *cm_node, struct sockaddr *dst_sin,
199 u8 *dst_mac);
200 int irdma_resolve_neigh_lpb_chk(struct irdma_device *iwdev, struct irdma_cm_node *cm_node,
201 struct irdma_cm_info *cm_info);
202 int irdma_addr_resolve_neigh(struct irdma_cm_node *cm_node, u32 dst_ip,
203 int arpindex);
204 int irdma_addr_resolve_neigh_ipv6(struct irdma_cm_node *cm_node, u32 *dest,
205 int arpindex);
206 void irdma_dcqcn_tunables_init(struct irdma_pci_f *rf);
207 void irdma_sysctl_settings(struct irdma_pci_f *rf);
208 void irdma_sw_stats_tunables_init(struct irdma_pci_f *rf);
209 u32 irdma_create_stag(struct irdma_device *iwdev);
210 void irdma_free_stag(struct irdma_device *iwdev, u32 stag);
211
212 int irdma_hwdereg_mr(struct ib_mr *ib_mr);
213 int irdma_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start, u64 len,
214 u64 virt, int new_access, struct ib_pd *new_pd,
215 struct ib_udata *udata);
216 struct irdma_mr;
217 struct irdma_cq;
218 struct irdma_cq_buf;
219 struct ib_mr *irdma_alloc_mr(struct ib_pd *pd, enum ib_mr_type mr_type,
220 u32 max_num_sg);
221 int irdma_hwreg_mr(struct irdma_device *iwdev, struct irdma_mr *iwmr,
222 u16 access);
223 struct ib_mr *irdma_rereg_mr_trans(struct irdma_mr *iwmr, u64 start, u64 len,
224 u64 virt, struct ib_udata *udata);
225 int irdma_hw_alloc_mw(struct irdma_device *iwdev, struct irdma_mr *iwmr);
226 struct ib_mw *irdma_alloc_mw(struct ib_pd *pd, enum ib_mw_type type,
227 struct ib_udata *udata);
228 int irdma_hw_alloc_stag(struct irdma_device *iwdev, struct irdma_mr *iwmr);
229 void irdma_cq_free_rsrc(struct irdma_pci_f *rf, struct irdma_cq *iwcq);
230 int irdma_validate_qp_attrs(struct ib_qp_init_attr *init_attr,
231 struct irdma_device *iwdev);
232 void irdma_setup_virt_qp(struct irdma_device *iwdev,
233 struct irdma_qp *iwqp,
234 struct irdma_qp_init_info *init_info);
235 int irdma_setup_kmode_qp(struct irdma_device *iwdev,
236 struct irdma_qp *iwqp,
237 struct irdma_qp_init_info *info,
238 struct ib_qp_init_attr *init_attr);
239 int irdma_setup_umode_qp(struct ib_udata *udata,
240 struct irdma_device *iwdev,
241 struct irdma_qp *iwqp,
242 struct irdma_qp_init_info *info,
243 struct ib_qp_init_attr *init_attr);
244 void irdma_roce_fill_and_set_qpctx_info(struct irdma_qp *iwqp,
245 struct irdma_qp_host_ctx_info *ctx_info);
246 void irdma_iw_fill_and_set_qpctx_info(struct irdma_qp *iwqp,
247 struct irdma_qp_host_ctx_info *ctx_info);
248 int irdma_cqp_create_qp_cmd(struct irdma_qp *iwqp);
249 void irdma_dealloc_push_page(struct irdma_pci_f *rf,
250 struct irdma_qp *iwqp);
251 int irdma_process_resize_list(struct irdma_cq *iwcq, struct irdma_device *iwdev,
252 struct irdma_cq_buf *lcqe_buf);
253 int irdma_destroy_cq(struct ib_cq *ib_cq);
254 struct ib_ucontext *irdma_alloc_ucontext(struct ib_device *, struct ib_udata *);
255 int irdma_dealloc_ucontext(struct ib_ucontext *);
256 struct ib_pd *irdma_alloc_pd(struct ib_device *, struct ib_ucontext *,
257 struct ib_udata *);
258 int irdma_dealloc_pd(struct ib_pd *);
259 int irdma_add_gid(struct ib_device *, u8, unsigned int, const union ib_gid *,
260 const struct ib_gid_attr *, void **);
261 int irdma_del_gid(struct ib_device *, u8, unsigned int, void **);
262 struct ib_device *ib_device_get_by_netdev(struct ifnet *ndev, int driver_id);
263 void ib_device_put(struct ib_device *device);
264 void ib_unregister_device_put(struct ib_device *device);
265 enum ib_mtu ib_mtu_int_to_enum(int mtu);
266 struct irdma_pbl *irdma_get_pbl(unsigned long va, struct list_head *pbl_list);
267 void irdma_clean_cqes(struct irdma_qp *iwqp, struct irdma_cq *iwcq);
268 void irdma_remove_push_mmap_entries(struct irdma_qp *iwqp);
269
270 struct irdma_ucontext;
271 void irdma_del_memlist(struct irdma_mr *iwmr, struct irdma_ucontext *ucontext);
272 void irdma_copy_user_pgaddrs(struct irdma_mr *iwmr, u64 *pbl,
273 enum irdma_pble_level level);
274 void irdma_reg_ipaddr_event_cb(struct irdma_pci_f *rf);
275 void irdma_dereg_ipaddr_event_cb(struct irdma_pci_f *rf);
276
277 /* Introduced in this series https://lore.kernel.org/linux-rdma/0-v2-270386b7e60b+28f4-umem_1_jgg@nvidia.com/
278 * An irdma version helper doing same for older functions with difference that iova is passed in
279 * as opposed to derived from umem->iova.
280 */
irdma_ib_umem_num_dma_blocks(struct ib_umem * umem,unsigned long pgsz,u64 iova)281 static inline size_t irdma_ib_umem_num_dma_blocks(struct ib_umem *umem, unsigned long pgsz, u64 iova)
282 {
283 /* some older OFED distros do not have ALIGN_DOWN */
284 #ifndef ALIGN_DOWN
285 #define ALIGN_DOWN(x, a) ALIGN((x) - ((a) - 1), (a))
286 #endif
287
288 return (size_t)((ALIGN(iova + umem->length, pgsz) -
289 ALIGN_DOWN(iova, pgsz))) / pgsz;
290 }
291
addrconf_addr_eui48(u8 * deui,const char * const addr)292 static inline void addrconf_addr_eui48(u8 *deui, const char *const addr)
293 {
294 memcpy(deui, addr, 3);
295 deui[3] = 0xFF;
296 deui[4] = 0xFE;
297 memcpy(deui + 5, addr + 3, 3);
298 deui[0] ^= 2;
299 }
300
301 #endif /* FBSD_KCOMPAT_H */
302