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