drm/nouveau: consume the return of large GSP message
[drm/drm-misc.git] / drivers / infiniband / ulp / opa_vnic / opa_vnic_internal.h
blobdd942dd642bd3733951cdc8e64782225e83b0090
1 #ifndef _OPA_VNIC_INTERNAL_H
2 #define _OPA_VNIC_INTERNAL_H
3 /*
4 * Copyright(c) 2017 Intel Corporation.
6 * This file is provided under a dual BSD/GPLv2 license. When using or
7 * redistributing this file, you may do so under either license.
9 * GPL LICENSE SUMMARY
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of version 2 of the GNU General Public License as
13 * published by the Free Software Foundation.
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details.
20 * BSD LICENSE
22 * Redistribution and use in source and binary forms, with or without
23 * modification, are permitted provided that the following conditions
24 * are met:
26 * - Redistributions of source code must retain the above copyright
27 * notice, this list of conditions and the following disclaimer.
28 * - Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in
30 * the documentation and/or other materials provided with the
31 * distribution.
32 * - Neither the name of Intel Corporation nor the names of its
33 * contributors may be used to endorse or promote products derived
34 * from this software without specific prior written permission.
36 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
37 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
38 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
39 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
40 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
43 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
44 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
45 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
46 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
51 * This file contains OPA VNIC driver internal declarations
54 #include <linux/bitops.h>
55 #include <linux/etherdevice.h>
56 #include <linux/hashtable.h>
57 #include <linux/sizes.h>
58 #include <rdma/opa_vnic.h>
60 #include "opa_vnic_encap.h"
62 #define OPA_VNIC_VLAN_PCP(vlan_tci) \
63 (((vlan_tci) & VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT)
65 /* Flow to default port redirection table size */
66 #define OPA_VNIC_FLOW_TBL_SIZE 32
68 /* Invalid port number */
69 #define OPA_VNIC_INVALID_PORT 0xff
71 struct opa_vnic_adapter;
74 * struct __opa_vesw_info - OPA vnic virtual switch info
76 * Same as opa_vesw_info without bitwise attribute.
78 struct __opa_vesw_info {
79 u16 fabric_id;
80 u16 vesw_id;
82 u8 rsvd0[6];
83 u16 def_port_mask;
85 u8 rsvd1[2];
86 u16 pkey;
88 u8 rsvd2[4];
89 u32 u_mcast_dlid;
90 u32 u_ucast_dlid[OPA_VESW_MAX_NUM_DEF_PORT];
92 u32 rc;
94 u8 rsvd3[56];
95 u16 eth_mtu;
96 u8 rsvd4[2];
97 } __packed;
100 * struct __opa_per_veswport_info - OPA vnic per port info
102 * Same as opa_per_veswport_info without bitwise attribute.
104 struct __opa_per_veswport_info {
105 u32 port_num;
107 u8 eth_link_status;
108 u8 rsvd0[3];
110 u8 base_mac_addr[ETH_ALEN];
111 u8 config_state;
112 u8 oper_state;
114 u16 max_mac_tbl_ent;
115 u16 max_smac_ent;
116 u32 mac_tbl_digest;
117 u8 rsvd1[4];
119 u32 encap_slid;
121 u8 pcp_to_sc_uc[OPA_VNIC_MAX_NUM_PCP];
122 u8 pcp_to_vl_uc[OPA_VNIC_MAX_NUM_PCP];
123 u8 pcp_to_sc_mc[OPA_VNIC_MAX_NUM_PCP];
124 u8 pcp_to_vl_mc[OPA_VNIC_MAX_NUM_PCP];
126 u8 non_vlan_sc_uc;
127 u8 non_vlan_vl_uc;
128 u8 non_vlan_sc_mc;
129 u8 non_vlan_vl_mc;
131 u8 rsvd2[48];
133 u16 uc_macs_gen_count;
134 u16 mc_macs_gen_count;
136 u8 rsvd3[8];
137 } __packed;
140 * struct __opa_veswport_info - OPA vnic port info
142 * Same as opa_veswport_info without bitwise attribute.
144 struct __opa_veswport_info {
145 struct __opa_vesw_info vesw;
146 struct __opa_per_veswport_info vport;
150 * struct __opa_veswport_trap - OPA vnic trap info
152 * Same as opa_veswport_trap without bitwise attribute.
154 struct __opa_veswport_trap {
155 u16 fabric_id;
156 u16 veswid;
157 u32 veswportnum;
158 u16 opaportnum;
159 u8 veswportindex;
160 u8 opcode;
161 u32 reserved;
162 } __packed;
165 * struct opa_vnic_ctrl_port - OPA virtual NIC control port
166 * @ibdev: pointer to ib device
167 * @ops: opa vnic control operations
168 * @num_ports: number of opa ports
170 struct opa_vnic_ctrl_port {
171 struct ib_device *ibdev;
172 struct opa_vnic_ctrl_ops *ops;
173 u8 num_ports;
177 * struct opa_vnic_adapter - OPA VNIC netdev private data structure
178 * @netdev: pointer to associated netdev
179 * @ibdev: ib device
180 * @cport: pointer to opa vnic control port
181 * @rn_ops: rdma netdev's net_device_ops
182 * @port_num: OPA port number
183 * @vport_num: vesw port number
184 * @lock: adapter lock
185 * @info: virtual ethernet switch port information
186 * @vema_mac_addr: mac address configured by vema
187 * @umac_hash: unicast maclist hash
188 * @mmac_hash: multicast maclist hash
189 * @mactbl: hash table of MAC entries
190 * @mactbl_lock: mac table lock
191 * @stats_lock: statistics lock
192 * @flow_tbl: flow to default port redirection table
193 * @trap_timeout: trap timeout
194 * @trap_count: no. of traps allowed within timeout period
196 struct opa_vnic_adapter {
197 struct net_device *netdev;
198 struct ib_device *ibdev;
199 struct opa_vnic_ctrl_port *cport;
200 const struct net_device_ops *rn_ops;
202 u8 port_num;
203 u8 vport_num;
205 /* Lock used around concurrent updates to netdev */
206 struct mutex lock;
208 struct __opa_veswport_info info;
209 u8 vema_mac_addr[ETH_ALEN];
210 u32 umac_hash;
211 u32 mmac_hash;
212 struct hlist_head __rcu *mactbl;
214 /* Lock used to protect updates to mac table */
215 struct mutex mactbl_lock;
217 /* Lock used to protect access to vnic counters */
218 spinlock_t stats_lock;
220 u8 flow_tbl[OPA_VNIC_FLOW_TBL_SIZE];
222 unsigned long trap_timeout;
223 u8 trap_count;
226 /* Same as opa_veswport_mactable_entry, but without bitwise attribute */
227 struct __opa_vnic_mactable_entry {
228 u8 mac_addr[ETH_ALEN];
229 u8 mac_addr_mask[ETH_ALEN];
230 u32 dlid_sd;
231 } __packed;
234 * struct opa_vnic_mac_tbl_node - OPA VNIC mac table node
235 * @hlist: hash list handle
236 * @index: index of entry in the mac table
237 * @entry: entry in the table
239 struct opa_vnic_mac_tbl_node {
240 struct hlist_node hlist;
241 u16 index;
242 struct __opa_vnic_mactable_entry entry;
245 #define v_dbg(format, arg...) \
246 netdev_dbg(adapter->netdev, format, ## arg)
247 #define v_err(format, arg...) \
248 netdev_err(adapter->netdev, format, ## arg)
249 #define v_info(format, arg...) \
250 netdev_info(adapter->netdev, format, ## arg)
251 #define v_warn(format, arg...) \
252 netdev_warn(adapter->netdev, format, ## arg)
254 #define c_err(format, arg...) \
255 dev_err(&cport->ibdev->dev, format, ## arg)
256 #define c_info(format, arg...) \
257 dev_info(&cport->ibdev->dev, format, ## arg)
258 #define c_dbg(format, arg...) \
259 dev_dbg(&cport->ibdev->dev, format, ## arg)
261 /* The maximum allowed entries in the mac table */
262 #define OPA_VNIC_MAC_TBL_MAX_ENTRIES 2048
263 /* Limit of smac entries in mac table */
264 #define OPA_VNIC_MAX_SMAC_LIMIT 256
266 /* The last octet of the MAC address is used as the key to the hash table */
267 #define OPA_VNIC_MAC_HASH_IDX 5
269 /* The VNIC MAC hash table is of size 2^8 */
270 #define OPA_VNIC_MAC_TBL_HASH_BITS 8
271 #define OPA_VNIC_MAC_TBL_SIZE BIT(OPA_VNIC_MAC_TBL_HASH_BITS)
273 /* VNIC HASH MACROS */
274 #define vnic_hash_init(hashtable) __hash_init(hashtable, OPA_VNIC_MAC_TBL_SIZE)
276 #define vnic_hash_add(hashtable, node, key) \
277 hlist_add_head(node, \
278 &hashtable[hash_min(key, ilog2(OPA_VNIC_MAC_TBL_SIZE))])
280 #define vnic_hash_for_each_safe(name, bkt, tmp, obj, member) \
281 for ((bkt) = 0, obj = NULL; \
282 !obj && (bkt) < OPA_VNIC_MAC_TBL_SIZE; (bkt)++) \
283 hlist_for_each_entry_safe(obj, tmp, &name[bkt], member)
285 #define vnic_hash_for_each_possible(name, obj, member, key) \
286 hlist_for_each_entry(obj, \
287 &name[hash_min(key, ilog2(OPA_VNIC_MAC_TBL_SIZE))], member)
289 #define vnic_hash_for_each(name, bkt, obj, member) \
290 for ((bkt) = 0, obj = NULL; \
291 !obj && (bkt) < OPA_VNIC_MAC_TBL_SIZE; (bkt)++) \
292 hlist_for_each_entry(obj, &name[bkt], member)
294 extern char opa_vnic_driver_name[];
296 struct opa_vnic_adapter *opa_vnic_add_netdev(struct ib_device *ibdev,
297 u8 port_num, u8 vport_num);
298 void opa_vnic_rem_netdev(struct opa_vnic_adapter *adapter);
299 void opa_vnic_encap_skb(struct opa_vnic_adapter *adapter, struct sk_buff *skb);
300 u8 opa_vnic_get_vl(struct opa_vnic_adapter *adapter, struct sk_buff *skb);
301 u8 opa_vnic_calc_entropy(struct sk_buff *skb);
302 void opa_vnic_process_vema_config(struct opa_vnic_adapter *adapter);
303 void opa_vnic_release_mac_tbl(struct opa_vnic_adapter *adapter);
304 void opa_vnic_query_mac_tbl(struct opa_vnic_adapter *adapter,
305 struct opa_veswport_mactable *tbl);
306 int opa_vnic_update_mac_tbl(struct opa_vnic_adapter *adapter,
307 struct opa_veswport_mactable *tbl);
308 void opa_vnic_query_ucast_macs(struct opa_vnic_adapter *adapter,
309 struct opa_veswport_iface_macs *macs);
310 void opa_vnic_query_mcast_macs(struct opa_vnic_adapter *adapter,
311 struct opa_veswport_iface_macs *macs);
312 void opa_vnic_get_summary_counters(struct opa_vnic_adapter *adapter,
313 struct opa_veswport_summary_counters *cntrs);
314 void opa_vnic_get_error_counters(struct opa_vnic_adapter *adapter,
315 struct opa_veswport_error_counters *cntrs);
316 void opa_vnic_get_vesw_info(struct opa_vnic_adapter *adapter,
317 struct opa_vesw_info *info);
318 void opa_vnic_set_vesw_info(struct opa_vnic_adapter *adapter,
319 struct opa_vesw_info *info);
320 void opa_vnic_get_per_veswport_info(struct opa_vnic_adapter *adapter,
321 struct opa_per_veswport_info *info);
322 void opa_vnic_set_per_veswport_info(struct opa_vnic_adapter *adapter,
323 struct opa_per_veswport_info *info);
324 void opa_vnic_vema_report_event(struct opa_vnic_adapter *adapter, u8 event);
325 void opa_vnic_set_ethtool_ops(struct net_device *netdev);
326 void opa_vnic_vema_send_trap(struct opa_vnic_adapter *adapter,
327 struct __opa_veswport_trap *data, u32 lid);
329 #endif /* _OPA_VNIC_INTERNAL_H */