1225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier/*
2225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * Copyright (c) 2004, 2005 Topspin Communications.  All rights reserved.
3225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
4225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * Copyright (c) 2005, 2006, 2007 Cisco Systems.  All rights reserved.
551a379d0c8f7a6db7c9e3c9c770d90a6d2d1ef9bJack Morgenstein * Copyright (c) 2005, 2006, 2007, 2008 Mellanox Technologies. All rights reserved.
6225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * Copyright (c) 2004 Voltaire, Inc. All rights reserved.
7225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *
8225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * This software is available to you under a choice of one of two
9225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * licenses.  You may choose to be licensed under the terms of the GNU
10225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * General Public License (GPL) Version 2, available from the file
11225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * COPYING in the main directory of this source tree, or the
12225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * OpenIB.org BSD license below:
13225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *
14225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *     Redistribution and use in source and binary forms, with or
15225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *     without modification, are permitted provided that the following
16225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *     conditions are met:
17225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *
18225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *      - Redistributions of source code must retain the above
19225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *        copyright notice, this list of conditions and the following
20225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *        disclaimer.
21225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *
22225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *      - Redistributions in binary form must reproduce the above
23225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *        copyright notice, this list of conditions and the following
24225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *        disclaimer in the documentation and/or other materials
25225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *        provided with the distribution.
26225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *
27225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
28225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
29225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
30225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
31225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
32225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
33225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
34225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * SOFTWARE.
35225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier */
36225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
37225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#ifndef MLX4_H
38225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#define MLX4_H
39225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
40525f5f44c487201c91a11904516ee56dea93644eMichael S. Tsirkin#include <linux/mutex.h>
41225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#include <linux/radix-tree.h>
42ee49bd9397cd2b8fe7a1962505d81c1d0a1366fcJack Morgenstein#include <linux/timer.h>
433142788b7967ccfd2f1813ee9e11aeb1e1cf7de2Thomas Gleixner#include <linux/semaphore.h>
4427bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilin#include <linux/workqueue.h>
45225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
46225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#include <linux/mlx4/device.h>
4737608eea86a358ac6a18df0af55d4f77d08a1f30Roland Dreier#include <linux/mlx4/driver.h>
48225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#include <linux/mlx4/doorbell.h>
49623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein#include <linux/mlx4/cmd.h>
50225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
51225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#define DRV_NAME	"mlx4_core"
52ab9c17a009ee8eb8c667f22dc0be0709effceab9Jack Morgenstein#define PFX		DRV_NAME ": "
537d4b6bcce071fdff4426e695fd0a73786b7d93d5Yevgeny Petrilin#define DRV_VERSION	"1.1"
547d4b6bcce071fdff4426e695fd0a73786b7d93d5Yevgeny Petrilin#define DRV_RELDATE	"Dec, 2011"
55225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
56225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierenum {
57225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	MLX4_HCR_BASE		= 0x80680,
58225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	MLX4_HCR_SIZE		= 0x0001c,
59623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	MLX4_CLR_INT_SIZE	= 0x00008,
60623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	MLX4_SLAVE_COMM_BASE	= 0x0,
61623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	MLX4_COMM_PAGESIZE	= 0x1000
62225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
63225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
64225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierenum {
650ec2c0f86d31ab36547307f133b0016006bdc6b5Eugenia Emantayev	MLX4_MAX_MGM_ENTRY_SIZE = 0x1000,
660ec2c0f86d31ab36547307f133b0016006bdc6b5Eugenia Emantayev	MLX4_MAX_QP_PER_MGM	= 4 * (MLX4_MAX_MGM_ENTRY_SIZE / 16 - 2),
670ec2c0f86d31ab36547307f133b0016006bdc6b5Eugenia Emantayev	MLX4_MTT_ENTRY_PER_SEG	= 8,
68225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
69225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
70225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierenum {
71225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	MLX4_NUM_PDS		= 1 << 15
72225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
73225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
74225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierenum {
75225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	MLX4_CMPT_TYPE_QP	= 0,
76225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	MLX4_CMPT_TYPE_SRQ	= 1,
77225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	MLX4_CMPT_TYPE_CQ	= 2,
78225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	MLX4_CMPT_TYPE_EQ	= 3,
79225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	MLX4_CMPT_NUM_TYPE
80225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
81225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
82225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierenum {
83225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	MLX4_CMPT_SHIFT		= 24,
84225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	MLX4_NUM_CMPTS		= MLX4_CMPT_NUM_TYPE << MLX4_CMPT_SHIFT
85225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
86225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
87623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinenum mlx4_mr_state {
88623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	MLX4_MR_DISABLED = 0,
89623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	MLX4_MR_EN_HW,
90623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	MLX4_MR_EN_SW
91623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein};
92623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
93623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein#define MLX4_COMM_TIME		10000
94623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinenum {
95623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	MLX4_COMM_CMD_RESET,
96623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	MLX4_COMM_CMD_VHCR0,
97623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	MLX4_COMM_CMD_VHCR1,
98623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	MLX4_COMM_CMD_VHCR2,
99623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	MLX4_COMM_CMD_VHCR_EN,
100623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	MLX4_COMM_CMD_VHCR_POST,
101623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	MLX4_COMM_CMD_FLR = 254
102623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein};
103623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
104623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein/*The flag indicates that the slave should delay the RESET cmd*/
105623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein#define MLX4_DELAY_RESET_SLAVE 0xbbbbbbb
106623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein/*indicates how many retries will be done if we are in the middle of FLR*/
107623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein#define NUM_OF_RESET_RETRIES	10
108623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein#define SLEEP_TIME_IN_RESET	(2 * 1000)
109623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinenum mlx4_resource {
110623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	RES_QP,
111623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	RES_CQ,
112623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	RES_SRQ,
113623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	RES_XRCD,
114623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	RES_MPT,
115623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	RES_MTT,
116623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	RES_MAC,
117623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	RES_VLAN,
118623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	RES_EQ,
119623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	RES_COUNTER,
120623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	MLX4_NUM_OF_RESOURCE_TYPE
121623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein};
122623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
123623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinenum mlx4_alloc_mode {
124623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	RES_OP_RESERVE,
125623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	RES_OP_RESERVE_AND_MAP,
126623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	RES_OP_MAP_ICM,
127623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein};
128623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
129623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
130623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein/*
131623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein *Virtual HCR structures.
132623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein * mlx4_vhcr is the sw representation, in machine endianess
133623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein *
134623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein * mlx4_vhcr_cmd is the formalized structure, the one that is passed
135623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein * to FW to go through communication channel.
136623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein * It is big endian, and has the same structure as the physical HCR
137623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein * used by command interface
138623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein */
139623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinstruct mlx4_vhcr {
140623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u64	in_param;
141623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u64	out_param;
142623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u32	in_modifier;
143623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u32	errno;
144623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u16	op;
145623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u16	token;
146623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8	op_modifier;
147623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8	e_bit;
148623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein};
149623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
150623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinstruct mlx4_vhcr_cmd {
151623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	__be64 in_param;
152623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	__be32 in_modifier;
153623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	__be64 out_param;
154623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	__be16 token;
155623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u16 reserved;
156623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8 status;
157623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8 flags;
158623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	__be16 opcode;
159623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein};
160623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
161623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinstruct mlx4_cmd_info {
162623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u16 opcode;
163623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	bool has_inbox;
164623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	bool has_outbox;
165623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	bool out_is_imm;
166623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	bool encode_slave_id;
167623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	int (*verify)(struct mlx4_dev *dev, int slave, struct mlx4_vhcr *vhcr,
168623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		      struct mlx4_cmd_mailbox *inbox);
169623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	int (*wrapper)(struct mlx4_dev *dev, int slave, struct mlx4_vhcr *vhcr,
170623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		       struct mlx4_cmd_mailbox *inbox,
171623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		       struct mlx4_cmd_mailbox *outbox,
172623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		       struct mlx4_cmd_info *cmd);
173623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein};
174623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
175225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#ifdef CONFIG_MLX4_DEBUG
176225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierextern int mlx4_debug_level;
1777b0f5df4c88bac46fe749d36d905fc7ad0296587Roland Dreier#else /* CONFIG_MLX4_DEBUG */
1787b0f5df4c88bac46fe749d36d905fc7ad0296587Roland Dreier#define mlx4_debug_level	(0)
1797b0f5df4c88bac46fe749d36d905fc7ad0296587Roland Dreier#endif /* CONFIG_MLX4_DEBUG */
180225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
181225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#define mlx4_dbg(mdev, format, arg...)					\
1820a645e809759a4b9c876d3e9ca6c139784a97a38Joe Perchesdo {									\
1830a645e809759a4b9c876d3e9ca6c139784a97a38Joe Perches	if (mlx4_debug_level)						\
1840a645e809759a4b9c876d3e9ca6c139784a97a38Joe Perches		dev_printk(KERN_DEBUG, &mdev->pdev->dev, format, ##arg); \
1850a645e809759a4b9c876d3e9ca6c139784a97a38Joe Perches} while (0)
186225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
187225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#define mlx4_err(mdev, format, arg...) \
1880a645e809759a4b9c876d3e9ca6c139784a97a38Joe Perches	dev_err(&mdev->pdev->dev, format, ##arg)
189225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#define mlx4_info(mdev, format, arg...) \
1900a645e809759a4b9c876d3e9ca6c139784a97a38Joe Perches	dev_info(&mdev->pdev->dev, format, ##arg)
191225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#define mlx4_warn(mdev, format, arg...) \
1920a645e809759a4b9c876d3e9ca6c139784a97a38Joe Perches	dev_warn(&mdev->pdev->dev, format, ##arg)
193225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
1940ec2c0f86d31ab36547307f133b0016006bdc6b5Eugenia Emantayevextern int mlx4_log_num_mgm_entry_size;
1952b8fb2867ca2736a715a88067fd0ec2904777cbeMarcel Apfelbaumextern int log_mtts_per_seg;
1960ec2c0f86d31ab36547307f133b0016006bdc6b5Eugenia Emantayev
197623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein#define MLX4_MAX_NUM_SLAVES	(MLX4_MAX_NUM_PF + MLX4_MAX_NUM_VF)
198623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein#define ALL_SLAVES 0xff
199623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
200225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_bitmap {
201225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u32			last;
202225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u32			top;
203225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u32			max;
20493fc9e1bb6507dde945c2eab68c93e1066ac3691Yevgeny Petrilin	u32                     reserved_top;
205225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u32			mask;
20642d1e017e2f040c3e3d62b6cfa3a26351a865d04Eli Cohen	u32			avail;
207225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	spinlock_t		lock;
208225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	unsigned long	       *table;
209225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
210225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
211225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_buddy {
212225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	unsigned long	      **bits;
213e4044cfc493338cd09870bd45dc646336bb66e9fRoland Dreier	unsigned int	       *num_free;
214225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			max_order;
215225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	spinlock_t		lock;
216225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
217225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
218225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_icm;
219225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
220225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_icm_table {
221225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u64			virt;
222225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			num_icm;
223225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			num_obj;
224225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			obj_size;
225225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			lowmem;
2265b0bf5e25efea77103b0ac7c8057cd56c778ef41Jack Morgenstein	int			coherent;
227225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mutex		mutex;
228225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_icm	      **icm;
229225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
230225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
231c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen/*
232c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen * Must be packed because mtt_seg is 64 bits but only aligned to 32 bits.
233c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen */
234c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenstruct mlx4_mpt_entry {
235c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32 flags;
236c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32 qpn;
237c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32 key;
238c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32 pd_flags;
239c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be64 start;
240c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be64 length;
241c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32 lkey;
242c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32 win_cnt;
243c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8	reserved1[3];
244c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8	mtt_rep;
2452b8fb2867ca2736a715a88067fd0ec2904777cbeMarcel Apfelbaum	__be64 mtt_addr;
246c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32 mtt_sz;
247c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32 entity_size;
248c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32 first_byte_offset;
249c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen} __packed;
250c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen
251c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen/*
252c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen * Must be packed because start is 64 bits but only aligned to 32 bits.
253c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen */
254c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenstruct mlx4_eq_context {
255c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32			flags;
256c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u16			reserved1[3];
257c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be16			page_offset;
258c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			log_eq_size;
259c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			reserved2[4];
260c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			eq_period;
261c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			reserved3;
262c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			eq_max_count;
263c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			reserved4[3];
264c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			intr;
265c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			log_page_size;
266c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			reserved5[2];
267c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			mtt_base_addr_h;
268c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32			mtt_base_addr_l;
269c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u32			reserved6[2];
270c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32			consumer_index;
271c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32			producer_index;
272c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u32			reserved7[4];
273c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen};
274c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen
275c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenstruct mlx4_cq_context {
276c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32			flags;
277c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u16			reserved1[3];
278c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be16			page_offset;
279c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32			logsize_usrpage;
280c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be16			cq_period;
281c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be16			cq_max_count;
282c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			reserved2[3];
283c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			comp_eqn;
284c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			log_page_size;
285c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			reserved3[2];
286c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			mtt_base_addr_h;
287c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32			mtt_base_addr_l;
288c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32			last_notified_index;
289c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32			solicit_producer_index;
290c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32			consumer_index;
291c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32			producer_index;
292c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u32			reserved4[2];
293c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be64			db_rec_addr;
294c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen};
295c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen
296c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenstruct mlx4_srq_context {
297c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32			state_logsize_srqn;
298c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			logstride;
299c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			reserved1;
300c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be16			xrcd;
301c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32			pg_offset_cqn;
302c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u32			reserved2;
303c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			log_page_size;
304c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			reserved3[2];
305c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u8			mtt_base_addr_h;
306c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32			mtt_base_addr_l;
307c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be32			pd;
308c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be16			limit_watermark;
309c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be16			wqe_cnt;
310c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u16			reserved4;
311c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be16			wqe_counter;
312c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	u32			reserved5;
313c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	__be64			db_rec_addr;
314c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen};
315c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen
316623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinstruct mlx4_eqe {
317623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8			reserved1;
318623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8			type;
319623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8			reserved2;
320623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8			subtype;
321623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	union {
322623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		u32		raw[6];
323623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		struct {
324623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			__be32	cqn;
325623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		} __packed comp;
326623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		struct {
327623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			u16	reserved1;
328623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			__be16	token;
329623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			u32	reserved2;
330623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			u8	reserved3[3];
331623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			u8	status;
332623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			__be64	out_param;
333623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		} __packed cmd;
334623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		struct {
335623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			__be32	qpn;
336623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		} __packed qp;
337623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		struct {
338623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			__be32	srqn;
339623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		} __packed srq;
340623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		struct {
341623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			__be32	cqn;
342623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			u32	reserved1;
343623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			u8	reserved2[3];
344623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			u8	syndrome;
345623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		} __packed cq_err;
346623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		struct {
347623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			u32	reserved1[2];
348623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			__be32	port;
349623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		} __packed port_change;
350623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		struct {
351623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			#define COMM_CHANNEL_BIT_ARRAY_SIZE	4
352623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			u32 reserved;
353623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			u32 bit_vec[COMM_CHANNEL_BIT_ARRAY_SIZE];
354623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		} __packed comm_channel_arm;
355623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		struct {
356623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			u8	port;
357623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			u8	reserved[3];
358623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			__be64	mac;
359623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		} __packed mac_update;
360623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		struct {
361623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			u8	port;
362623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		} __packed sw_event;
363623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		struct {
364623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			__be32	slave_id;
365623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		} __packed flr_event;
3665984be90046fa978d94a5ec08bbf8f760cff2b30Jack Morgenstein		struct {
3675984be90046fa978d94a5ec08bbf8f760cff2b30Jack Morgenstein			__be16  current_temperature;
3685984be90046fa978d94a5ec08bbf8f760cff2b30Jack Morgenstein			__be16  warning_threshold;
3695984be90046fa978d94a5ec08bbf8f760cff2b30Jack Morgenstein		} __packed warming;
370623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	}			event;
371623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8			slave_id;
372623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8			reserved3[2];
373623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8			owner;
374623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein} __packed;
375623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
376225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_eq {
377225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_dev	       *dev;
378225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	void __iomem	       *doorbell;
379225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			eqn;
380225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u32			cons_index;
381225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u16			irq;
382225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u16			have_irq;
383225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			nent;
384225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_buf_list   *page_list;
385225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_mtt		mtt;
386225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
387225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
388623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinstruct mlx4_slave_eqe {
389623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8 type;
390623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8 port;
391623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u32 param;
392623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein};
393623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
394623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinstruct mlx4_slave_event_eq_info {
395803143fbda719106017309d551d082e4b4e7c8c3Marcel Apfelbaum	int eqn;
396623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u16 token;
397623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein};
398623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
399225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_profile {
400225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			num_qp;
401225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			rdmarc_per_qp;
402225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			num_srq;
403225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			num_cq;
404225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			num_mcg;
405225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			num_mpt;
406db5a7a65c05867cb6ff5cb6d556a0edfce631d2dRoland Dreier	unsigned		num_mtt;
407225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
408225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
409225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_fw {
410225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u64			clr_int_base;
411225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u64			catas_offset;
412623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u64			comm_base;
413225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_icm	       *fw_icm;
414225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_icm	       *aux_icm;
415225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u32			catas_size;
416225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u16			fw_pages;
417225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u8			clr_int_bar;
418225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u8			catas_bar;
419623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8			comm_bar;
420623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein};
421623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
422623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinstruct mlx4_comm {
423623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u32			slave_write;
424623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u32			slave_read;
425225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
426225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
427ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayevenum {
428ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	MLX4_MCAST_CONFIG       = 0,
429ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	MLX4_MCAST_DISABLE      = 1,
430ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	MLX4_MCAST_ENABLE       = 2,
431ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev};
432ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev
433623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein#define VLAN_FLTR_SIZE	128
434623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
435623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinstruct mlx4_vlan_fltr {
436623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	__be32 entry[VLAN_FLTR_SIZE];
437623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein};
438623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
439ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayevstruct mlx4_mcast_entry {
440ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	struct list_head list;
441ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u64 addr;
442ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev};
443ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev
444b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilinstruct mlx4_promisc_qp {
445b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilin	struct list_head list;
446b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilin	u32 qpn;
447b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilin};
448b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilin
449b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilinstruct mlx4_steer_index {
450b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilin	struct list_head list;
451b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilin	unsigned int index;
452b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilin	struct list_head duplicates;
453b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilin};
454b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilin
455803143fbda719106017309d551d082e4b4e7c8c3Marcel Apfelbaum#define MLX4_EVENT_TYPES_NUM 64
456803143fbda719106017309d551d082e4b4e7c8c3Marcel Apfelbaum
457623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinstruct mlx4_slave_state {
458623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8 comm_toggle;
459623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8 last_cmd;
460623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8 init_port_mask;
461623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	bool active;
462623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8 function;
463623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	dma_addr_t vhcr_dma;
464623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u16 mtu[MLX4_MAX_PORTS + 1];
465623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	__be32 ib_cap_mask[MLX4_MAX_PORTS + 1];
466623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct mlx4_slave_eqe eq[MLX4_MFUNC_MAX_EQES];
467623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct list_head mcast_filters[MLX4_MAX_PORTS + 1];
468623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct mlx4_vlan_fltr *vlan_filter[MLX4_MAX_PORTS + 1];
469803143fbda719106017309d551d082e4b4e7c8c3Marcel Apfelbaum	/* event type to eq number lookup */
470803143fbda719106017309d551d082e4b4e7c8c3Marcel Apfelbaum	struct mlx4_slave_event_eq_info event_eq[MLX4_EVENT_TYPES_NUM];
471623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u16 eq_pi;
472623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u16 eq_ci;
473623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	spinlock_t lock;
474623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	/*initialized via the kzalloc*/
475623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8 is_slave_going_down;
476623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u32 cookie;
477623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein};
478623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
479623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinstruct slave_list {
480623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct mutex mutex;
481623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct list_head res_list[MLX4_NUM_OF_RESOURCE_TYPE];
482623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein};
483623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
484623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinstruct mlx4_resource_tracker {
485623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	spinlock_t lock;
486623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	/* tree for each resources */
487623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct radix_tree_root res_tree[MLX4_NUM_OF_RESOURCE_TYPE];
488623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	/* num_of_slave's lists, one per slave */
489623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct slave_list *slave_list;
490623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein};
491623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
492623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein#define SLAVE_EVENT_EQ_SIZE	128
493623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinstruct mlx4_slave_event_eq {
494623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u32 eqn;
495623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u32 cons;
496623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u32 prod;
497623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct mlx4_eqe event_eqe[SLAVE_EVENT_EQ_SIZE];
498623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein};
499623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
500623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinstruct mlx4_master_qp0_state {
501623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	int proxy_qp0_active;
502623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	int qp0_active;
503623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	int port_active;
504623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein};
505623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
506623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinstruct mlx4_mfunc_master_ctx {
507623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct mlx4_slave_state *slave_state;
508623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct mlx4_master_qp0_state qp0_state[MLX4_MAX_PORTS + 1];
509623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	int			init_port_ref[MLX4_MAX_PORTS + 1];
510623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u16			max_mtu[MLX4_MAX_PORTS + 1];
511623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	int			disable_mcast_ref[MLX4_MAX_PORTS + 1];
512623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct mlx4_resource_tracker res_tracker;
513623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct workqueue_struct *comm_wq;
514623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct work_struct	comm_work;
515623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct work_struct	slave_event_work;
516623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct work_struct	slave_flr_event_work;
517623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	spinlock_t		slave_state_lock;
518f5311ac109b21c9b47118655a5b6d887bcc686f8Jack Morgenstein	__be32			comm_arm_bit_vector[4];
519623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct mlx4_eqe		cmd_eqe;
520623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct mlx4_slave_event_eq slave_eq;
521623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct mutex		gen_eqe_mutex[MLX4_MFUNC_MAX];
522623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein};
523623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
524623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinstruct mlx4_mfunc {
525623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct mlx4_comm __iomem       *comm;
526623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct mlx4_vhcr_cmd	       *vhcr;
527623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	dma_addr_t			vhcr_dma;
528623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
529623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct mlx4_mfunc_master_ctx	master;
530623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein};
531623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
532225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_cmd {
533225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct pci_pool	       *pool;
534225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	void __iomem	       *hcr;
535225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mutex		hcr_mutex;
536225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct semaphore	poll_sem;
537225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct semaphore	event_sem;
538623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct semaphore	slave_sem;
539225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			max_cmds;
540225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	spinlock_t		context_lock;
541225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			free_head;
542225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_cmd_context *context;
543225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u16			token_mask;
544225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u8			use_events;
545225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u8			toggle;
546623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	u8			comm_toggle;
547225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
548225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
549225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_uar_table {
550225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_bitmap	bitmap;
551225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
552225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
553225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_mr_table {
554225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_bitmap	mpt_bitmap;
555225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_buddy	mtt_buddy;
556225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u64			mtt_base;
557225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u64			mpt_base;
558225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_icm_table	mtt_table;
559225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_icm_table	dmpt_table;
560225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
561225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
562225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_cq_table {
563225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_bitmap	bitmap;
564225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	spinlock_t		lock;
565225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct radix_tree_root	tree;
566225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_icm_table	table;
567225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_icm_table	cmpt_table;
568225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
569225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
570225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_eq_table {
571225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_bitmap	bitmap;
572b8dd786f9417e5885929bfe33a235c76a9c1c569Yevgeny Petrilin	char		       *irq_names;
573225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	void __iomem	       *clr_int;
574b8dd786f9417e5885929bfe33a235c76a9c1c569Yevgeny Petrilin	void __iomem	      **uar_map;
575225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u32			clr_mask;
576b8dd786f9417e5885929bfe33a235c76a9c1c569Yevgeny Petrilin	struct mlx4_eq	       *eq;
577fa0681d2129732027355d6b7083dd8932b9b799dRoland Dreier	struct mlx4_icm_table	table;
578225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_icm_table	cmpt_table;
579225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			have_irq;
580225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u8			inta_pin;
581225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
582225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
583225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_srq_table {
584225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_bitmap	bitmap;
585225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	spinlock_t		lock;
586225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct radix_tree_root	tree;
587225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_icm_table	table;
588225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_icm_table	cmpt_table;
589225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
590225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
591225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_qp_table {
592225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_bitmap	bitmap;
593225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u32			rdmarc_base;
594225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			rdmarc_shift;
595225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	spinlock_t		lock;
596225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_icm_table	qp_table;
597225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_icm_table	auxc_table;
598225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_icm_table	altc_table;
599225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_icm_table	rdmarc_table;
600225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_icm_table	cmpt_table;
601225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
602225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
603225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_mcg_table {
604225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mutex		mutex;
605225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_bitmap	bitmap;
606225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_icm_table	table;
607225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
608225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
609225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_catas_err {
610225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u32 __iomem	       *map;
611ee49bd9397cd2b8fe7a1962505d81c1d0a1366fcJack Morgenstein	struct timer_list	timer;
612ee49bd9397cd2b8fe7a1962505d81c1d0a1366fcJack Morgenstein	struct list_head	list;
613225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
614225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
6152a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin#define MLX4_MAX_MAC_NUM	128
6162a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin#define MLX4_MAC_TABLE_SIZE	(MLX4_MAX_MAC_NUM << 3)
6172a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin
6182a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilinstruct mlx4_mac_table {
6192a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin	__be64			entries[MLX4_MAX_MAC_NUM];
6202a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin	int			refs[MLX4_MAX_MAC_NUM];
6212a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin	struct mutex		mutex;
6222a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin	int			total;
6232a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin	int			max;
6242a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin};
6252a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin
6262a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin#define MLX4_MAX_VLAN_NUM	128
6272a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin#define MLX4_VLAN_TABLE_SIZE	(MLX4_MAX_VLAN_NUM << 2)
6282a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin
6292a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilinstruct mlx4_vlan_table {
6302a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin	__be32			entries[MLX4_MAX_VLAN_NUM];
6312a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin	int			refs[MLX4_MAX_VLAN_NUM];
6322a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin	struct mutex		mutex;
6332a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin	int			total;
6342a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin	int			max;
6352a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin};
6362a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin
637ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev#define SET_PORT_GEN_ALL_VALID		0x7
638ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev#define SET_PORT_PROMISC_SHIFT		31
639ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev#define SET_PORT_MC_PROMISC_SHIFT	30
640ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev
641ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayevenum {
642ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	MCAST_DIRECT_ONLY	= 0,
643ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	MCAST_DIRECT		= 1,
644ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	MCAST_DEFAULT		= 2
645ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev};
646ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev
647ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev
648ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayevstruct mlx4_set_port_general_context {
649ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u8 reserved[3];
650ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u8 flags;
651ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u16 reserved2;
652ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	__be16 mtu;
653ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u8 pptx;
654ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u8 pfctx;
655ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u16 reserved3;
656ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u8 pprx;
657ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u8 pfcrx;
658ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u16 reserved4;
659ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev};
660ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev
661ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayevstruct mlx4_set_port_rqp_calc_context {
662ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	__be32 base_qpn;
663ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u8 rererved;
664ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u8 n_mac;
665ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u8 n_vlan;
666ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u8 n_prio;
667ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u8 reserved2[3];
668ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u8 mac_miss;
669ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u8 intra_no_vlan;
670ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u8 no_vlan;
671ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u8 intra_vlan_miss;
672ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u8 vlan_miss;
673ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u8 reserved3[3];
674ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	u8 no_vlan_prio;
675ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	__be32 promisc;
676ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev	__be32 mcast;
677ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev};
678ffe455ad04681f3fc48eef595fe526a795f809a3Eugenia Emantayev
6791679200f91da6a054b06954c9bd3eeed29b6731fYevgeny Petrilinstruct mlx4_mac_entry {
6801679200f91da6a054b06954c9bd3eeed29b6731fYevgeny Petrilin	u64 mac;
6811679200f91da6a054b06954c9bd3eeed29b6731fYevgeny Petrilin};
6821679200f91da6a054b06954c9bd3eeed29b6731fYevgeny Petrilin
6832a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilinstruct mlx4_port_info {
6842a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin	struct mlx4_dev	       *dev;
6852a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin	int			port;
6867ff93f8b7ecbc36e7ffc5c11a61643821c1bfee5Yevgeny Petrilin	char			dev_name[16];
6877ff93f8b7ecbc36e7ffc5c11a61643821c1bfee5Yevgeny Petrilin	struct device_attribute port_attr;
6887ff93f8b7ecbc36e7ffc5c11a61643821c1bfee5Yevgeny Petrilin	enum mlx4_port_type	tmp_type;
689096335b3f9830b90d13aee77252cf6f5f12a258cOr Gerlitz	char			dev_mtu_name[16];
690096335b3f9830b90d13aee77252cf6f5f12a258cOr Gerlitz	struct device_attribute port_mtu_attr;
6912a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin	struct mlx4_mac_table	mac_table;
6921679200f91da6a054b06954c9bd3eeed29b6731fYevgeny Petrilin	struct radix_tree_root	mac_tree;
6932a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin	struct mlx4_vlan_table	vlan_table;
6941679200f91da6a054b06954c9bd3eeed29b6731fYevgeny Petrilin	int			base_qpn;
6952a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin};
6962a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin
69727bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilinstruct mlx4_sense {
69827bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilin	struct mlx4_dev		*dev;
69927bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilin	u8			do_sense_port[MLX4_MAX_PORTS + 1];
70027bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilin	u8			sense_allowed[MLX4_MAX_PORTS + 1];
70127bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilin	struct delayed_work	sense_poll;
70227bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilin};
70327bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilin
7040b7ca5a928e2271bbc225e9e1ac1f22e9fbee54fYevgeny Petrilinstruct mlx4_msix_ctl {
7050b7ca5a928e2271bbc225e9e1ac1f22e9fbee54fYevgeny Petrilin	u64		pool_bm;
706730c41d5ba583a9608300fc4e6cf236957cfe02aYevgeny Petrilin	struct mutex	pool_lock;
7070b7ca5a928e2271bbc225e9e1ac1f22e9fbee54fYevgeny Petrilin};
7080b7ca5a928e2271bbc225e9e1ac1f22e9fbee54fYevgeny Petrilin
709b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilinstruct mlx4_steer {
710b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilin	struct list_head promisc_qps[MLX4_NUM_STEERS];
711b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilin	struct list_head steer_entries[MLX4_NUM_STEERS];
712b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilin};
713b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilin
714225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_priv {
715225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_dev		dev;
716225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
717225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct list_head	dev_list;
718225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct list_head	ctx_list;
719225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	spinlock_t		ctx_lock;
720225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
7216296883ca4cd52dafb45f191d24102e28ded38f2Yevgeny Petrilin	struct list_head        pgdir_list;
7226296883ca4cd52dafb45f191d24102e28ded38f2Yevgeny Petrilin	struct mutex            pgdir_mutex;
7236296883ca4cd52dafb45f191d24102e28ded38f2Yevgeny Petrilin
724225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_fw		fw;
725225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_cmd		cmd;
726623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein	struct mlx4_mfunc	mfunc;
727225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
728225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_bitmap	pd_bitmap;
729012a8ff577f95211c6ffd3b77a94c34ebae009b6Sean Hefty	struct mlx4_bitmap	xrcd_bitmap;
730225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_uar_table	uar_table;
731225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_mr_table	mr_table;
732225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_cq_table	cq_table;
733225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_eq_table	eq_table;
734225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_srq_table	srq_table;
735225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_qp_table	qp_table;
736225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_mcg_table	mcg_table;
737f2a3f6a32cf64db1495b5ced8625b9a80bde44e5Or Gerlitz	struct mlx4_bitmap	counters_bitmap;
738225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
739225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_catas_err	catas_err;
740225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
741225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	void __iomem	       *clr_base;
742225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
743225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_uar		driver_uar;
744225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	void __iomem	       *kar;
7452a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin	struct mlx4_port_info	port[MLX4_MAX_PORTS + 1];
74627bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilin	struct mlx4_sense       sense;
7477ff93f8b7ecbc36e7ffc5c11a61643821c1bfee5Yevgeny Petrilin	struct mutex		port_mutex;
7480b7ca5a928e2271bbc225e9e1ac1f22e9fbee54fYevgeny Petrilin	struct mlx4_msix_ctl	msix_ctl;
749b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilin	struct mlx4_steer	*steer;
750c1b43dca137f2154845122417fba86d4bae67182Eli Cohen	struct list_head	bf_list;
751c1b43dca137f2154845122417fba86d4bae67182Eli Cohen	struct mutex		bf_mutex;
752c1b43dca137f2154845122417fba86d4bae67182Eli Cohen	struct io_mapping	*bf_mapping;
753ea51b377abcdf0f3fab0119879be373bda69afb1Jack Morgenstein	int			reserved_mtts;
754225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
755225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
756225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstatic inline struct mlx4_priv *mlx4_priv(struct mlx4_dev *dev)
757225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier{
758225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	return container_of(dev, struct mlx4_priv, dev);
759225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier}
760225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
76127bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilin#define MLX4_SENSE_RANGE	(HZ * 3)
76227bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilin
76327bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilinextern struct workqueue_struct *mlx4_wq;
76427bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilin
765225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreieru32 mlx4_bitmap_alloc(struct mlx4_bitmap *bitmap);
766225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_bitmap_free(struct mlx4_bitmap *bitmap, u32 obj);
767a3cdcbfa8fb1fccfe48d359da86e99546610c562Yevgeny Petrilinu32 mlx4_bitmap_alloc_range(struct mlx4_bitmap *bitmap, int cnt, int align);
768a3cdcbfa8fb1fccfe48d359da86e99546610c562Yevgeny Petrilinvoid mlx4_bitmap_free_range(struct mlx4_bitmap *bitmap, u32 obj, int cnt);
76942d1e017e2f040c3e3d62b6cfa3a26351a865d04Eli Cohenu32 mlx4_bitmap_avail(struct mlx4_bitmap *bitmap);
77093fc9e1bb6507dde945c2eab68c93e1066ac3691Yevgeny Petrilinint mlx4_bitmap_init(struct mlx4_bitmap *bitmap, u32 num, u32 mask,
77193fc9e1bb6507dde945c2eab68c93e1066ac3691Yevgeny Petrilin		     u32 reserved_bot, u32 resetrved_top);
772225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_bitmap_cleanup(struct mlx4_bitmap *bitmap);
773225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
774225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_reset(struct mlx4_dev *dev);
775225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
776b8dd786f9417e5885929bfe33a235c76a9c1c569Yevgeny Petrilinint mlx4_alloc_eq_table(struct mlx4_dev *dev);
777b8dd786f9417e5885929bfe33a235c76a9c1c569Yevgeny Petrilinvoid mlx4_free_eq_table(struct mlx4_dev *dev);
778b8dd786f9417e5885929bfe33a235c76a9c1c569Yevgeny Petrilin
779225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_init_pd_table(struct mlx4_dev *dev);
780012a8ff577f95211c6ffd3b77a94c34ebae009b6Sean Heftyint mlx4_init_xrcd_table(struct mlx4_dev *dev);
781225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_init_uar_table(struct mlx4_dev *dev);
782225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_init_mr_table(struct mlx4_dev *dev);
783225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_init_eq_table(struct mlx4_dev *dev);
784225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_init_cq_table(struct mlx4_dev *dev);
785225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_init_qp_table(struct mlx4_dev *dev);
786225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_init_srq_table(struct mlx4_dev *dev);
787225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_init_mcg_table(struct mlx4_dev *dev);
788225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
789225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_cleanup_pd_table(struct mlx4_dev *dev);
790012a8ff577f95211c6ffd3b77a94c34ebae009b6Sean Heftyvoid mlx4_cleanup_xrcd_table(struct mlx4_dev *dev);
791225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_cleanup_uar_table(struct mlx4_dev *dev);
792225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_cleanup_mr_table(struct mlx4_dev *dev);
793225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_cleanup_eq_table(struct mlx4_dev *dev);
794225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_cleanup_cq_table(struct mlx4_dev *dev);
795225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_cleanup_qp_table(struct mlx4_dev *dev);
796225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_cleanup_srq_table(struct mlx4_dev *dev);
797225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_cleanup_mcg_table(struct mlx4_dev *dev);
798c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenint __mlx4_qp_alloc_icm(struct mlx4_dev *dev, int qpn);
799c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenvoid __mlx4_qp_free_icm(struct mlx4_dev *dev, int qpn);
800c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenint __mlx4_cq_alloc_icm(struct mlx4_dev *dev, int *cqn);
801c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenvoid __mlx4_cq_free_icm(struct mlx4_dev *dev, int cqn);
802c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenint __mlx4_srq_alloc_icm(struct mlx4_dev *dev, int *srqn);
803c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenvoid __mlx4_srq_free_icm(struct mlx4_dev *dev, int srqn);
804c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenint __mlx4_mr_reserve(struct mlx4_dev *dev);
805c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenvoid __mlx4_mr_release(struct mlx4_dev *dev, u32 index);
806c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenint __mlx4_mr_alloc_icm(struct mlx4_dev *dev, u32 index);
807c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenvoid __mlx4_mr_free_icm(struct mlx4_dev *dev, u32 index);
808c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenu32 __mlx4_alloc_mtt_range(struct mlx4_dev *dev, int order);
809c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenvoid __mlx4_free_mtt_range(struct mlx4_dev *dev, u32 first_seg, int order);
810225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
811623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_WRITE_MTT_wrapper(struct mlx4_dev *dev, int slave,
812623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_vhcr *vhcr,
813623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *inbox,
814623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *outbox,
815623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_info *cmd);
816623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_SYNC_TPT_wrapper(struct mlx4_dev *dev, int slave,
817623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_vhcr *vhcr,
818623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *inbox,
819623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *outbox,
820623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_info *cmd);
821623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_SW2HW_MPT_wrapper(struct mlx4_dev *dev, int slave,
822623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_vhcr *vhcr,
823623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *inbox,
824623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *outbox,
825623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_info *cmd);
826623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_HW2SW_MPT_wrapper(struct mlx4_dev *dev, int slave,
827623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_vhcr *vhcr,
828623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *inbox,
829623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *outbox,
830623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_info *cmd);
831623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_QUERY_MPT_wrapper(struct mlx4_dev *dev, int slave,
832623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_vhcr *vhcr,
833623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *inbox,
834623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *outbox,
835623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_info *cmd);
836623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_SW2HW_EQ_wrapper(struct mlx4_dev *dev, int slave,
837623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_vhcr *vhcr,
838623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_mailbox *inbox,
839623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_mailbox *outbox,
840623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_info *cmd);
841623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_DMA_wrapper(struct mlx4_dev *dev, int slave,
842623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		     struct mlx4_vhcr *vhcr,
843623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		     struct mlx4_cmd_mailbox *inbox,
844623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		     struct mlx4_cmd_mailbox *outbox,
845623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein		     struct mlx4_cmd_info *cmd);
846c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenint __mlx4_qp_reserve_range(struct mlx4_dev *dev, int cnt, int align,
847c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen			    int *base);
848c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenvoid __mlx4_qp_release_range(struct mlx4_dev *dev, int base_qpn, int cnt);
849c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenint __mlx4_register_mac(struct mlx4_dev *dev, u8 port, u64 mac);
850c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenvoid __mlx4_unregister_mac(struct mlx4_dev *dev, u8 port, u64 mac);
851c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenint __mlx4_replace_mac(struct mlx4_dev *dev, u8 port, int qpn, u64 new_mac);
852c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenint __mlx4_write_mtt(struct mlx4_dev *dev, struct mlx4_mtt *mtt,
853c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen		     int start_index, int npages, u64 *page_list);
854623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
855ee49bd9397cd2b8fe7a1962505d81c1d0a1366fcJack Morgensteinvoid mlx4_start_catas_poll(struct mlx4_dev *dev);
856ee49bd9397cd2b8fe7a1962505d81c1d0a1366fcJack Morgensteinvoid mlx4_stop_catas_poll(struct mlx4_dev *dev);
85727bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilinvoid mlx4_catas_init(void);
858ee49bd9397cd2b8fe7a1962505d81c1d0a1366fcJack Morgensteinint mlx4_restart_one(struct pci_dev *pdev);
859225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_register_device(struct mlx4_dev *dev);
860225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_unregister_device(struct mlx4_dev *dev);
86137608eea86a358ac6a18df0af55d4f77d08a1f30Roland Dreiervoid mlx4_dispatch_event(struct mlx4_dev *dev, enum mlx4_dev_event type, int port);
862225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
863225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_dev_cap;
864225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_init_hca_param;
865225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
866225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreieru64 mlx4_make_profile(struct mlx4_dev *dev,
867225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier		      struct mlx4_profile *request,
868225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier		      struct mlx4_dev_cap *dev_cap,
869225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier		      struct mlx4_init_hca_param *init_hca);
870623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinvoid mlx4_master_comm_channel(struct work_struct *work);
871623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinvoid mlx4_gen_slave_eqe(struct work_struct *work);
872623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinvoid mlx4_master_handle_slave_flr(struct work_struct *work);
873623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
874623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_ALLOC_RES_wrapper(struct mlx4_dev *dev, int slave,
875623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_vhcr *vhcr,
876623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *inbox,
877623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *outbox,
878623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_info *cmd);
879623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_FREE_RES_wrapper(struct mlx4_dev *dev, int slave,
880623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_vhcr *vhcr,
881623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_mailbox *inbox,
882623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_mailbox *outbox,
883623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_info *cmd);
884623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_MAP_EQ_wrapper(struct mlx4_dev *dev, int slave,
885623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			struct mlx4_vhcr *vhcr, struct mlx4_cmd_mailbox *inbox,
886623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			struct mlx4_cmd_mailbox *outbox,
887623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			struct mlx4_cmd_info *cmd);
888623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_COMM_INT_wrapper(struct mlx4_dev *dev, int slave,
889623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_vhcr *vhcr,
890623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_mailbox *inbox,
891623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_mailbox *outbox,
892623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_info *cmd);
893623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_HW2SW_EQ_wrapper(struct mlx4_dev *dev, int slave,
894623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			    struct mlx4_vhcr *vhcr,
895623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			    struct mlx4_cmd_mailbox *inbox,
896623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			    struct mlx4_cmd_mailbox *outbox,
897623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_info *cmd);
898623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_QUERY_EQ_wrapper(struct mlx4_dev *dev, int slave,
899623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_vhcr *vhcr,
900623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_mailbox *inbox,
901623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_mailbox *outbox,
902623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_info *cmd);
903623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_SW2HW_CQ_wrapper(struct mlx4_dev *dev, int slave,
904623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_vhcr *vhcr,
905623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_mailbox *inbox,
906623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_mailbox *outbox,
907623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_info *cmd);
908623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_HW2SW_CQ_wrapper(struct mlx4_dev *dev, int slave,
909623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_vhcr *vhcr,
910623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_mailbox *inbox,
911623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_mailbox *outbox,
912623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_info *cmd);
913623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_QUERY_CQ_wrapper(struct mlx4_dev *dev, int slave,
914623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_vhcr *vhcr,
915623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_mailbox *inbox,
916623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_mailbox *outbox,
917623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_info *cmd);
918623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_MODIFY_CQ_wrapper(struct mlx4_dev *dev, int slave,
919623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_vhcr *vhcr,
920623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_mailbox *inbox,
921623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_mailbox *outbox,
922623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_info *cmd);
923623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_SW2HW_SRQ_wrapper(struct mlx4_dev *dev, int slave,
924623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_vhcr *vhcr,
925623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *inbox,
926623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *outbox,
927623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_info *cmd);
928623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_HW2SW_SRQ_wrapper(struct mlx4_dev *dev, int slave,
929623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_vhcr *vhcr,
930623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *inbox,
931623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *outbox,
932623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_info *cmd);
933623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_QUERY_SRQ_wrapper(struct mlx4_dev *dev, int slave,
934623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_vhcr *vhcr,
935623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *inbox,
936623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *outbox,
937623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_info *cmd);
938623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_ARM_SRQ_wrapper(struct mlx4_dev *dev, int slave,
939623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			 struct mlx4_vhcr *vhcr,
940623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			 struct mlx4_cmd_mailbox *inbox,
941623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			 struct mlx4_cmd_mailbox *outbox,
942623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			 struct mlx4_cmd_info *cmd);
943623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_GEN_QP_wrapper(struct mlx4_dev *dev, int slave,
944623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			struct mlx4_vhcr *vhcr,
945623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			struct mlx4_cmd_mailbox *inbox,
946623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			struct mlx4_cmd_mailbox *outbox,
947623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			struct mlx4_cmd_info *cmd);
948623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_RST2INIT_QP_wrapper(struct mlx4_dev *dev, int slave,
949623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			     struct mlx4_vhcr *vhcr,
950623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			     struct mlx4_cmd_mailbox *inbox,
951623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			     struct mlx4_cmd_mailbox *outbox,
952623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			     struct mlx4_cmd_info *cmd);
953623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_INIT2RTR_QP_wrapper(struct mlx4_dev *dev, int slave,
954623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			     struct mlx4_vhcr *vhcr,
955623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			     struct mlx4_cmd_mailbox *inbox,
956623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			     struct mlx4_cmd_mailbox *outbox,
957623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			     struct mlx4_cmd_info *cmd);
958623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_2RST_QP_wrapper(struct mlx4_dev *dev, int slave,
959623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			 struct mlx4_vhcr *vhcr,
960623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			 struct mlx4_cmd_mailbox *inbox,
961623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			 struct mlx4_cmd_mailbox *outbox,
962623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			 struct mlx4_cmd_info *cmd);
963623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
964623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_GEN_EQE(struct mlx4_dev *dev, int slave, struct mlx4_eqe *eqe);
965225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
966225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_cmd_init(struct mlx4_dev *dev);
967225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_cmd_cleanup(struct mlx4_dev *dev);
968ab9c17a009ee8eb8c667f22dc0be0709effceab9Jack Morgensteinint mlx4_multi_func_init(struct mlx4_dev *dev);
969ab9c17a009ee8eb8c667f22dc0be0709effceab9Jack Morgensteinvoid mlx4_multi_func_cleanup(struct mlx4_dev *dev);
970225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_cmd_event(struct mlx4_dev *dev, u16 token, u8 status, u64 out_param);
971225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_cmd_use_events(struct mlx4_dev *dev);
972225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_cmd_use_polling(struct mlx4_dev *dev);
973225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
974ab9c17a009ee8eb8c667f22dc0be0709effceab9Jack Morgensteinint mlx4_comm_cmd(struct mlx4_dev *dev, u8 cmd, u16 param,
975ab9c17a009ee8eb8c667f22dc0be0709effceab9Jack Morgenstein		  unsigned long timeout);
976ab9c17a009ee8eb8c667f22dc0be0709effceab9Jack Morgenstein
977225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_cq_completion(struct mlx4_dev *dev, u32 cqn);
978225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_cq_event(struct mlx4_dev *dev, u32 cqn, int event_type);
979225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
980225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_qp_event(struct mlx4_dev *dev, u32 qpn, int event_type);
981225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
982225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_srq_event(struct mlx4_dev *dev, u32 srqn, int event_type);
983225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
984225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_handle_catas_err(struct mlx4_dev *dev);
985225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
986ab6dc30da55d262c54ae12e47e4a2e4372e39fbfYevgeny Petrilinint mlx4_SENSE_PORT(struct mlx4_dev *dev, int port,
987ab6dc30da55d262c54ae12e47e4a2e4372e39fbfYevgeny Petrilin		    enum mlx4_port_type *type);
98827bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilinvoid mlx4_do_sense_ports(struct mlx4_dev *dev,
98927bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilin			 enum mlx4_port_type *stype,
99027bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilin			 enum mlx4_port_type *defaults);
99127bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilinvoid mlx4_start_sense(struct mlx4_dev *dev);
99227bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilinvoid mlx4_stop_sense(struct mlx4_dev *dev);
99327bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilinvoid mlx4_sense_init(struct mlx4_dev *dev);
99427bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilinint mlx4_check_port_params(struct mlx4_dev *dev,
99527bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilin			   enum mlx4_port_type *port_type);
99627bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilinint mlx4_change_port_types(struct mlx4_dev *dev,
99727bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilin			   enum mlx4_port_type *port_types);
99827bf91d6a0d5a9c7224e8687754249bba67dd4cfYevgeny Petrilin
9992a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilinvoid mlx4_init_mac_table(struct mlx4_dev *dev, struct mlx4_mac_table *table);
10002a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilinvoid mlx4_init_vlan_table(struct mlx4_dev *dev, struct mlx4_vlan_table *table);
10012a2336f8228292b8197f4187e54b0748903e6645Yevgeny Petrilin
10027ff93f8b7ecbc36e7ffc5c11a61643821c1bfee5Yevgeny Petrilinint mlx4_SET_PORT(struct mlx4_dev *dev, u8 port);
1003623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein/* resource tracker functions*/
1004623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_get_slave_from_resource_id(struct mlx4_dev *dev,
1005623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein				    enum mlx4_resource resource_type,
1006623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein				    int resource_id, int *slave);
1007623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinvoid mlx4_delete_all_resources_for_slave(struct mlx4_dev *dev, int slave_id);
1008623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_init_resource_tracker(struct mlx4_dev *dev);
1009623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
1010623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinvoid mlx4_free_resource_tracker(struct mlx4_dev *dev);
1011623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
1012623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_SET_PORT_wrapper(struct mlx4_dev *dev, int slave,
1013623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_vhcr *vhcr,
1014623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_mailbox *inbox,
1015623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_mailbox *outbox,
1016623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			  struct mlx4_cmd_info *cmd);
1017623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_INIT_PORT_wrapper(struct mlx4_dev *dev, int slave,
1018623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_vhcr *vhcr,
1019623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *inbox,
1020623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *outbox,
1021623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_info *cmd);
1022623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_CLOSE_PORT_wrapper(struct mlx4_dev *dev, int slave,
1023623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			    struct mlx4_vhcr *vhcr,
1024623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			    struct mlx4_cmd_mailbox *inbox,
1025623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			    struct mlx4_cmd_mailbox *outbox,
1026623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			    struct mlx4_cmd_info *cmd);
1027623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave,
1028623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			    struct mlx4_vhcr *vhcr,
1029623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			    struct mlx4_cmd_mailbox *inbox,
1030623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			    struct mlx4_cmd_mailbox *outbox,
1031623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			    struct mlx4_cmd_info *cmd);
10329a5aa622dd4cd22b5e0fe83e4a9c0c768d4e2deaJack Morgensteinint mlx4_get_port_ib_caps(struct mlx4_dev *dev, u8 port, __be32 *caps);
10337ff93f8b7ecbc36e7ffc5c11a61643821c1bfee5Yevgeny Petrilin
1034623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
1035623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_QP_ATTACH_wrapper(struct mlx4_dev *dev, int slave,
1036623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_vhcr *vhcr,
1037623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *inbox,
1038623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_mailbox *outbox,
1039623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			   struct mlx4_cmd_info *cmd);
1040623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein
1041623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_PROMISC_wrapper(struct mlx4_dev *dev, int slave,
1042623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			 struct mlx4_vhcr *vhcr,
1043623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			 struct mlx4_cmd_mailbox *inbox,
1044623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			 struct mlx4_cmd_mailbox *outbox,
1045623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			 struct mlx4_cmd_info *cmd);
1046b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilinint mlx4_qp_detach_common(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16],
1047b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilin			  enum mlx4_protocol prot, enum mlx4_steer_type steer);
1048b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilinint mlx4_qp_attach_common(struct mlx4_dev *dev, struct mlx4_qp *qp, u8 gid[16],
1049b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilin			  int block_mcast_loopback, enum mlx4_protocol prot,
1050b12d93d63c3217f0ec923ff938b12a744e242ffaYevgeny Petrilin			  enum mlx4_steer_type steer);
1051623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_SET_MCAST_FLTR_wrapper(struct mlx4_dev *dev, int slave,
1052623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein				struct mlx4_vhcr *vhcr,
1053623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein				struct mlx4_cmd_mailbox *inbox,
1054623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein				struct mlx4_cmd_mailbox *outbox,
1055623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein				struct mlx4_cmd_info *cmd);
1056623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_SET_VLAN_FLTR_wrapper(struct mlx4_dev *dev, int slave,
1057623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			       struct mlx4_vhcr *vhcr,
1058623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			       struct mlx4_cmd_mailbox *inbox,
1059623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			       struct mlx4_cmd_mailbox *outbox,
1060623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			       struct mlx4_cmd_info *cmd);
1061623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_common_set_vlan_fltr(struct mlx4_dev *dev, int function,
1062623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein				     int port, void *buf);
1063623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_common_dump_eth_stats(struct mlx4_dev *dev, int slave, u32 in_mod,
1064623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein				struct mlx4_cmd_mailbox *outbox);
1065623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_DUMP_ETH_STATS_wrapper(struct mlx4_dev *dev, int slave,
1066623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein				   struct mlx4_vhcr *vhcr,
1067623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein				   struct mlx4_cmd_mailbox *inbox,
1068623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein				   struct mlx4_cmd_mailbox *outbox,
1069623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein				struct mlx4_cmd_info *cmd);
1070623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_PKEY_TABLE_wrapper(struct mlx4_dev *dev, int slave,
1071623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			    struct mlx4_vhcr *vhcr,
1072623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			    struct mlx4_cmd_mailbox *inbox,
1073623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			    struct mlx4_cmd_mailbox *outbox,
1074623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			    struct mlx4_cmd_info *cmd);
1075623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgensteinint mlx4_QUERY_IF_STAT_wrapper(struct mlx4_dev *dev, int slave,
1076623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			       struct mlx4_vhcr *vhcr,
1077623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			       struct mlx4_cmd_mailbox *inbox,
1078623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			       struct mlx4_cmd_mailbox *outbox,
1079623ed84b1f9553bc962c2aca92f488aa6f27ecd1Jack Morgenstein			       struct mlx4_cmd_info *cmd);
1080f5311ac109b21c9b47118655a5b6d887bcc686f8Jack Morgenstein
10810ec2c0f86d31ab36547307f133b0016006bdc6b5Eugenia Emantayevint mlx4_get_mgm_entry_size(struct mlx4_dev *dev);
10820ec2c0f86d31ab36547307f133b0016006bdc6b5Eugenia Emantayevint mlx4_get_qp_per_mgm(struct mlx4_dev *dev);
10830ec2c0f86d31ab36547307f133b0016006bdc6b5Eugenia Emantayev
10845cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaumstatic inline void set_param_l(u64 *arg, u32 val)
10855cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaum{
10865cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaum	*((u32 *)arg) = val;
10875cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaum}
10885cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaum
10895cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaumstatic inline void set_param_h(u64 *arg, u32 val)
10905cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaum{
10915cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaum	*arg = (*arg & 0xffffffff) | ((u64) val << 32);
10925cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaum}
10935cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaum
10945cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaumstatic inline u32 get_param_l(u64 *arg)
10955cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaum{
10965cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaum	return (u32) (*arg & 0xffffffff);
10975cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaum}
10985cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaum
10995cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaumstatic inline u32 get_param_h(u64 *arg)
11005cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaum{
11015cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaum	return (u32)(*arg >> 32);
11025cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaum}
11035cc914f10851d2dc17005c7d26cdd70adcbecbcdMarcel Apfelbaum
1104c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohenstatic inline spinlock_t *mlx4_tlock(struct mlx4_dev *dev)
1105c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen{
1106c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen	return &mlx4_priv(dev)->mfunc.master.res_tracker.lock;
1107c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen}
1108c82e9aa0a8bcf7a1643ccb71678bab57f3cb4bc6Eli Cohen
1109f5311ac109b21c9b47118655a5b6d887bcc686f8Jack Morgenstein#define NOT_MASKED_PD_BITS 17
1110f5311ac109b21c9b47118655a5b6d887bcc686f8Jack Morgenstein
1111225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#endif /* MLX4_H */
1112