1225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier/*
2225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * Copyright (c) 2006, 2007 Cisco Systems.  All rights reserved.
351a379d0c8f7a6db7c9e3c9c770d90a6d2d1ef9bJack Morgenstein * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved.
4225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *
5225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * This software is available to you under a choice of one of two
6225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * licenses.  You may choose to be licensed under the terms of the GNU
7225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * General Public License (GPL) Version 2, available from the file
8225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * COPYING in the main directory of this source tree, or the
9225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * OpenIB.org BSD license below:
10225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *
11225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *     Redistribution and use in source and binary forms, with or
12225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *     without modification, are permitted provided that the following
13225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *     conditions are met:
14225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *
15225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *      - Redistributions of source code must retain the above
16225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *        copyright notice, this list of conditions and the following
17225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *        disclaimer.
18225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *
19225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *      - Redistributions in binary form must reproduce the above
20225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *        copyright notice, this list of conditions and the following
21225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *        disclaimer in the documentation and/or other materials
22225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *        provided with the distribution.
23225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier *
24225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier * SOFTWARE.
32225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier */
33225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
34225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#ifndef MLX4_IB_H
35225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#define MLX4_IB_H
36225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
37225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#include <linux/compiler.h>
38225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#include <linux/list.h>
3963019d9329628a5056b3a0c76aee955873dc25c3Michael S. Tsirkin#include <linux/mutex.h>
40225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
41225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#include <rdma/ib_verbs.h>
42225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#include <rdma/ib_umem.h>
43225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
44225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#include <linux/mlx4/device.h>
45225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#include <linux/mlx4/doorbell.h>
46225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
47225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_ib_ucontext {
48225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct ib_ucontext	ibucontext;
49225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_uar		uar;
50225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct list_head	db_page_list;
51225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mutex		db_page_mutex;
52225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
53225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
54225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_ib_pd {
55225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct ib_pd		ibpd;
56225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u32			pdn;
57225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
58225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
59012a8ff577f95211c6ffd3b77a94c34ebae009b6Sean Heftystruct mlx4_ib_xrcd {
60012a8ff577f95211c6ffd3b77a94c34ebae009b6Sean Hefty	struct ib_xrcd		ibxrcd;
61012a8ff577f95211c6ffd3b77a94c34ebae009b6Sean Hefty	u32			xrcdn;
62012a8ff577f95211c6ffd3b77a94c34ebae009b6Sean Hefty	struct ib_pd	       *pd;
63012a8ff577f95211c6ffd3b77a94c34ebae009b6Sean Hefty	struct ib_cq	       *cq;
64012a8ff577f95211c6ffd3b77a94c34ebae009b6Sean Hefty};
65012a8ff577f95211c6ffd3b77a94c34ebae009b6Sean Hefty
66225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_ib_cq_buf {
67225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_buf		buf;
68225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_mtt		mtt;
69225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
70225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
71bbf8eed1a0f8949f7385146624f736f829992a70Vladimir Sokolovskystruct mlx4_ib_cq_resize {
72bbf8eed1a0f8949f7385146624f736f829992a70Vladimir Sokolovsky	struct mlx4_ib_cq_buf	buf;
73bbf8eed1a0f8949f7385146624f736f829992a70Vladimir Sokolovsky	int			cqe;
74bbf8eed1a0f8949f7385146624f736f829992a70Vladimir Sokolovsky};
75bbf8eed1a0f8949f7385146624f736f829992a70Vladimir Sokolovsky
76225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_ib_cq {
77225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct ib_cq		ibcq;
78225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_cq		mcq;
79225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_ib_cq_buf	buf;
80bbf8eed1a0f8949f7385146624f736f829992a70Vladimir Sokolovsky	struct mlx4_ib_cq_resize *resize_buf;
816296883ca4cd52dafb45f191d24102e28ded38f2Yevgeny Petrilin	struct mlx4_db		db;
82225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	spinlock_t		lock;
83bbf8eed1a0f8949f7385146624f736f829992a70Vladimir Sokolovsky	struct mutex		resize_mutex;
84225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct ib_umem	       *umem;
85bbf8eed1a0f8949f7385146624f736f829992a70Vladimir Sokolovsky	struct ib_umem	       *resize_umem;
86225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
87225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
88225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_ib_mr {
89225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct ib_mr		ibmr;
90225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_mr		mmr;
91225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct ib_umem	       *umem;
92225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
93225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
9495d04f0735b4fc837bff9aedcc3f3efb20ddc3d1Roland Dreierstruct mlx4_ib_fast_reg_page_list {
9595d04f0735b4fc837bff9aedcc3f3efb20ddc3d1Roland Dreier	struct ib_fast_reg_page_list	ibfrpl;
962b6b7d4be487bada8c727df829c25068c7b5e5a3Jack Morgenstein	__be64			       *mapped_page_list;
9795d04f0735b4fc837bff9aedcc3f3efb20ddc3d1Roland Dreier	dma_addr_t			map;
9895d04f0735b4fc837bff9aedcc3f3efb20ddc3d1Roland Dreier};
9995d04f0735b4fc837bff9aedcc3f3efb20ddc3d1Roland Dreier
1008ad11fb6b0739e704953e2b0aed453bf7d75d4f6Jack Morgensteinstruct mlx4_ib_fmr {
1018ad11fb6b0739e704953e2b0aed453bf7d75d4f6Jack Morgenstein	struct ib_fmr           ibfmr;
1028ad11fb6b0739e704953e2b0aed453bf7d75d4f6Jack Morgenstein	struct mlx4_fmr         mfmr;
1038ad11fb6b0739e704953e2b0aed453bf7d75d4f6Jack Morgenstein};
1048ad11fb6b0739e704953e2b0aed453bf7d75d4f6Jack Morgenstein
105225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_ib_wq {
106225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u64		       *wrid;
107225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	spinlock_t		lock;
1080e6e74162164d908edf7889ac66dca09e7505745Roland Dreier	int			wqe_cnt;
1090e6e74162164d908edf7889ac66dca09e7505745Roland Dreier	int			max_post;
110225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			max_gs;
111225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			offset;
112225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			wqe_shift;
113225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	unsigned		head;
114225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	unsigned		tail;
115225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
116225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
117b832be1e4007f4a54954ec68bd865ff05d6babcaEli Cohenenum mlx4_ib_qp_flags {
118521e575b9a7324a0bca762622139f69582a042bfRon Livne	MLX4_IB_QP_LSO				= 1 << 0,
119521e575b9a7324a0bca762622139f69582a042bfRon Livne	MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK	= 1 << 1,
120b832be1e4007f4a54954ec68bd865ff05d6babcaEli Cohen};
121b832be1e4007f4a54954ec68bd865ff05d6babcaEli Cohen
122fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohenstruct mlx4_ib_gid_entry {
123fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen	struct list_head	list;
124fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen	union ib_gid		gid;
125fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen	int			added;
126fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen	u8			port;
127fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen};
128fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen
129225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_ib_qp {
130225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct ib_qp		ibqp;
131225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_qp		mqp;
132225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_buf		buf;
133225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
1346296883ca4cd52dafb45f191d24102e28ded38f2Yevgeny Petrilin	struct mlx4_db		db;
135225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_ib_wq	rq;
136225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
137225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u32			doorbell_qpn;
138225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	__be32			sq_signal_bits;
139ea54b10c7773007e173da31fe7adcc049da33331Jack Morgenstein	unsigned		sq_next_wqe;
140ea54b10c7773007e173da31fe7adcc049da33331Jack Morgenstein	int			sq_max_wqes_per_wr;
1410e6e74162164d908edf7889ac66dca09e7505745Roland Dreier	int			sq_spare_wqes;
142225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_ib_wq	sq;
143225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
144225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct ib_umem	       *umem;
145225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_mtt		mtt;
146225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			buf_size;
147225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mutex		mutex;
1480a1405da9952a72dd587829a3321695adde7dca1Sean Hefty	u16			xrcdn;
149b832be1e4007f4a54954ec68bd865ff05d6babcaEli Cohen	u32			flags;
150225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u8			port;
151225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u8			alt_port;
152225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u8			atomic_rd_en;
153225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u8			resp_depth;
1540e6e74162164d908edf7889ac66dca09e7505745Roland Dreier	u8			sq_no_prefetch;
155225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u8			state;
156fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen	int			mlx_type;
157fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen	struct list_head	gid_list;
158225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
159225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
160225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_ib_srq {
161225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct ib_srq		ibsrq;
162225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_srq		msrq;
163225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_buf		buf;
1646296883ca4cd52dafb45f191d24102e28ded38f2Yevgeny Petrilin	struct mlx4_db		db;
165225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u64		       *wrid;
166225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	spinlock_t		lock;
167225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			head;
168225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	int			tail;
169225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u16			wqe_ctr;
170225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct ib_umem	       *umem;
171225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_mtt		mtt;
172225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mutex		mutex;
173225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
174225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
175225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_ib_ah {
176225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct ib_ah		ibah;
177fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen	union mlx4_ext_av       av;
178fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen};
179fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen
180fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohenstruct mlx4_ib_iboe {
181fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen	spinlock_t		lock;
182fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen	struct net_device      *netdevs[MLX4_MAX_PORTS];
183fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen	struct notifier_block 	nb;
184fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen	union ib_gid		gid_table[MLX4_MAX_PORTS][128];
185225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
186225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
187225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct mlx4_ib_dev {
188225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct ib_device	ib_dev;
189225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_dev	       *dev;
1907ff93f8b7ecbc36e7ffc5c11a61643821c1bfee5Yevgeny Petrilin	int			num_ports;
191225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	void __iomem	       *uar_map;
192225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
193225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mlx4_uar		priv_uar;
194225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	u32			priv_pdn;
195225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	MLX4_DECLARE_DOORBELL_LOCK(uar_lock);
196225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
197225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct ib_mad_agent    *send_agent[MLX4_MAX_PORTS][2];
198225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct ib_ah	       *sm_ah[MLX4_MAX_PORTS];
199225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	spinlock_t		sm_lock;
200225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
201225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	struct mutex		cap_mask_mutex;
2023b4a8cd51e59c1c342c51b241bbb96c6ac24a147Jack Morgenstein	bool			ib_active;
203fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen	struct mlx4_ib_iboe	iboe;
204cfcde11c3d7ae175f49280bb6f913478c2f1bd8cOr Gerlitz	int			counters[MLX4_MAX_PORTS];
205225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier};
206225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
207225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstatic inline struct mlx4_ib_dev *to_mdev(struct ib_device *ibdev)
208225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier{
209225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	return container_of(ibdev, struct mlx4_ib_dev, ib_dev);
210225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier}
211225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
212225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstatic inline struct mlx4_ib_ucontext *to_mucontext(struct ib_ucontext *ibucontext)
213225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier{
214225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	return container_of(ibucontext, struct mlx4_ib_ucontext, ibucontext);
215225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier}
216225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
217225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstatic inline struct mlx4_ib_pd *to_mpd(struct ib_pd *ibpd)
218225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier{
219225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	return container_of(ibpd, struct mlx4_ib_pd, ibpd);
220225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier}
221225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
222012a8ff577f95211c6ffd3b77a94c34ebae009b6Sean Heftystatic inline struct mlx4_ib_xrcd *to_mxrcd(struct ib_xrcd *ibxrcd)
223012a8ff577f95211c6ffd3b77a94c34ebae009b6Sean Hefty{
224012a8ff577f95211c6ffd3b77a94c34ebae009b6Sean Hefty	return container_of(ibxrcd, struct mlx4_ib_xrcd, ibxrcd);
225012a8ff577f95211c6ffd3b77a94c34ebae009b6Sean Hefty}
226012a8ff577f95211c6ffd3b77a94c34ebae009b6Sean Hefty
227225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstatic inline struct mlx4_ib_cq *to_mcq(struct ib_cq *ibcq)
228225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier{
229225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	return container_of(ibcq, struct mlx4_ib_cq, ibcq);
230225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier}
231225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
232225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstatic inline struct mlx4_ib_cq *to_mibcq(struct mlx4_cq *mcq)
233225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier{
234225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	return container_of(mcq, struct mlx4_ib_cq, mcq);
235225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier}
236225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
237225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstatic inline struct mlx4_ib_mr *to_mmr(struct ib_mr *ibmr)
238225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier{
239225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	return container_of(ibmr, struct mlx4_ib_mr, ibmr);
240225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier}
241225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
24295d04f0735b4fc837bff9aedcc3f3efb20ddc3d1Roland Dreierstatic inline struct mlx4_ib_fast_reg_page_list *to_mfrpl(struct ib_fast_reg_page_list *ibfrpl)
24395d04f0735b4fc837bff9aedcc3f3efb20ddc3d1Roland Dreier{
24495d04f0735b4fc837bff9aedcc3f3efb20ddc3d1Roland Dreier	return container_of(ibfrpl, struct mlx4_ib_fast_reg_page_list, ibfrpl);
24595d04f0735b4fc837bff9aedcc3f3efb20ddc3d1Roland Dreier}
24695d04f0735b4fc837bff9aedcc3f3efb20ddc3d1Roland Dreier
2478ad11fb6b0739e704953e2b0aed453bf7d75d4f6Jack Morgensteinstatic inline struct mlx4_ib_fmr *to_mfmr(struct ib_fmr *ibfmr)
2488ad11fb6b0739e704953e2b0aed453bf7d75d4f6Jack Morgenstein{
2498ad11fb6b0739e704953e2b0aed453bf7d75d4f6Jack Morgenstein	return container_of(ibfmr, struct mlx4_ib_fmr, ibfmr);
2508ad11fb6b0739e704953e2b0aed453bf7d75d4f6Jack Morgenstein}
251225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstatic inline struct mlx4_ib_qp *to_mqp(struct ib_qp *ibqp)
252225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier{
253225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	return container_of(ibqp, struct mlx4_ib_qp, ibqp);
254225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier}
255225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
256225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstatic inline struct mlx4_ib_qp *to_mibqp(struct mlx4_qp *mqp)
257225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier{
258225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	return container_of(mqp, struct mlx4_ib_qp, mqp);
259225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier}
260225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
261225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstatic inline struct mlx4_ib_srq *to_msrq(struct ib_srq *ibsrq)
262225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier{
263225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	return container_of(ibsrq, struct mlx4_ib_srq, ibsrq);
264225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier}
265225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
266225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstatic inline struct mlx4_ib_srq *to_mibsrq(struct mlx4_srq *msrq)
267225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier{
268225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	return container_of(msrq, struct mlx4_ib_srq, msrq);
269225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier}
270225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
271225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstatic inline struct mlx4_ib_ah *to_mah(struct ib_ah *ibah)
272225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier{
273225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier	return container_of(ibah, struct mlx4_ib_ah, ibah);
274225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier}
275225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
276225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_ib_db_map_user(struct mlx4_ib_ucontext *context, unsigned long virt,
2776296883ca4cd52dafb45f191d24102e28ded38f2Yevgeny Petrilin			struct mlx4_db *db);
2786296883ca4cd52dafb45f191d24102e28ded38f2Yevgeny Petrilinvoid mlx4_ib_db_unmap_user(struct mlx4_ib_ucontext *context, struct mlx4_db *db);
279225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
280225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct ib_mr *mlx4_ib_get_dma_mr(struct ib_pd *pd, int acc);
281225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_ib_umem_write_mtt(struct mlx4_ib_dev *dev, struct mlx4_mtt *mtt,
282225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier			   struct ib_umem *umem);
283225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct ib_mr *mlx4_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
284225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier				  u64 virt_addr, int access_flags,
285225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier				  struct ib_udata *udata);
286225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_ib_dereg_mr(struct ib_mr *mr);
28795d04f0735b4fc837bff9aedcc3f3efb20ddc3d1Roland Dreierstruct ib_mr *mlx4_ib_alloc_fast_reg_mr(struct ib_pd *pd,
28895d04f0735b4fc837bff9aedcc3f3efb20ddc3d1Roland Dreier					int max_page_list_len);
28995d04f0735b4fc837bff9aedcc3f3efb20ddc3d1Roland Dreierstruct ib_fast_reg_page_list *mlx4_ib_alloc_fast_reg_page_list(struct ib_device *ibdev,
29095d04f0735b4fc837bff9aedcc3f3efb20ddc3d1Roland Dreier							       int page_list_len);
29195d04f0735b4fc837bff9aedcc3f3efb20ddc3d1Roland Dreiervoid mlx4_ib_free_fast_reg_page_list(struct ib_fast_reg_page_list *page_list);
292225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
2933fdcb97f0b8d8a29117dc36acd0b15965d2a2160Eli Cohenint mlx4_ib_modify_cq(struct ib_cq *cq, u16 cq_count, u16 cq_period);
294bbf8eed1a0f8949f7385146624f736f829992a70Vladimir Sokolovskyint mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata);
295225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct ib_cq *mlx4_ib_create_cq(struct ib_device *ibdev, int entries, int vector,
296225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier				struct ib_ucontext *context,
297225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier				struct ib_udata *udata);
298225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_ib_destroy_cq(struct ib_cq *cq);
299225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_ib_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc);
300225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_ib_arm_cq(struct ib_cq *cq, enum ib_cq_notify_flags flags);
301225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid __mlx4_ib_cq_clean(struct mlx4_ib_cq *cq, u32 qpn, struct mlx4_ib_srq *srq);
302225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_ib_cq_clean(struct mlx4_ib_cq *cq, u32 qpn, struct mlx4_ib_srq *srq);
303225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
304225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct ib_ah *mlx4_ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr);
305225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_ib_query_ah(struct ib_ah *ibah, struct ib_ah_attr *ah_attr);
306225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_ib_destroy_ah(struct ib_ah *ah);
307225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
308225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd,
309225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier				  struct ib_srq_init_attr *init_attr,
310225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier				  struct ib_udata *udata);
311225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_ib_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
312225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier		       enum ib_srq_attr_mask attr_mask, struct ib_udata *udata);
31365541cb7cf353946ecd78016a453b453b8830656Jack Morgensteinint mlx4_ib_query_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr);
314225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_ib_destroy_srq(struct ib_srq *srq);
315225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_ib_free_srq_wqe(struct mlx4_ib_srq *srq, int wqe_index);
316225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_ib_post_srq_recv(struct ib_srq *ibsrq, struct ib_recv_wr *wr,
317225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier			  struct ib_recv_wr **bad_wr);
318225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
319225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstruct ib_qp *mlx4_ib_create_qp(struct ib_pd *pd,
320225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier				struct ib_qp_init_attr *init_attr,
321225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier				struct ib_udata *udata);
322225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_ib_destroy_qp(struct ib_qp *qp);
323225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
324225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier		      int attr_mask, struct ib_udata *udata);
3256a775e2ba4f7635849ade628e64723ab2beef0bcJack Morgensteinint mlx4_ib_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr, int qp_attr_mask,
3266a775e2ba4f7635849ade628e64723ab2beef0bcJack Morgenstein		     struct ib_qp_init_attr *qp_init_attr);
327225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
328225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier		      struct ib_send_wr **bad_wr);
329225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_ib_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *wr,
330225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier		      struct ib_recv_wr **bad_wr);
331225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
332225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_MAD_IFC(struct mlx4_ib_dev *dev, int ignore_mkey, int ignore_bkey,
333225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier		 int port, struct ib_wc *in_wc, struct ib_grh *in_grh,
334225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier		 void *in_mad, void *response_mad);
335225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_ib_process_mad(struct ib_device *ibdev, int mad_flags,	u8 port_num,
336225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier			struct ib_wc *in_wc, struct ib_grh *in_grh,
337225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier			struct ib_mad *in_mad, struct ib_mad *out_mad);
338225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierint mlx4_ib_mad_init(struct mlx4_ib_dev *dev);
339225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreiervoid mlx4_ib_mad_cleanup(struct mlx4_ib_dev *dev);
340225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
3418ad11fb6b0739e704953e2b0aed453bf7d75d4f6Jack Morgensteinstruct ib_fmr *mlx4_ib_fmr_alloc(struct ib_pd *pd, int mr_access_flags,
3428ad11fb6b0739e704953e2b0aed453bf7d75d4f6Jack Morgenstein				  struct ib_fmr_attr *fmr_attr);
3438ad11fb6b0739e704953e2b0aed453bf7d75d4f6Jack Morgensteinint mlx4_ib_map_phys_fmr(struct ib_fmr *ibfmr, u64 *page_list, int npages,
3448ad11fb6b0739e704953e2b0aed453bf7d75d4f6Jack Morgenstein			 u64 iova);
3458ad11fb6b0739e704953e2b0aed453bf7d75d4f6Jack Morgensteinint mlx4_ib_unmap_fmr(struct list_head *fmr_list);
3468ad11fb6b0739e704953e2b0aed453bf7d75d4f6Jack Morgensteinint mlx4_ib_fmr_dealloc(struct ib_fmr *fmr);
3478ad11fb6b0739e704953e2b0aed453bf7d75d4f6Jack Morgenstein
348fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohenint mlx4_ib_resolve_grh(struct mlx4_ib_dev *dev, const struct ib_ah_attr *ah_attr,
349fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen			u8 *mac, int *is_mcast, u8 port);
350fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen
351225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreierstatic inline int mlx4_ib_ah_grh_present(struct mlx4_ib_ah *ah)
352225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier{
353fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen	u8 port = be32_to_cpu(ah->av.ib.port_pd) >> 24 & 3;
354fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen
355fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen	if (rdma_port_get_link_layer(ah->ibah.device, port) == IB_LINK_LAYER_ETHERNET)
356fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen		return 1;
357fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen
358fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen	return !!(ah->av.ib.g_slid & 0x80);
359225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier}
360225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier
361fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohenint mlx4_ib_add_mc(struct mlx4_ib_dev *mdev, struct mlx4_ib_qp *mqp,
362fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen		   union ib_gid *gid);
363fa417f7b520ee60b39f7e23528d2030af30a07d1Eli Cohen
364225c7b1feef1b41170f7037a5b10a65cd8a42c54Roland Dreier#endif /* MLX4_IB_H */
365