1219820Sjeff/*
2219820Sjeff * Copyright (c) 2004, 2005 Topspin Communications.  All rights reserved.
3219820Sjeff * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
4219820Sjeff * Copyright (c) 2005, 2006, 2007 Cisco Systems.  All rights reserved.
5219820Sjeff * Copyright (c) 2005, 2006, 2007, 2008 Mellanox Technologies. All rights reserved.
6219820Sjeff * Copyright (c) 2004 Voltaire, Inc. All rights reserved.
7219820Sjeff *
8219820Sjeff * This software is available to you under a choice of one of two
9219820Sjeff * licenses.  You may choose to be licensed under the terms of the GNU
10219820Sjeff * General Public License (GPL) Version 2, available from the file
11219820Sjeff * COPYING in the main directory of this source tree, or the
12219820Sjeff * OpenIB.org BSD license below:
13219820Sjeff *
14219820Sjeff *     Redistribution and use in source and binary forms, with or
15219820Sjeff *     without modification, are permitted provided that the following
16219820Sjeff *     conditions are met:
17219820Sjeff *
18219820Sjeff *      - Redistributions of source code must retain the above
19219820Sjeff *        copyright notice, this list of conditions and the following
20219820Sjeff *        disclaimer.
21219820Sjeff *
22219820Sjeff *      - Redistributions in binary form must reproduce the above
23219820Sjeff *        copyright notice, this list of conditions and the following
24219820Sjeff *        disclaimer in the documentation and/or other materials
25219820Sjeff *        provided with the distribution.
26219820Sjeff *
27219820Sjeff * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
28219820Sjeff * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
29219820Sjeff * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
30219820Sjeff * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
31219820Sjeff * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
32219820Sjeff * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
33219820Sjeff * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
34219820Sjeff * SOFTWARE.
35219820Sjeff */
36219820Sjeff
37219820Sjeff#ifndef MLX4_H
38219820Sjeff#define MLX4_H
39219820Sjeff
40219820Sjeff#include <linux/mutex.h>
41219820Sjeff#include <linux/radix-tree.h>
42255932Salfred#include <linux/rbtree.h>
43219820Sjeff#include <linux/timer.h>
44255932Salfred#include <linux/semaphore.h>
45219820Sjeff#include <linux/workqueue.h>
46219820Sjeff
47219820Sjeff#include <linux/mlx4/device.h>
48219820Sjeff#include <linux/mlx4/driver.h>
49219820Sjeff#include <linux/mlx4/doorbell.h>
50255932Salfred#include <linux/mlx4/cmd.h>
51219820Sjeff
52219820Sjeff#define DRV_NAME	"mlx4_core"
53219820Sjeff#define PFX		DRV_NAME ": "
54255932Salfred#define DRV_VERSION	"1.1"
55255932Salfred#define DRV_RELDATE	"Dec, 2011"
56219820Sjeff
57255932Salfred#define MLX4_FS_UDP_UC_EN		(1 << 1)
58255932Salfred#define MLX4_FS_TCP_UC_EN		(1 << 2)
59255932Salfred#define MLX4_FS_NUM_OF_L2_ADDR		8
60255932Salfred#define MLX4_FS_MGM_LOG_ENTRY_SIZE	7
61255932Salfred#define MLX4_FS_NUM_MCG			(1 << 17)
62255932Salfred
63255932Salfredstruct mlx4_set_port_prio2tc_context {
64255932Salfred	u8 prio2tc[4];
65255932Salfred};
66255932Salfred
67255932Salfredstruct mlx4_port_scheduler_tc_cfg_be {
68255932Salfred	__be16 pg;
69255932Salfred	__be16 bw_precentage;
70255932Salfred	__be16 max_bw_units; /* 3-100Mbps, 4-1Gbps, other values - reserved */
71255932Salfred	__be16 max_bw_value;
72255932Salfred};
73255932Salfred
74255932Salfredstruct mlx4_set_port_scheduler_context {
75255932Salfred	struct mlx4_port_scheduler_tc_cfg_be tc[MLX4_NUM_TC];
76255932Salfred};
77255932Salfred
78219820Sjeffenum {
79219820Sjeff	MLX4_HCR_BASE		= 0x80680,
80219820Sjeff	MLX4_HCR_SIZE		= 0x0001c,
81255932Salfred	MLX4_CLR_INT_SIZE	= 0x00008,
82255932Salfred	MLX4_SLAVE_COMM_BASE	= 0x0,
83255932Salfred	MLX4_COMM_PAGESIZE	= 0x1000,
84255932Salfred	MLX4_CLOCK_SIZE		= 0x00008
85219820Sjeff};
86219820Sjeff
87219820Sjeffenum {
88255932Salfred	MLX4_DEFAULT_MGM_LOG_ENTRY_SIZE = 10,
89255932Salfred	MLX4_MIN_MGM_LOG_ENTRY_SIZE = 7,
90255932Salfred	MLX4_MAX_MGM_LOG_ENTRY_SIZE = 12,
91255932Salfred	MLX4_MAX_QP_PER_MGM	= 4 * ((1 << MLX4_MAX_MGM_LOG_ENTRY_SIZE)/16 - 2),
92219820Sjeff};
93219820Sjeff
94219820Sjeffenum {
95219820Sjeff	MLX4_NUM_PDS		= 1 << 15
96219820Sjeff};
97219820Sjeff
98219820Sjeffenum {
99219820Sjeff	MLX4_CMPT_TYPE_QP	= 0,
100219820Sjeff	MLX4_CMPT_TYPE_SRQ	= 1,
101219820Sjeff	MLX4_CMPT_TYPE_CQ	= 2,
102219820Sjeff	MLX4_CMPT_TYPE_EQ	= 3,
103219820Sjeff	MLX4_CMPT_NUM_TYPE
104219820Sjeff};
105219820Sjeff
106219820Sjeffenum {
107219820Sjeff	MLX4_CMPT_SHIFT		= 24,
108219820Sjeff	MLX4_NUM_CMPTS		= MLX4_CMPT_NUM_TYPE << MLX4_CMPT_SHIFT
109219820Sjeff};
110219820Sjeff
111255932Salfredenum mlx4_mr_state {
112255932Salfred	MLX4_MR_DISABLED = 0,
113255932Salfred	MLX4_MR_EN_HW,
114255932Salfred	MLX4_MR_EN_SW
115255932Salfred};
116255932Salfred
117255932Salfred#define MLX4_COMM_TIME		10000
118255932Salfredenum {
119255932Salfred	MLX4_COMM_CMD_RESET,
120255932Salfred	MLX4_COMM_CMD_VHCR0,
121255932Salfred	MLX4_COMM_CMD_VHCR1,
122255932Salfred	MLX4_COMM_CMD_VHCR2,
123255932Salfred	MLX4_COMM_CMD_VHCR_EN,
124255932Salfred	MLX4_COMM_CMD_VHCR_POST,
125255932Salfred	MLX4_COMM_CMD_FLR = 254
126255932Salfred};
127255932Salfred
128255932Salfred/*The flag indicates that the slave should delay the RESET cmd*/
129255932Salfred#define MLX4_DELAY_RESET_SLAVE 0xbbbbbbb
130255932Salfred/*indicates how many retries will be done if we are in the middle of FLR*/
131255932Salfred#define NUM_OF_RESET_RETRIES	10
132255932Salfred#define SLEEP_TIME_IN_RESET	(2 * 1000)
133255932Salfredenum mlx4_resource {
134255932Salfred	RES_QP,
135255932Salfred	RES_CQ,
136255932Salfred	RES_SRQ,
137255932Salfred	RES_XRCD,
138255932Salfred	RES_MPT,
139255932Salfred	RES_MTT,
140255932Salfred	RES_MAC,
141255932Salfred	RES_VLAN,
142255932Salfred	RES_EQ,
143255932Salfred	RES_COUNTER,
144255932Salfred	RES_FS_RULE,
145255932Salfred	MLX4_NUM_OF_RESOURCE_TYPE
146255932Salfred};
147255932Salfred
148255932Salfredenum mlx4_alloc_mode {
149255932Salfred	RES_OP_RESERVE,
150255932Salfred	RES_OP_RESERVE_AND_MAP,
151255932Salfred	RES_OP_MAP_ICM,
152255932Salfred};
153255932Salfred
154255932Salfredenum mlx4_res_tracker_free_type {
155255932Salfred	RES_TR_FREE_ALL,
156255932Salfred	RES_TR_FREE_SLAVES_ONLY,
157255932Salfred	RES_TR_FREE_STRUCTS_ONLY,
158255932Salfred};
159255932Salfred
160255932Salfred/*
161255932Salfred *Virtual HCR structures.
162255932Salfred * mlx4_vhcr is the sw representation, in machine endianess
163255932Salfred *
164255932Salfred * mlx4_vhcr_cmd is the formalized structure, the one that is passed
165255932Salfred * to FW to go through communication channel.
166255932Salfred * It is big endian, and has the same structure as the physical HCR
167255932Salfred * used by command interface
168255932Salfred */
169255932Salfredstruct mlx4_vhcr {
170255932Salfred	u64	in_param;
171255932Salfred	u64	out_param;
172255932Salfred	u32	in_modifier;
173255932Salfred	u32	errno;
174255932Salfred	u16	op;
175255932Salfred	u16	token;
176255932Salfred	u8	op_modifier;
177255932Salfred	u8	e_bit;
178255932Salfred};
179255932Salfred
180255932Salfredstruct mlx4_vhcr_cmd {
181255932Salfred	__be64 in_param;
182255932Salfred	__be32 in_modifier;
183255932Salfred	__be64 out_param;
184255932Salfred	__be16 token;
185255932Salfred	u16 reserved;
186255932Salfred	u8 status;
187255932Salfred	u8 flags;
188255932Salfred	__be16 opcode;
189255932Salfred};
190255932Salfred
191255932Salfredstruct mlx4_cmd_info {
192255932Salfred	u16 opcode;
193255932Salfred	bool has_inbox;
194255932Salfred	bool has_outbox;
195255932Salfred	bool out_is_imm;
196255932Salfred	bool encode_slave_id;
197255932Salfred	int (*verify)(struct mlx4_dev *dev, int slave, struct mlx4_vhcr *vhcr,
198255932Salfred		      struct mlx4_cmd_mailbox *inbox);
199255932Salfred	int (*wrapper)(struct mlx4_dev *dev, int slave, struct mlx4_vhcr *vhcr,
200255932Salfred		       struct mlx4_cmd_mailbox *inbox,
201255932Salfred		       struct mlx4_cmd_mailbox *outbox,
202255932Salfred		       struct mlx4_cmd_info *cmd);
203255932Salfred};
204255932Salfred
205219820Sjeff#ifdef CONFIG_MLX4_DEBUG
206219820Sjeffextern int mlx4_debug_level;
207219820Sjeff#else /* CONFIG_MLX4_DEBUG */
208219820Sjeff#define mlx4_debug_level	(0)
209219820Sjeff#endif /* CONFIG_MLX4_DEBUG */
210219820Sjeff
211219820Sjeff#define mlx4_dbg(mdev, format, arg...)					\
212255932Salfreddo {									\
213255932Salfred	if (mlx4_debug_level)						\
214255932Salfred		dev_printk(KERN_DEBUG, &mdev->pdev->dev, format, ##arg); \
215255932Salfred} while (0)
216219820Sjeff
217219820Sjeff#define mlx4_err(mdev, format, arg...) \
218255932Salfred	dev_err(&mdev->pdev->dev, format, ##arg)
219219820Sjeff#define mlx4_info(mdev, format, arg...) \
220255932Salfred	dev_info(&mdev->pdev->dev, format, ##arg)
221219820Sjeff#define mlx4_warn(mdev, format, arg...) \
222255932Salfred	dev_warn(&mdev->pdev->dev, format, ##arg)
223219820Sjeff
224255932Salfredextern int mlx4_log_num_mgm_entry_size;
225255932Salfredextern int log_mtts_per_seg;
226219820Sjeffextern int mlx4_blck_lb;
227255932Salfredextern int mlx4_set_4k_mtu;
228219820Sjeff
229255932Salfred#define MLX4_MAX_NUM_SLAVES	(MLX4_MAX_NUM_PF + MLX4_MAX_NUM_VF)
230255932Salfred#define ALL_SLAVES 0xff
231255932Salfred
232219820Sjeffstruct mlx4_bitmap {
233219820Sjeff	u32			last;
234219820Sjeff	u32			top;
235219820Sjeff	u32			max;
236219820Sjeff	u32                     reserved_top;
237219820Sjeff	u32			mask;
238219820Sjeff	u32			avail;
239219820Sjeff	spinlock_t		lock;
240219820Sjeff	unsigned long	       *table;
241219820Sjeff};
242219820Sjeff
243219820Sjeffstruct mlx4_buddy {
244219820Sjeff	unsigned long	      **bits;
245219820Sjeff	unsigned int	       *num_free;
246255932Salfred	u32			max_order;
247219820Sjeff	spinlock_t		lock;
248219820Sjeff};
249219820Sjeff
250219820Sjeffstruct mlx4_icm;
251219820Sjeff
252219820Sjeffstruct mlx4_icm_table {
253219820Sjeff	u64			virt;
254219820Sjeff	int			num_icm;
255255932Salfred	u32			num_obj;
256219820Sjeff	int			obj_size;
257219820Sjeff	int			lowmem;
258219820Sjeff	int			coherent;
259219820Sjeff	struct mutex		mutex;
260219820Sjeff	struct mlx4_icm	      **icm;
261219820Sjeff};
262219820Sjeff
263255932Salfred/*
264255932Salfred * Must be packed because mtt_seg is 64 bits but only aligned to 32 bits.
265255932Salfred */
266255932Salfredstruct mlx4_mpt_entry {
267255932Salfred	__be32 flags;
268255932Salfred	__be32 qpn;
269255932Salfred	__be32 key;
270255932Salfred	__be32 pd_flags;
271255932Salfred	__be64 start;
272255932Salfred	__be64 length;
273255932Salfred	__be32 lkey;
274255932Salfred	__be32 win_cnt;
275255932Salfred	u8	reserved1[3];
276255932Salfred	u8	mtt_rep;
277255932Salfred	__be64 mtt_addr;
278255932Salfred	__be32 mtt_sz;
279255932Salfred	__be32 entity_size;
280255932Salfred	__be32 first_byte_offset;
281255932Salfred} __packed;
282255932Salfred
283255932Salfred/*
284255932Salfred * Must be packed because start is 64 bits but only aligned to 32 bits.
285255932Salfred */
286255932Salfredstruct mlx4_eq_context {
287255932Salfred	__be32			flags;
288255932Salfred	u16			reserved1[3];
289255932Salfred	__be16			page_offset;
290255932Salfred	u8			log_eq_size;
291255932Salfred	u8			reserved2[4];
292255932Salfred	u8			eq_period;
293255932Salfred	u8			reserved3;
294255932Salfred	u8			eq_max_count;
295255932Salfred	u8			reserved4[3];
296255932Salfred	u8			intr;
297255932Salfred	u8			log_page_size;
298255932Salfred	u8			reserved5[2];
299255932Salfred	u8			mtt_base_addr_h;
300255932Salfred	__be32			mtt_base_addr_l;
301255932Salfred	u32			reserved6[2];
302255932Salfred	__be32			consumer_index;
303255932Salfred	__be32			producer_index;
304255932Salfred	u32			reserved7[4];
305255932Salfred};
306255932Salfred
307255932Salfredstruct mlx4_cq_context {
308255932Salfred	__be32			flags;
309255932Salfred	u16			reserved1[3];
310255932Salfred	__be16			page_offset;
311255932Salfred	__be32			logsize_usrpage;
312255932Salfred	__be16			cq_period;
313255932Salfred	__be16			cq_max_count;
314255932Salfred	u8			reserved2[3];
315255932Salfred	u8			comp_eqn;
316255932Salfred	u8			log_page_size;
317255932Salfred	u8			reserved3[2];
318255932Salfred	u8			mtt_base_addr_h;
319255932Salfred	__be32			mtt_base_addr_l;
320255932Salfred	__be32			last_notified_index;
321255932Salfred	__be32			solicit_producer_index;
322255932Salfred	__be32			consumer_index;
323255932Salfred	__be32			producer_index;
324255932Salfred	u32			reserved4[2];
325255932Salfred	__be64			db_rec_addr;
326255932Salfred};
327255932Salfred
328255932Salfredstruct mlx4_srq_context {
329255932Salfred	__be32			state_logsize_srqn;
330255932Salfred	u8			logstride;
331255932Salfred	u8			reserved1;
332255932Salfred	__be16			xrcd;
333255932Salfred	__be32			pg_offset_cqn;
334255932Salfred	u32			reserved2;
335255932Salfred	u8			log_page_size;
336255932Salfred	u8			reserved3[2];
337255932Salfred	u8			mtt_base_addr_h;
338255932Salfred	__be32			mtt_base_addr_l;
339255932Salfred	__be32			pd;
340255932Salfred	__be16			limit_watermark;
341255932Salfred	__be16			wqe_cnt;
342255932Salfred	u16			reserved4;
343255932Salfred	__be16			wqe_counter;
344255932Salfred	u32			reserved5;
345255932Salfred	__be64			db_rec_addr;
346255932Salfred};
347255932Salfred
348219820Sjeffstruct mlx4_eq {
349219820Sjeff	struct mlx4_dev	       *dev;
350219820Sjeff	void __iomem	       *doorbell;
351219820Sjeff	int			eqn;
352219820Sjeff	u32			cons_index;
353219820Sjeff	u16			irq;
354219820Sjeff	u16			have_irq;
355219820Sjeff	int			nent;
356255932Salfred        int                     load;
357219820Sjeff	struct mlx4_buf_list   *page_list;
358219820Sjeff	struct mlx4_mtt		mtt;
359219820Sjeff};
360219820Sjeff
361255932Salfredstruct mlx4_slave_eqe {
362255932Salfred	u8 type;
363255932Salfred	u8 port;
364255932Salfred	u32 param;
365255932Salfred};
366255932Salfred
367255932Salfredstruct mlx4_slave_event_eq_info {
368255932Salfred	int eqn;
369255932Salfred	u16 token;
370255932Salfred};
371255932Salfred
372219820Sjeffstruct mlx4_profile {
373219820Sjeff	int			num_qp;
374219820Sjeff	int			rdmarc_per_qp;
375219820Sjeff	int			num_srq;
376219820Sjeff	int			num_cq;
377219820Sjeff	int			num_mcg;
378219820Sjeff	int			num_mpt;
379255932Salfred	unsigned		num_mtt;
380219820Sjeff};
381219820Sjeff
382219820Sjeffstruct mlx4_fw {
383219820Sjeff	u64			clr_int_base;
384219820Sjeff	u64			catas_offset;
385255932Salfred	u64			comm_base;
386255932Salfred	u64			clock_offset;
387219820Sjeff	struct mlx4_icm	       *fw_icm;
388219820Sjeff	struct mlx4_icm	       *aux_icm;
389219820Sjeff	u32			catas_size;
390219820Sjeff	u16			fw_pages;
391219820Sjeff	u8			clr_int_bar;
392219820Sjeff	u8			catas_bar;
393255932Salfred	u8			comm_bar;
394255932Salfred	u8			clock_bar;
395219820Sjeff};
396219820Sjeff
397255932Salfredstruct mlx4_comm {
398255932Salfred	u32			slave_write;
399255932Salfred	u32			slave_read;
400255932Salfred};
401255932Salfred
402255932Salfredenum {
403255932Salfred	MLX4_MCAST_CONFIG       = 0,
404255932Salfred	MLX4_MCAST_DISABLE      = 1,
405255932Salfred	MLX4_MCAST_ENABLE       = 2,
406255932Salfred};
407255932Salfred
408255932Salfred#define VLAN_FLTR_SIZE	128
409255932Salfred
410255932Salfredstruct mlx4_vlan_fltr {
411255932Salfred	__be32 entry[VLAN_FLTR_SIZE];
412255932Salfred};
413255932Salfred
414255932Salfredstruct mlx4_mcast_entry {
415255932Salfred	struct list_head list;
416255932Salfred	u64 addr;
417255932Salfred};
418255932Salfred
419255932Salfredstruct mlx4_promisc_qp {
420255932Salfred	struct list_head list;
421255932Salfred	u32 qpn;
422255932Salfred};
423255932Salfred
424255932Salfredstruct mlx4_steer_index {
425255932Salfred	struct list_head list;
426255932Salfred	unsigned int index;
427255932Salfred	struct list_head duplicates;
428255932Salfred};
429255932Salfred
430255932Salfred#define MLX4_EVENT_TYPES_NUM 64
431255932Salfred
432255932Salfredstruct mlx4_slave_state {
433255932Salfred	u8 comm_toggle;
434255932Salfred	u8 last_cmd;
435255932Salfred	u8 init_port_mask;
436255932Salfred	bool active;
437255932Salfred	u8 function;
438255932Salfred	dma_addr_t vhcr_dma;
439255932Salfred	u16 mtu[MLX4_MAX_PORTS + 1];
440255932Salfred	__be32 ib_cap_mask[MLX4_MAX_PORTS + 1];
441255932Salfred	struct mlx4_slave_eqe eq[MLX4_MFUNC_MAX_EQES];
442255932Salfred	struct list_head mcast_filters[MLX4_MAX_PORTS + 1];
443255932Salfred	struct mlx4_vlan_fltr *vlan_filter[MLX4_MAX_PORTS + 1];
444255932Salfred	/* event type to eq number lookup */
445255932Salfred	struct mlx4_slave_event_eq_info event_eq[MLX4_EVENT_TYPES_NUM];
446255932Salfred	u16 eq_pi;
447255932Salfred	u16 eq_ci;
448255932Salfred	spinlock_t lock;
449255932Salfred	/*initialized via the kzalloc*/
450255932Salfred	u8 is_slave_going_down;
451255932Salfred	u32 cookie;
452255932Salfred	enum slave_port_state port_state[MLX4_MAX_PORTS + 1];
453255932Salfred};
454255932Salfred
455255932Salfred#define MLX4_VGT 4095
456255932Salfred#define NO_INDX  (-1)
457255932Salfred
458255932Salfredstruct mlx4_vport_state {
459255932Salfred	u64 mac;
460255932Salfred	u16 default_vlan;
461255932Salfred	u8  default_qos;
462255932Salfred	u32 tx_rate;
463255932Salfred	bool spoofchk;
464255932Salfred};
465255932Salfred
466255932Salfredstruct mlx4_vf_admin_state {
467255932Salfred	struct mlx4_vport_state vport[MLX4_MAX_PORTS + 1];
468255932Salfred};
469255932Salfred
470255932Salfredstruct mlx4_vport_oper_state {
471255932Salfred	struct mlx4_vport_state state;
472255932Salfred	int mac_idx;
473255932Salfred	int vlan_idx;
474255932Salfred};
475255932Salfredstruct mlx4_vf_oper_state {
476255932Salfred	struct mlx4_vport_oper_state vport[MLX4_MAX_PORTS + 1];
477255932Salfred};
478255932Salfred
479255932Salfredstruct slave_list {
480255932Salfred	struct mutex mutex;
481255932Salfred	struct list_head res_list[MLX4_NUM_OF_RESOURCE_TYPE];
482255932Salfred};
483255932Salfred
484255932Salfredstruct resource_allocator {
485255932Salfred	spinlock_t alloc_lock;
486255932Salfred	union {
487255932Salfred		int res_reserved;
488255932Salfred		int res_port_rsvd[MLX4_MAX_PORTS];
489255932Salfred	};
490255932Salfred	union {
491255932Salfred		int res_free;
492255932Salfred		int res_port_free[MLX4_MAX_PORTS];
493255932Salfred	};
494255932Salfred	int *quota;
495255932Salfred	int *allocated;
496255932Salfred	int *guaranteed;
497255932Salfred};
498255932Salfred
499255932Salfredstruct mlx4_resource_tracker {
500255932Salfred	spinlock_t lock;
501255932Salfred	/* tree for each resources */
502255932Salfred	struct rb_root res_tree[MLX4_NUM_OF_RESOURCE_TYPE];
503255932Salfred	/* num_of_slave's lists, one per slave */
504255932Salfred	struct slave_list *slave_list;
505255932Salfred	struct resource_allocator res_alloc[MLX4_NUM_OF_RESOURCE_TYPE];
506255932Salfred};
507255932Salfred
508255932Salfred#define SLAVE_EVENT_EQ_SIZE	128
509255932Salfredstruct mlx4_slave_event_eq {
510255932Salfred	u32 eqn;
511255932Salfred	u32 cons;
512255932Salfred	u32 prod;
513255932Salfred	spinlock_t event_lock;
514255932Salfred	struct mlx4_eqe event_eqe[SLAVE_EVENT_EQ_SIZE];
515255932Salfred};
516255932Salfred
517255932Salfredstruct mlx4_master_qp0_state {
518255932Salfred	int proxy_qp0_active;
519255932Salfred	int qp0_active;
520255932Salfred	int port_active;
521255932Salfred};
522255932Salfred
523255932Salfredstruct mlx4_mfunc_master_ctx {
524255932Salfred	struct mlx4_slave_state *slave_state;
525255932Salfred	struct mlx4_vf_admin_state *vf_admin;
526255932Salfred	struct mlx4_vf_oper_state *vf_oper;
527255932Salfred	struct mlx4_master_qp0_state qp0_state[MLX4_MAX_PORTS + 1];
528255932Salfred	int			init_port_ref[MLX4_MAX_PORTS + 1];
529255932Salfred	u16			max_mtu[MLX4_MAX_PORTS + 1];
530255932Salfred	int			disable_mcast_ref[MLX4_MAX_PORTS + 1];
531255932Salfred	struct mlx4_resource_tracker res_tracker;
532255932Salfred	struct workqueue_struct *comm_wq;
533255932Salfred	struct work_struct	comm_work;
534255932Salfred	struct work_struct	slave_event_work;
535255932Salfred	struct work_struct	slave_flr_event_work;
536255932Salfred	spinlock_t		slave_state_lock;
537255932Salfred	__be32			comm_arm_bit_vector[4];
538255932Salfred	struct mlx4_eqe		cmd_eqe;
539255932Salfred	struct mlx4_slave_event_eq slave_eq;
540255932Salfred	struct mutex		gen_eqe_mutex[MLX4_MFUNC_MAX];
541255932Salfred};
542255932Salfred
543255932Salfredstruct mlx4_mfunc {
544255932Salfred	struct mlx4_comm __iomem       *comm;
545255932Salfred	struct mlx4_vhcr_cmd	       *vhcr;
546255932Salfred	dma_addr_t			vhcr_dma;
547255932Salfred
548255932Salfred	struct mlx4_mfunc_master_ctx	master;
549255932Salfred};
550255932Salfred
551255932Salfred#define MGM_QPN_MASK       0x00FFFFFF
552255932Salfred#define MGM_BLCK_LB_BIT    30
553255932Salfred
554255932Salfredstruct mlx4_mgm {
555255932Salfred	__be32			next_gid_index;
556255932Salfred	__be32			members_count;
557255932Salfred	u32			reserved[2];
558255932Salfred	u8			gid[16];
559255932Salfred	__be32			qp[MLX4_MAX_QP_PER_MGM];
560255932Salfred};
561255932Salfred
562219820Sjeffstruct mlx4_cmd {
563219820Sjeff	struct pci_pool	       *pool;
564219820Sjeff	void __iomem	       *hcr;
565219820Sjeff	struct mutex		hcr_mutex;
566255932Salfred	struct mutex		slave_cmd_mutex;
567219820Sjeff	struct semaphore	poll_sem;
568219820Sjeff	struct semaphore	event_sem;
569219820Sjeff	int			max_cmds;
570219820Sjeff	spinlock_t		context_lock;
571219820Sjeff	int			free_head;
572219820Sjeff	struct mlx4_cmd_context *context;
573219820Sjeff	u16			token_mask;
574219820Sjeff	u8			use_events;
575219820Sjeff	u8			toggle;
576255932Salfred	u8			comm_toggle;
577219820Sjeff};
578219820Sjeff
579219820Sjeffstruct mlx4_uar_table {
580219820Sjeff	struct mlx4_bitmap	bitmap;
581219820Sjeff};
582219820Sjeff
583219820Sjeffstruct mlx4_mr_table {
584219820Sjeff	struct mlx4_bitmap	mpt_bitmap;
585219820Sjeff	struct mlx4_buddy	mtt_buddy;
586219820Sjeff	u64			mtt_base;
587219820Sjeff	u64			mpt_base;
588219820Sjeff	struct mlx4_icm_table	mtt_table;
589219820Sjeff	struct mlx4_icm_table	dmpt_table;
590219820Sjeff};
591219820Sjeff
592219820Sjeffstruct mlx4_cq_table {
593219820Sjeff	struct mlx4_bitmap	bitmap;
594219820Sjeff	spinlock_t		lock;
595219820Sjeff	struct radix_tree_root	tree;
596219820Sjeff	struct mlx4_icm_table	table;
597219820Sjeff	struct mlx4_icm_table	cmpt_table;
598219820Sjeff};
599219820Sjeff
600219820Sjeffstruct mlx4_eq_table {
601219820Sjeff	struct mlx4_bitmap	bitmap;
602219820Sjeff	char		       *irq_names;
603219820Sjeff	void __iomem	       *clr_int;
604219820Sjeff	void __iomem	      **uar_map;
605219820Sjeff	u32			clr_mask;
606219820Sjeff	struct mlx4_eq	       *eq;
607219820Sjeff	struct mlx4_icm_table	table;
608219820Sjeff	struct mlx4_icm_table	cmpt_table;
609219820Sjeff	int			have_irq;
610219820Sjeff	u8			inta_pin;
611219820Sjeff};
612219820Sjeff
613219820Sjeffstruct mlx4_srq_table {
614219820Sjeff	struct mlx4_bitmap	bitmap;
615219820Sjeff	spinlock_t		lock;
616255932Salfred	struct radix_tree_root	tree;
617219820Sjeff	struct mlx4_icm_table	table;
618219820Sjeff	struct mlx4_icm_table	cmpt_table;
619219820Sjeff};
620219820Sjeff
621219820Sjeffstruct mlx4_qp_table {
622219820Sjeff	struct mlx4_bitmap	bitmap;
623219820Sjeff	u32			rdmarc_base;
624219820Sjeff	int			rdmarc_shift;
625219820Sjeff	spinlock_t		lock;
626219820Sjeff	struct mlx4_icm_table	qp_table;
627219820Sjeff	struct mlx4_icm_table	auxc_table;
628219820Sjeff	struct mlx4_icm_table	altc_table;
629219820Sjeff	struct mlx4_icm_table	rdmarc_table;
630219820Sjeff	struct mlx4_icm_table	cmpt_table;
631219820Sjeff};
632219820Sjeff
633219820Sjeffstruct mlx4_mcg_table {
634219820Sjeff	struct mutex		mutex;
635219820Sjeff	struct mlx4_bitmap	bitmap;
636219820Sjeff	struct mlx4_icm_table	table;
637219820Sjeff};
638219820Sjeff
639219820Sjeffstruct mlx4_catas_err {
640219820Sjeff	u32 __iomem	       *map;
641219820Sjeff	struct timer_list	timer;
642219820Sjeff	struct list_head	list;
643219820Sjeff};
644219820Sjeff
645219820Sjeff#define MLX4_MAX_MAC_NUM	128
646219820Sjeff#define MLX4_MAC_TABLE_SIZE	(MLX4_MAX_MAC_NUM << 3)
647219820Sjeff
648219820Sjeffstruct mlx4_mac_table {
649219820Sjeff	__be64			entries[MLX4_MAX_MAC_NUM];
650219820Sjeff	int			refs[MLX4_MAX_MAC_NUM];
651219820Sjeff	struct mutex		mutex;
652219820Sjeff	int			total;
653219820Sjeff	int			max;
654219820Sjeff};
655219820Sjeff
656219820Sjeff#define MLX4_MAX_VLAN_NUM	128
657219820Sjeff#define MLX4_VLAN_TABLE_SIZE	(MLX4_MAX_VLAN_NUM << 2)
658219820Sjeff
659219820Sjeffstruct mlx4_vlan_table {
660219820Sjeff	__be32			entries[MLX4_MAX_VLAN_NUM];
661219820Sjeff	int			refs[MLX4_MAX_VLAN_NUM];
662219820Sjeff	struct mutex		mutex;
663219820Sjeff	int			total;
664219820Sjeff	int			max;
665219820Sjeff};
666219820Sjeff
667255932Salfred#define SET_PORT_GEN_ALL_VALID		0x7
668255932Salfred#define SET_PORT_PROMISC_SHIFT		31
669255932Salfred#define SET_PORT_MC_PROMISC_SHIFT	30
670255932Salfred
671255932Salfredenum {
672255932Salfred	MCAST_DIRECT_ONLY	= 0,
673255932Salfred	MCAST_DIRECT		= 1,
674255932Salfred	MCAST_DEFAULT		= 2
675255932Salfred};
676255932Salfred
677255932Salfred
678255932Salfredstruct mlx4_set_port_general_context {
679255932Salfred	u8 reserved[3];
680255932Salfred	u8 flags;
681255932Salfred	u16 reserved2;
682255932Salfred	__be16 mtu;
683255932Salfred	u8 pptx;
684255932Salfred	u8 pfctx;
685255932Salfred	u16 reserved3;
686255932Salfred	u8 pprx;
687255932Salfred	u8 pfcrx;
688255932Salfred	u16 reserved4;
689255932Salfred};
690255932Salfred
691255932Salfredstruct mlx4_set_port_rqp_calc_context {
692255932Salfred	__be32 base_qpn;
693255932Salfred	u8 rererved;
694255932Salfred	u8 n_mac;
695255932Salfred	u8 n_vlan;
696255932Salfred	u8 n_prio;
697255932Salfred	u8 reserved2[3];
698255932Salfred	u8 mac_miss;
699255932Salfred	u8 intra_no_vlan;
700255932Salfred	u8 no_vlan;
701255932Salfred	u8 intra_vlan_miss;
702255932Salfred	u8 vlan_miss;
703255932Salfred	u8 reserved3[3];
704255932Salfred	u8 no_vlan_prio;
705255932Salfred	__be32 promisc;
706255932Salfred	__be32 mcast;
707255932Salfred};
708255932Salfred
709219820Sjeffstruct mlx4_port_info {
710219820Sjeff	struct mlx4_dev	       *dev;
711219820Sjeff	int			port;
712219820Sjeff	char			dev_name[16];
713219820Sjeff	struct device_attribute port_attr;
714219820Sjeff	enum mlx4_port_type	tmp_type;
715255932Salfred	char			dev_mtu_name[16];
716255932Salfred	struct device_attribute port_mtu_attr;
717219820Sjeff	struct mlx4_mac_table	mac_table;
718219820Sjeff	struct mlx4_vlan_table	vlan_table;
719255932Salfred	int			base_qpn;
720219820Sjeff};
721219820Sjeff
722219820Sjeffstruct mlx4_sense {
723219820Sjeff	struct mlx4_dev		*dev;
724219820Sjeff	u8			do_sense_port[MLX4_MAX_PORTS + 1];
725219820Sjeff	u8			sense_allowed[MLX4_MAX_PORTS + 1];
726219820Sjeff	struct delayed_work	sense_poll;
727255932Salfred        struct workqueue_struct *sense_wq;
728255932Salfred        u32                     resched;
729219820Sjeff};
730219820Sjeff
731255932Salfredstruct mlx4_msix_ctl {
732255932Salfred	u64		pool_bm;
733255932Salfred	struct mutex	pool_lock;
734255932Salfred};
735219820Sjeff
736255932Salfredstruct mlx4_steer {
737255932Salfred	struct list_head promisc_qps[MLX4_NUM_STEERS];
738255932Salfred	struct list_head steer_entries[MLX4_NUM_STEERS];
739255932Salfred};
740255932Salfred
741255932Salfredstruct mlx4_net_trans_rule_hw_ctrl {
742255932Salfred	__be32 ctrl;
743255932Salfred	u8 rsvd1;
744255932Salfred	u8 funcid;
745255932Salfred	u8 vep;
746255932Salfred	u8 port;
747255932Salfred	__be32 qpn;
748255932Salfred	__be32 rsvd2;
749255932Salfred};
750255932Salfred
751255932Salfredstruct mlx4_net_trans_rule_hw_ib {
752255932Salfred	u8 size;
753255932Salfred	u8 rsvd1;
754255932Salfred	__be16 id;
755255932Salfred	u32 rsvd2;
756255932Salfred	__be32 r_u_qpn;
757255932Salfred	__be32 qpn_mask;
758255932Salfred	u8 dst_gid[16];
759255932Salfred	u8 dst_gid_msk[16];
760255932Salfred} __packed;
761255932Salfred
762255932Salfredstruct mlx4_net_trans_rule_hw_eth {
763255932Salfred	u8	size;
764255932Salfred	u8	rsvd;
765255932Salfred	__be16	id;
766255932Salfred	u8	rsvd1[6];
767255932Salfred	u8	dst_mac[6];
768255932Salfred	u16	rsvd2;
769255932Salfred	u8	dst_mac_msk[6];
770255932Salfred	u16	rsvd3;
771255932Salfred	u8	src_mac[6];
772255932Salfred	u16	rsvd4;
773255932Salfred	u8	src_mac_msk[6];
774255932Salfred	u8      rsvd5;
775255932Salfred	u8      ether_type_enable;
776255932Salfred	__be16  ether_type;
777255932Salfred	__be16  vlan_id_msk;
778255932Salfred	__be16  vlan_id;
779255932Salfred} __packed;
780255932Salfred
781255932Salfredstruct mlx4_net_trans_rule_hw_tcp_udp {
782255932Salfred	u8	size;
783255932Salfred	u8	rsvd;
784255932Salfred	__be16	id;
785255932Salfred	__be16	rsvd1[3];
786255932Salfred	__be16	dst_port;
787255932Salfred	__be16	rsvd2;
788255932Salfred	__be16	dst_port_msk;
789255932Salfred	__be16	rsvd3;
790255932Salfred	__be16	src_port;
791255932Salfred	__be16	rsvd4;
792255932Salfred	__be16	src_port_msk;
793255932Salfred} __packed;
794255932Salfred
795255932Salfredstruct mlx4_net_trans_rule_hw_ipv4 {
796255932Salfred	u8	size;
797255932Salfred	u8	rsvd;
798255932Salfred	__be16	id;
799255932Salfred	__be32	rsvd1;
800255932Salfred	__be32	dst_ip;
801255932Salfred	__be32	dst_ip_msk;
802255932Salfred	__be32	src_ip;
803255932Salfred	__be32	src_ip_msk;
804255932Salfred} __packed;
805255932Salfred
806255932Salfredstruct _rule_hw {
807255932Salfred	union {
808255932Salfred		struct {
809255932Salfred			u8 size;
810255932Salfred			u8 rsvd;
811255932Salfred			__be16 id;
812255932Salfred		};
813255932Salfred		struct mlx4_net_trans_rule_hw_eth eth;
814255932Salfred		struct mlx4_net_trans_rule_hw_ib ib;
815255932Salfred		struct mlx4_net_trans_rule_hw_ipv4 ipv4;
816255932Salfred		struct mlx4_net_trans_rule_hw_tcp_udp tcp_udp;
817255932Salfred	};
818255932Salfred};
819255932Salfred
820255932Salfredenum {
821255932Salfred	MLX4_PCI_DEV_IS_VF		= 1 << 0,
822255932Salfred	MLX4_PCI_DEV_FORCE_SENSE_PORT	= 1 << 1,
823255932Salfred};
824255932Salfred
825255932Salfredstruct mlx4_roce_gid_entry {
826255932Salfred	u8 raw[16];
827255932Salfred};
828255932Salfred
829219820Sjeffstruct mlx4_priv {
830219820Sjeff	struct mlx4_dev		dev;
831219820Sjeff
832219820Sjeff	struct list_head	dev_list;
833219820Sjeff	struct list_head	ctx_list;
834219820Sjeff	spinlock_t		ctx_lock;
835219820Sjeff
836255932Salfred	int			pci_dev_data;
837255932Salfred
838219820Sjeff	struct list_head        pgdir_list;
839219820Sjeff	struct mutex            pgdir_mutex;
840219820Sjeff
841219820Sjeff	struct mlx4_fw		fw;
842219820Sjeff	struct mlx4_cmd		cmd;
843255932Salfred	struct mlx4_mfunc	mfunc;
844219820Sjeff
845219820Sjeff	struct mlx4_bitmap	pd_bitmap;
846219820Sjeff	struct mlx4_bitmap	xrcd_bitmap;
847219820Sjeff	struct mlx4_uar_table	uar_table;
848219820Sjeff	struct mlx4_mr_table	mr_table;
849219820Sjeff	struct mlx4_cq_table	cq_table;
850219820Sjeff	struct mlx4_eq_table	eq_table;
851219820Sjeff	struct mlx4_srq_table	srq_table;
852219820Sjeff	struct mlx4_qp_table	qp_table;
853219820Sjeff	struct mlx4_mcg_table	mcg_table;
854219820Sjeff	struct mlx4_bitmap	counters_bitmap;
855219820Sjeff
856219820Sjeff	struct mlx4_catas_err	catas_err;
857219820Sjeff
858219820Sjeff	void __iomem	       *clr_base;
859219820Sjeff
860219820Sjeff	struct mlx4_uar		driver_uar;
861219820Sjeff	void __iomem	       *kar;
862219820Sjeff	struct mlx4_port_info	port[MLX4_MAX_PORTS + 1];
863219820Sjeff	struct mlx4_sense       sense;
864219820Sjeff	struct mutex		port_mutex;
865255932Salfred	struct mlx4_msix_ctl	msix_ctl;
866255932Salfred	struct mlx4_steer	*steer;
867255932Salfred	struct list_head	bf_list;
868255932Salfred	struct mutex		bf_mutex;
869255932Salfred	struct io_mapping	*bf_mapping;
870255932Salfred	void __iomem            *clock_mapping;
871255932Salfred	int			reserved_mtts;
872255932Salfred	int			fs_hash_mode;
873255932Salfred	u8 virt2phys_pkey[MLX4_MFUNC_MAX][MLX4_MAX_PORTS][MLX4_MAX_PORT_PKEYS];
874255932Salfred	__be64			slave_node_guids[MLX4_MFUNC_MAX];
875255932Salfred	struct mlx4_roce_gid_entry roce_gids[MLX4_MAX_PORTS][128];
876255932Salfred	atomic_t		opreq_count;
877255932Salfred	struct work_struct	opreq_task;
878219820Sjeff};
879219820Sjeff
880219820Sjeffstatic inline struct mlx4_priv *mlx4_priv(struct mlx4_dev *dev)
881219820Sjeff{
882219820Sjeff	return container_of(dev, struct mlx4_priv, dev);
883219820Sjeff}
884219820Sjeff
885219820Sjeff#define MLX4_SENSE_RANGE	(HZ * 3)
886219820Sjeff
887219820Sjeffextern struct workqueue_struct *mlx4_wq;
888219820Sjeff
889219820Sjeffu32 mlx4_bitmap_alloc(struct mlx4_bitmap *bitmap);
890219820Sjeffvoid mlx4_bitmap_free(struct mlx4_bitmap *bitmap, u32 obj);
891255932Salfredu32 mlx4_bitmap_alloc_range(struct mlx4_bitmap *bitmap, int cnt,
892255932Salfred			    int align, u32 skip_mask);
893219820Sjeffvoid mlx4_bitmap_free_range(struct mlx4_bitmap *bitmap, u32 obj, int cnt);
894219820Sjeffu32 mlx4_bitmap_avail(struct mlx4_bitmap *bitmap);
895219820Sjeffint mlx4_bitmap_init(struct mlx4_bitmap *bitmap, u32 num, u32 mask,
896219820Sjeff		     u32 reserved_bot, u32 resetrved_top);
897219820Sjeffvoid mlx4_bitmap_cleanup(struct mlx4_bitmap *bitmap);
898219820Sjeff
899219820Sjeffint mlx4_reset(struct mlx4_dev *dev);
900219820Sjeff
901219820Sjeffint mlx4_alloc_eq_table(struct mlx4_dev *dev);
902219820Sjeffvoid mlx4_free_eq_table(struct mlx4_dev *dev);
903219820Sjeff
904219820Sjeffint mlx4_init_pd_table(struct mlx4_dev *dev);
905219820Sjeffint mlx4_init_xrcd_table(struct mlx4_dev *dev);
906219820Sjeffint mlx4_init_uar_table(struct mlx4_dev *dev);
907219820Sjeffint mlx4_init_mr_table(struct mlx4_dev *dev);
908219820Sjeffint mlx4_init_eq_table(struct mlx4_dev *dev);
909219820Sjeffint mlx4_init_cq_table(struct mlx4_dev *dev);
910219820Sjeffint mlx4_init_qp_table(struct mlx4_dev *dev);
911219820Sjeffint mlx4_init_srq_table(struct mlx4_dev *dev);
912219820Sjeffint mlx4_init_mcg_table(struct mlx4_dev *dev);
913219820Sjeff
914219820Sjeffvoid mlx4_cleanup_pd_table(struct mlx4_dev *dev);
915255932Salfredvoid mlx4_cleanup_xrcd_table(struct mlx4_dev *dev);
916219820Sjeffvoid mlx4_cleanup_uar_table(struct mlx4_dev *dev);
917219820Sjeffvoid mlx4_cleanup_mr_table(struct mlx4_dev *dev);
918219820Sjeffvoid mlx4_cleanup_eq_table(struct mlx4_dev *dev);
919219820Sjeffvoid mlx4_cleanup_cq_table(struct mlx4_dev *dev);
920219820Sjeffvoid mlx4_cleanup_qp_table(struct mlx4_dev *dev);
921219820Sjeffvoid mlx4_cleanup_srq_table(struct mlx4_dev *dev);
922219820Sjeffvoid mlx4_cleanup_mcg_table(struct mlx4_dev *dev);
923255932Salfredint __mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn);
924255932Salfredvoid __mlx4_qp_free_icm(struct mlx4_dev *dev, int qpn);
925255932Salfredint __mlx4_cq_alloc_icm(struct mlx4_dev *dev, int *cqn);
926255932Salfredvoid __mlx4_cq_free_icm(struct mlx4_dev *dev, int cqn);
927255932Salfredint __mlx4_srq_alloc_icm(struct mlx4_dev *dev, int *srqn);
928255932Salfredvoid __mlx4_srq_free_icm(struct mlx4_dev *dev, int srqn);
929255932Salfredint __mlx4_mr_reserve(struct mlx4_dev *dev);
930255932Salfredvoid __mlx4_mr_release(struct mlx4_dev *dev, u32 index);
931255932Salfredint __mlx4_mr_alloc_icm(struct mlx4_dev *dev, u32 index);
932255932Salfredvoid __mlx4_mr_free_icm(struct mlx4_dev *dev, u32 index);
933255932Salfredu32 __mlx4_alloc_mtt_range(struct mlx4_dev *dev, int order);
934255932Salfredvoid __mlx4_free_mtt_range(struct mlx4_dev *dev, u32 first_seg, int order);
935219820Sjeff
936255932Salfredint mlx4_WRITE_MTT_wrapper(struct mlx4_dev *dev, int slave,
937255932Salfred			   struct mlx4_vhcr *vhcr,
938255932Salfred			   struct mlx4_cmd_mailbox *inbox,
939255932Salfred			   struct mlx4_cmd_mailbox *outbox,
940255932Salfred			   struct mlx4_cmd_info *cmd);
941255932Salfredint mlx4_SYNC_TPT_wrapper(struct mlx4_dev *dev, int slave,
942255932Salfred			   struct mlx4_vhcr *vhcr,
943255932Salfred			   struct mlx4_cmd_mailbox *inbox,
944255932Salfred			   struct mlx4_cmd_mailbox *outbox,
945255932Salfred			   struct mlx4_cmd_info *cmd);
946255932Salfredint mlx4_SW2HW_MPT_wrapper(struct mlx4_dev *dev, int slave,
947255932Salfred			   struct mlx4_vhcr *vhcr,
948255932Salfred			   struct mlx4_cmd_mailbox *inbox,
949255932Salfred			   struct mlx4_cmd_mailbox *outbox,
950255932Salfred			   struct mlx4_cmd_info *cmd);
951255932Salfredint mlx4_HW2SW_MPT_wrapper(struct mlx4_dev *dev, int slave,
952255932Salfred			   struct mlx4_vhcr *vhcr,
953255932Salfred			   struct mlx4_cmd_mailbox *inbox,
954255932Salfred			   struct mlx4_cmd_mailbox *outbox,
955255932Salfred			   struct mlx4_cmd_info *cmd);
956255932Salfredint mlx4_QUERY_MPT_wrapper(struct mlx4_dev *dev, int slave,
957255932Salfred			   struct mlx4_vhcr *vhcr,
958255932Salfred			   struct mlx4_cmd_mailbox *inbox,
959255932Salfred			   struct mlx4_cmd_mailbox *outbox,
960255932Salfred			   struct mlx4_cmd_info *cmd);
961255932Salfredint mlx4_SW2HW_EQ_wrapper(struct mlx4_dev *dev, int slave,
962255932Salfred			  struct mlx4_vhcr *vhcr,
963255932Salfred			  struct mlx4_cmd_mailbox *inbox,
964255932Salfred			  struct mlx4_cmd_mailbox *outbox,
965255932Salfred			  struct mlx4_cmd_info *cmd);
966255932Salfredint mlx4_DMA_wrapper(struct mlx4_dev *dev, int slave,
967255932Salfred		     struct mlx4_vhcr *vhcr,
968255932Salfred		     struct mlx4_cmd_mailbox *inbox,
969255932Salfred		     struct mlx4_cmd_mailbox *outbox,
970255932Salfred		     struct mlx4_cmd_info *cmd);
971255932Salfredint __mlx4_qp_reserve_range(struct mlx4_dev *dev, int cnt, int align,
972255932Salfred			    int *base, u8 bf_qp);
973255932Salfredvoid __mlx4_qp_release_range(struct mlx4_dev *dev, int base_qpn, int cnt);
974255932Salfredint __mlx4_register_mac(struct mlx4_dev *dev, u8 port, u64 mac);
975255932Salfredvoid __mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, u64 mac);
976255932Salfredint __mlx4_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt,
977255932Salfred		     int start_index, int npages, u64 *page_list);
978255932Salfredint __mlx4_counter_alloc(struct mlx4_dev *dev, u32 *idx);
979255932Salfredvoid __mlx4_counter_free(struct mlx4_dev *dev, u32 idx);
980255932Salfredint __mlx4_xrcd_alloc(struct mlx4_dev *dev, u32 *xrcdn);
981255932Salfredvoid __mlx4_xrcd_free(struct mlx4_dev *dev, u32 xrcdn);
982255932Salfred
983219820Sjeffvoid mlx4_start_catas_poll(struct mlx4_dev *dev);
984219820Sjeffvoid mlx4_stop_catas_poll(struct mlx4_dev *dev);
985219820Sjeffvoid mlx4_catas_init(void);
986219820Sjeffint mlx4_restart_one(struct pci_dev *pdev);
987219820Sjeffint mlx4_register_device(struct mlx4_dev *dev);
988219820Sjeffvoid mlx4_unregister_device(struct mlx4_dev *dev);
989255932Salfredvoid mlx4_dispatch_event(struct mlx4_dev *dev, enum mlx4_dev_event type,
990255932Salfred			 unsigned long param);
991219820Sjeff
992219820Sjeffstruct mlx4_dev_cap;
993219820Sjeffstruct mlx4_init_hca_param;
994219820Sjeff
995219820Sjeffu64 mlx4_make_profile(struct mlx4_dev *dev,
996219820Sjeff		      struct mlx4_profile *request,
997219820Sjeff		      struct mlx4_dev_cap *dev_cap,
998219820Sjeff		      struct mlx4_init_hca_param *init_hca);
999255932Salfredvoid mlx4_master_comm_channel(struct work_struct *work);
1000255932Salfredvoid mlx4_gen_slave_eqe(struct work_struct *work);
1001255932Salfredvoid mlx4_master_handle_slave_flr(struct work_struct *work);
1002219820Sjeff
1003255932Salfredint mlx4_ALLOC_RES_wrapper(struct mlx4_dev *dev, int slave,
1004255932Salfred			   struct mlx4_vhcr *vhcr,
1005255932Salfred			   struct mlx4_cmd_mailbox *inbox,
1006255932Salfred			   struct mlx4_cmd_mailbox *outbox,
1007255932Salfred			   struct mlx4_cmd_info *cmd);
1008255932Salfredint mlx4_FREE_RES_wrapper(struct mlx4_dev *dev, int slave,
1009255932Salfred			  struct mlx4_vhcr *vhcr,
1010255932Salfred			  struct mlx4_cmd_mailbox *inbox,
1011255932Salfred			  struct mlx4_cmd_mailbox *outbox,
1012255932Salfred			  struct mlx4_cmd_info *cmd);
1013255932Salfredint mlx4_MAP_EQ_wrapper(struct mlx4_dev *dev, int slave,
1014255932Salfred			struct mlx4_vhcr *vhcr, struct mlx4_cmd_mailbox *inbox,
1015255932Salfred			struct mlx4_cmd_mailbox *outbox,
1016255932Salfred			struct mlx4_cmd_info *cmd);
1017255932Salfredint mlx4_COMM_INT_wrapper(struct mlx4_dev *dev, int slave,
1018255932Salfred			  struct mlx4_vhcr *vhcr,
1019255932Salfred			  struct mlx4_cmd_mailbox *inbox,
1020255932Salfred			  struct mlx4_cmd_mailbox *outbox,
1021255932Salfred			  struct mlx4_cmd_info *cmd);
1022255932Salfredint mlx4_HW2SW_EQ_wrapper(struct mlx4_dev *dev, int slave,
1023255932Salfred			    struct mlx4_vhcr *vhcr,
1024255932Salfred			    struct mlx4_cmd_mailbox *inbox,
1025255932Salfred			    struct mlx4_cmd_mailbox *outbox,
1026255932Salfred			  struct mlx4_cmd_info *cmd);
1027255932Salfredint mlx4_QUERY_EQ_wrapper(struct mlx4_dev *dev, int slave,
1028255932Salfred			  struct mlx4_vhcr *vhcr,
1029255932Salfred			  struct mlx4_cmd_mailbox *inbox,
1030255932Salfred			  struct mlx4_cmd_mailbox *outbox,
1031255932Salfred			  struct mlx4_cmd_info *cmd);
1032255932Salfredint mlx4_SW2HW_CQ_wrapper(struct mlx4_dev *dev, int slave,
1033255932Salfred			  struct mlx4_vhcr *vhcr,
1034255932Salfred			  struct mlx4_cmd_mailbox *inbox,
1035255932Salfred			  struct mlx4_cmd_mailbox *outbox,
1036255932Salfred			  struct mlx4_cmd_info *cmd);
1037255932Salfredint mlx4_HW2SW_CQ_wrapper(struct mlx4_dev *dev, int slave,
1038255932Salfred			  struct mlx4_vhcr *vhcr,
1039255932Salfred			  struct mlx4_cmd_mailbox *inbox,
1040255932Salfred			  struct mlx4_cmd_mailbox *outbox,
1041255932Salfred			  struct mlx4_cmd_info *cmd);
1042255932Salfredint mlx4_QUERY_CQ_wrapper(struct mlx4_dev *dev, int slave,
1043255932Salfred			  struct mlx4_vhcr *vhcr,
1044255932Salfred			  struct mlx4_cmd_mailbox *inbox,
1045255932Salfred			  struct mlx4_cmd_mailbox *outbox,
1046255932Salfred			  struct mlx4_cmd_info *cmd);
1047255932Salfredint mlx4_MODIFY_CQ_wrapper(struct mlx4_dev *dev, int slave,
1048255932Salfred			  struct mlx4_vhcr *vhcr,
1049255932Salfred			  struct mlx4_cmd_mailbox *inbox,
1050255932Salfred			  struct mlx4_cmd_mailbox *outbox,
1051255932Salfred			   struct mlx4_cmd_info *cmd);
1052255932Salfredint mlx4_SW2HW_SRQ_wrapper(struct mlx4_dev *dev, int slave,
1053255932Salfred			   struct mlx4_vhcr *vhcr,
1054255932Salfred			   struct mlx4_cmd_mailbox *inbox,
1055255932Salfred			   struct mlx4_cmd_mailbox *outbox,
1056255932Salfred			   struct mlx4_cmd_info *cmd);
1057255932Salfredint mlx4_HW2SW_SRQ_wrapper(struct mlx4_dev *dev, int slave,
1058255932Salfred			   struct mlx4_vhcr *vhcr,
1059255932Salfred			   struct mlx4_cmd_mailbox *inbox,
1060255932Salfred			   struct mlx4_cmd_mailbox *outbox,
1061255932Salfred			   struct mlx4_cmd_info *cmd);
1062255932Salfredint mlx4_QUERY_SRQ_wrapper(struct mlx4_dev *dev, int slave,
1063255932Salfred			   struct mlx4_vhcr *vhcr,
1064255932Salfred			   struct mlx4_cmd_mailbox *inbox,
1065255932Salfred			   struct mlx4_cmd_mailbox *outbox,
1066255932Salfred			   struct mlx4_cmd_info *cmd);
1067255932Salfredint mlx4_ARM_SRQ_wrapper(struct mlx4_dev *dev, int slave,
1068255932Salfred			 struct mlx4_vhcr *vhcr,
1069255932Salfred			 struct mlx4_cmd_mailbox *inbox,
1070255932Salfred			 struct mlx4_cmd_mailbox *outbox,
1071255932Salfred			 struct mlx4_cmd_info *cmd);
1072255932Salfredint mlx4_GEN_QP_wrapper(struct mlx4_dev *dev, int slave,
1073255932Salfred			struct mlx4_vhcr *vhcr,
1074255932Salfred			struct mlx4_cmd_mailbox *inbox,
1075255932Salfred			struct mlx4_cmd_mailbox *outbox,
1076255932Salfred			struct mlx4_cmd_info *cmd);
1077255932Salfredint mlx4_RST2INIT_QP_wrapper(struct mlx4_dev *dev, int slave,
1078255932Salfred			     struct mlx4_vhcr *vhcr,
1079255932Salfred			     struct mlx4_cmd_mailbox *inbox,
1080255932Salfred			     struct mlx4_cmd_mailbox *outbox,
1081255932Salfred			     struct mlx4_cmd_info *cmd);
1082255932Salfredint mlx4_INIT2INIT_QP_wrapper(struct mlx4_dev *dev, int slave,
1083255932Salfred			      struct mlx4_vhcr *vhcr,
1084255932Salfred			      struct mlx4_cmd_mailbox *inbox,
1085255932Salfred			      struct mlx4_cmd_mailbox *outbox,
1086255932Salfred			      struct mlx4_cmd_info *cmd);
1087255932Salfredint mlx4_INIT2RTR_QP_wrapper(struct mlx4_dev *dev, int slave,
1088255932Salfred			     struct mlx4_vhcr *vhcr,
1089255932Salfred			     struct mlx4_cmd_mailbox *inbox,
1090255932Salfred			     struct mlx4_cmd_mailbox *outbox,
1091255932Salfred			     struct mlx4_cmd_info *cmd);
1092255932Salfredint mlx4_RTR2RTS_QP_wrapper(struct mlx4_dev *dev, int slave,
1093255932Salfred			    struct mlx4_vhcr *vhcr,
1094255932Salfred			    struct mlx4_cmd_mailbox *inbox,
1095255932Salfred			    struct mlx4_cmd_mailbox *outbox,
1096255932Salfred			    struct mlx4_cmd_info *cmd);
1097255932Salfredint mlx4_RTS2RTS_QP_wrapper(struct mlx4_dev *dev, int slave,
1098255932Salfred			    struct mlx4_vhcr *vhcr,
1099255932Salfred			    struct mlx4_cmd_mailbox *inbox,
1100255932Salfred			    struct mlx4_cmd_mailbox *outbox,
1101255932Salfred			    struct mlx4_cmd_info *cmd);
1102255932Salfredint mlx4_SQERR2RTS_QP_wrapper(struct mlx4_dev *dev, int slave,
1103255932Salfred			      struct mlx4_vhcr *vhcr,
1104255932Salfred			      struct mlx4_cmd_mailbox *inbox,
1105255932Salfred			      struct mlx4_cmd_mailbox *outbox,
1106255932Salfred			      struct mlx4_cmd_info *cmd);
1107255932Salfredint mlx4_2ERR_QP_wrapper(struct mlx4_dev *dev, int slave,
1108255932Salfred			 struct mlx4_vhcr *vhcr,
1109255932Salfred			 struct mlx4_cmd_mailbox *inbox,
1110255932Salfred			 struct mlx4_cmd_mailbox *outbox,
1111255932Salfred			 struct mlx4_cmd_info *cmd);
1112255932Salfredint mlx4_RTS2SQD_QP_wrapper(struct mlx4_dev *dev, int slave,
1113255932Salfred			    struct mlx4_vhcr *vhcr,
1114255932Salfred			    struct mlx4_cmd_mailbox *inbox,
1115255932Salfred			    struct mlx4_cmd_mailbox *outbox,
1116255932Salfred			    struct mlx4_cmd_info *cmd);
1117255932Salfredint mlx4_SQD2SQD_QP_wrapper(struct mlx4_dev *dev, int slave,
1118255932Salfred			    struct mlx4_vhcr *vhcr,
1119255932Salfred			    struct mlx4_cmd_mailbox *inbox,
1120255932Salfred			    struct mlx4_cmd_mailbox *outbox,
1121255932Salfred			    struct mlx4_cmd_info *cmd);
1122255932Salfredint mlx4_SQD2RTS_QP_wrapper(struct mlx4_dev *dev, int slave,
1123255932Salfred			    struct mlx4_vhcr *vhcr,
1124255932Salfred			    struct mlx4_cmd_mailbox *inbox,
1125255932Salfred			    struct mlx4_cmd_mailbox *outbox,
1126255932Salfred			    struct mlx4_cmd_info *cmd);
1127255932Salfredint mlx4_2RST_QP_wrapper(struct mlx4_dev *dev, int slave,
1128255932Salfred			 struct mlx4_vhcr *vhcr,
1129255932Salfred			 struct mlx4_cmd_mailbox *inbox,
1130255932Salfred			 struct mlx4_cmd_mailbox *outbox,
1131255932Salfred			 struct mlx4_cmd_info *cmd);
1132255932Salfredint mlx4_QUERY_QP_wrapper(struct mlx4_dev *dev, int slave,
1133255932Salfred			  struct mlx4_vhcr *vhcr,
1134255932Salfred			  struct mlx4_cmd_mailbox *inbox,
1135255932Salfred			  struct mlx4_cmd_mailbox *outbox,
1136255932Salfred			  struct mlx4_cmd_info *cmd);
1137255932Salfred
1138255932Salfredint mlx4_GEN_EQE(struct mlx4_dev *dev, int slave, struct mlx4_eqe *eqe);
1139255932Salfred
1140219820Sjeffint mlx4_cmd_init(struct mlx4_dev *dev);
1141219820Sjeffvoid mlx4_cmd_cleanup(struct mlx4_dev *dev);
1142255932Salfredint mlx4_multi_func_init(struct mlx4_dev *dev);
1143255932Salfredvoid mlx4_multi_func_cleanup(struct mlx4_dev *dev);
1144219820Sjeffvoid mlx4_cmd_event(struct mlx4_dev *dev, u16 token, u8 status, u64 out_param);
1145219820Sjeffint mlx4_cmd_use_events(struct mlx4_dev *dev);
1146219820Sjeffvoid mlx4_cmd_use_polling(struct mlx4_dev *dev);
1147219820Sjeff
1148255932Salfredint mlx4_comm_cmd(struct mlx4_dev *dev, u8 cmd, u16 param,
1149255932Salfred		  unsigned long timeout);
1150255932Salfred
1151219820Sjeffvoid mlx4_cq_completion(struct mlx4_dev *dev, u32 cqn);
1152219820Sjeffvoid mlx4_cq_event(struct mlx4_dev *dev, u32 cqn, int event_type);
1153219820Sjeff
1154219820Sjeffvoid mlx4_qp_event(struct mlx4_dev *dev, u32 qpn, int event_type);
1155219820Sjeff
1156219820Sjeffvoid mlx4_srq_event(struct mlx4_dev *dev, u32 srqn, int event_type);
1157219820Sjeff
1158219820Sjeffvoid mlx4_handle_catas_err(struct mlx4_dev *dev);
1159219820Sjeff
1160255932Salfredint mlx4_SENSE_PORT(struct mlx4_dev *dev, int port,
1161255932Salfred		    enum mlx4_port_type *type);
1162219820Sjeffvoid mlx4_do_sense_ports(struct mlx4_dev *dev,
1163219820Sjeff			 enum mlx4_port_type *stype,
1164219820Sjeff			 enum mlx4_port_type *defaults);
1165219820Sjeffvoid mlx4_start_sense(struct mlx4_dev *dev);
1166219820Sjeffvoid mlx4_stop_sense(struct mlx4_dev *dev);
1167219820Sjeffvoid mlx4_sense_cleanup(struct mlx4_dev *dev);
1168255932Salfredint  mlx4_sense_init(struct mlx4_dev *dev);
1169219820Sjeffint mlx4_check_port_params(struct mlx4_dev *dev,
1170219820Sjeff			   enum mlx4_port_type *port_type);
1171219820Sjeffint mlx4_change_port_types(struct mlx4_dev *dev,
1172219820Sjeff			   enum mlx4_port_type *port_types);
1173219820Sjeff
1174219820Sjeffvoid mlx4_init_mac_table(struct mlx4_dev *dev, struct mlx4_mac_table *table);
1175219820Sjeffvoid mlx4_init_vlan_table(struct mlx4_dev *dev, struct mlx4_vlan_table *table);
1176255932Salfredvoid __mlx4_unregister_vlan(struct mlx4_dev *dev, u8 port, u16 vlan);
1177255932Salfredint __mlx4_register_vlan(struct mlx4_dev *dev, u8 port, u16 vlan, int *index);
1178219820Sjeff
1179255932Salfredint mlx4_SET_PORT(struct mlx4_dev *dev, u8 port, int pkey_tbl_sz);
1180255932Salfred/* resource tracker functions*/
1181255932Salfredint mlx4_get_slave_from_resource_id(struct mlx4_dev *dev,
1182255932Salfred				    enum mlx4_resource resource_type,
1183255932Salfred				    u64 resource_id, int *slave);
1184255932Salfredvoid mlx4_delete_all_resources_for_slave(struct mlx4_dev *dev, int slave_id);
1185255932Salfredint mlx4_init_resource_tracker(struct mlx4_dev *dev);
1186255932Salfred
1187255932Salfredvoid mlx4_free_resource_tracker(struct mlx4_dev *dev,
1188255932Salfred				enum mlx4_res_tracker_free_type type);
1189255932Salfred
1190255932Salfredint mlx4_QUERY_FW_wrapper(struct mlx4_dev *dev, int slave,
1191255932Salfred			  struct mlx4_vhcr *vhcr,
1192255932Salfred			  struct mlx4_cmd_mailbox *inbox,
1193255932Salfred			  struct mlx4_cmd_mailbox *outbox,
1194255932Salfred			  struct mlx4_cmd_info *cmd);
1195255932Salfredint mlx4_SET_PORT_wrapper(struct mlx4_dev *dev, int slave,
1196255932Salfred			  struct mlx4_vhcr *vhcr,
1197255932Salfred			  struct mlx4_cmd_mailbox *inbox,
1198255932Salfred			  struct mlx4_cmd_mailbox *outbox,
1199255932Salfred			  struct mlx4_cmd_info *cmd);
1200255932Salfredint mlx4_INIT_PORT_wrapper(struct mlx4_dev *dev, int slave,
1201255932Salfred			   struct mlx4_vhcr *vhcr,
1202255932Salfred			   struct mlx4_cmd_mailbox *inbox,
1203255932Salfred			   struct mlx4_cmd_mailbox *outbox,
1204255932Salfred			   struct mlx4_cmd_info *cmd);
1205255932Salfredint mlx4_CLOSE_PORT_wrapper(struct mlx4_dev *dev, int slave,
1206255932Salfred			    struct mlx4_vhcr *vhcr,
1207255932Salfred			    struct mlx4_cmd_mailbox *inbox,
1208255932Salfred			    struct mlx4_cmd_mailbox *outbox,
1209255932Salfred			    struct mlx4_cmd_info *cmd);
1210255932Salfredint mlx4_QUERY_DEV_CAP_wrapper(struct mlx4_dev *dev, int slave,
1211255932Salfred			       struct mlx4_vhcr *vhcr,
1212255932Salfred			       struct mlx4_cmd_mailbox *inbox,
1213255932Salfred			       struct mlx4_cmd_mailbox *outbox,
1214255932Salfred			       struct mlx4_cmd_info *cmd);
1215255932Salfredint mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave,
1216255932Salfred			    struct mlx4_vhcr *vhcr,
1217255932Salfred			    struct mlx4_cmd_mailbox *inbox,
1218255932Salfred			    struct mlx4_cmd_mailbox *outbox,
1219255932Salfred			    struct mlx4_cmd_info *cmd);
1220219820Sjeffint mlx4_get_port_ib_caps(struct mlx4_dev *dev, u8 port, __be32 *caps);
1221219820Sjeff
1222255932Salfredint mlx4_get_slave_pkey_gid_tbl_len(struct mlx4_dev *dev, u8 port,
1223255932Salfred				    int *gid_tbl_len, int *pkey_tbl_len);
1224255932Salfred
1225255932Salfredint mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave,
1226255932Salfred			   struct mlx4_vhcr *vhcr,
1227255932Salfred			   struct mlx4_cmd_mailbox *inbox,
1228255932Salfred			   struct mlx4_cmd_mailbox *outbox,
1229255932Salfred			   struct mlx4_cmd_info *cmd);
1230255932Salfred
1231255932Salfredint mlx4_PROMISC_wrapper(struct mlx4_dev *dev, int slave,
1232255932Salfred			 struct mlx4_vhcr *vhcr,
1233255932Salfred			 struct mlx4_cmd_mailbox *inbox,
1234255932Salfred			 struct mlx4_cmd_mailbox *outbox,
1235255932Salfred			 struct mlx4_cmd_info *cmd);
1236255932Salfredint mlx4_qp_detach_common(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16],
1237255932Salfred			  enum mlx4_protocol prot, enum mlx4_steer_type steer);
1238255932Salfredint mlx4_qp_attach_common(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16],
1239255932Salfred			  int block_mcast_loopback, enum mlx4_protocol prot,
1240255932Salfred			  enum mlx4_steer_type steer);
1241255932Salfredint mlx4_SET_MCAST_FLTR_wrapper(struct mlx4_dev *dev, int slave,
1242255932Salfred				struct mlx4_vhcr *vhcr,
1243255932Salfred				struct mlx4_cmd_mailbox *inbox,
1244255932Salfred				struct mlx4_cmd_mailbox *outbox,
1245255932Salfred				struct mlx4_cmd_info *cmd);
1246255932Salfredint mlx4_SET_VLAN_FLTR_wrapper(struct mlx4_dev *dev, int slave,
1247255932Salfred			       struct mlx4_vhcr *vhcr,
1248255932Salfred			       struct mlx4_cmd_mailbox *inbox,
1249255932Salfred			       struct mlx4_cmd_mailbox *outbox,
1250255932Salfred			       struct mlx4_cmd_info *cmd);
1251255932Salfredint mlx4_common_set_vlan_fltr(struct mlx4_dev *dev, int function,
1252255932Salfred				     int port, void *buf);
1253255932Salfredint mlx4_common_dump_eth_stats(struct mlx4_dev *dev, int slave, u32 in_mod,
1254255932Salfred				struct mlx4_cmd_mailbox *outbox);
1255255932Salfredint mlx4_DUMP_ETH_STATS_wrapper(struct mlx4_dev *dev, int slave,
1256255932Salfred				   struct mlx4_vhcr *vhcr,
1257255932Salfred				   struct mlx4_cmd_mailbox *inbox,
1258255932Salfred				   struct mlx4_cmd_mailbox *outbox,
1259255932Salfred				struct mlx4_cmd_info *cmd);
1260255932Salfredint mlx4_PKEY_TABLE_wrapper(struct mlx4_dev *dev, int slave,
1261255932Salfred			    struct mlx4_vhcr *vhcr,
1262255932Salfred			    struct mlx4_cmd_mailbox *inbox,
1263255932Salfred			    struct mlx4_cmd_mailbox *outbox,
1264255932Salfred			    struct mlx4_cmd_info *cmd);
1265255932Salfredint mlx4_QUERY_IF_STAT_wrapper(struct mlx4_dev *dev, int slave,
1266255932Salfred			       struct mlx4_vhcr *vhcr,
1267255932Salfred			       struct mlx4_cmd_mailbox *inbox,
1268255932Salfred			       struct mlx4_cmd_mailbox *outbox,
1269255932Salfred			       struct mlx4_cmd_info *cmd);
1270255932Salfredint mlx4_QP_FLOW_STEERING_ATTACH_wrapper(struct mlx4_dev *dev, int slave,
1271255932Salfred					 struct mlx4_vhcr *vhcr,
1272255932Salfred					 struct mlx4_cmd_mailbox *inbox,
1273255932Salfred					 struct mlx4_cmd_mailbox *outbox,
1274255932Salfred					 struct mlx4_cmd_info *cmd);
1275255932Salfredint mlx4_QP_FLOW_STEERING_DETACH_wrapper(struct mlx4_dev *dev, int slave,
1276255932Salfred					 struct mlx4_vhcr *vhcr,
1277255932Salfred					 struct mlx4_cmd_mailbox *inbox,
1278255932Salfred					 struct mlx4_cmd_mailbox *outbox,
1279255932Salfred					 struct mlx4_cmd_info *cmd);
1280255932Salfred
1281255932Salfredint mlx4_get_mgm_entry_size(struct mlx4_dev *dev);
1282255932Salfredint mlx4_get_qp_per_mgm(struct mlx4_dev *dev);
1283255932Salfred
1284255932Salfredstatic inline void set_param_l(u64 *arg, u32 val)
1285255932Salfred{
1286255932Salfred	*arg = (*arg & 0xffffffff00000000ULL) | (u64) val;
1287255932Salfred}
1288255932Salfred
1289255932Salfredstatic inline void set_param_h(u64 *arg, u32 val)
1290255932Salfred{
1291255932Salfred	*arg = (*arg & 0xffffffff) | ((u64) val << 32);
1292255932Salfred}
1293255932Salfred
1294255932Salfredstatic inline u32 get_param_l(u64 *arg)
1295255932Salfred{
1296255932Salfred	return (u32) (*arg & 0xffffffff);
1297255932Salfred}
1298255932Salfred
1299255932Salfredstatic inline u32 get_param_h(u64 *arg)
1300255932Salfred{
1301255932Salfred	return (u32)(*arg >> 32);
1302255932Salfred}
1303255932Salfred
1304255932Salfredstatic inline spinlock_t *mlx4_tlock(struct mlx4_dev *dev)
1305255932Salfred{
1306255932Salfred	return &mlx4_priv(dev)->mfunc.master.res_tracker.lock;
1307255932Salfred}
1308255932Salfred
1309255932Salfred#define NOT_MASKED_PD_BITS 17
1310255932Salfred
1311255932Salfredvoid sys_tune_init(void);
1312255932Salfredvoid sys_tune_fini(void);
1313255932Salfred
1314255932Salfredvoid mlx4_init_quotas(struct mlx4_dev *dev);
1315255932Salfred
1316255932Salfredint mlx4_get_slave_num_gids(struct mlx4_dev *dev, int slave);
1317255932Salfredint mlx4_get_base_gid_ix(struct mlx4_dev *dev, int slave);
1318255932Salfred
1319219820Sjeff#endif /* MLX4_H */
1320