1225c7b1fSRoland Dreier /* 2225c7b1fSRoland Dreier * Copyright (c) 2006, 2007 Cisco Systems. All rights reserved. 351a379d0SJack Morgenstein * Copyright (c) 2007, 2008 Mellanox Technologies. All rights reserved. 4225c7b1fSRoland Dreier * 5225c7b1fSRoland Dreier * This software is available to you under a choice of one of two 6225c7b1fSRoland Dreier * licenses. You may choose to be licensed under the terms of the GNU 7225c7b1fSRoland Dreier * General Public License (GPL) Version 2, available from the file 8225c7b1fSRoland Dreier * COPYING in the main directory of this source tree, or the 9225c7b1fSRoland Dreier * OpenIB.org BSD license below: 10225c7b1fSRoland Dreier * 11225c7b1fSRoland Dreier * Redistribution and use in source and binary forms, with or 12225c7b1fSRoland Dreier * without modification, are permitted provided that the following 13225c7b1fSRoland Dreier * conditions are met: 14225c7b1fSRoland Dreier * 15225c7b1fSRoland Dreier * - Redistributions of source code must retain the above 16225c7b1fSRoland Dreier * copyright notice, this list of conditions and the following 17225c7b1fSRoland Dreier * disclaimer. 18225c7b1fSRoland Dreier * 19225c7b1fSRoland Dreier * - Redistributions in binary form must reproduce the above 20225c7b1fSRoland Dreier * copyright notice, this list of conditions and the following 21225c7b1fSRoland Dreier * disclaimer in the documentation and/or other materials 22225c7b1fSRoland Dreier * provided with the distribution. 23225c7b1fSRoland Dreier * 24225c7b1fSRoland Dreier * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25225c7b1fSRoland Dreier * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26225c7b1fSRoland Dreier * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27225c7b1fSRoland Dreier * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28225c7b1fSRoland Dreier * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29225c7b1fSRoland Dreier * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30225c7b1fSRoland Dreier * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31225c7b1fSRoland Dreier * SOFTWARE. 32225c7b1fSRoland Dreier */ 33225c7b1fSRoland Dreier 34225c7b1fSRoland Dreier #ifndef MLX4_IB_H 35225c7b1fSRoland Dreier #define MLX4_IB_H 36225c7b1fSRoland Dreier 37225c7b1fSRoland Dreier #include <linux/compiler.h> 38225c7b1fSRoland Dreier #include <linux/list.h> 3963019d93SMichael S. Tsirkin #include <linux/mutex.h> 40b9c5d6a6SOren Duer #include <linux/idr.h> 41225c7b1fSRoland Dreier 42225c7b1fSRoland Dreier #include <rdma/ib_verbs.h> 43225c7b1fSRoland Dreier #include <rdma/ib_umem.h> 44b9c5d6a6SOren Duer #include <rdma/ib_mad.h> 45a0c64a17SJack Morgenstein #include <rdma/ib_sa.h> 46225c7b1fSRoland Dreier 47225c7b1fSRoland Dreier #include <linux/mlx4/device.h> 48225c7b1fSRoland Dreier #include <linux/mlx4/doorbell.h> 493078f5f1SGuy Levi #include <linux/mlx4/qp.h> 5034d9a270SYonatan Cohen #include <linux/mlx4/cq.h> 51225c7b1fSRoland Dreier 52b1d8eb5aSJack Morgenstein #define MLX4_IB_DRV_NAME "mlx4_ib" 53b1d8eb5aSJack Morgenstein 54b1d8eb5aSJack Morgenstein #ifdef pr_fmt 55b1d8eb5aSJack Morgenstein #undef pr_fmt 56b1d8eb5aSJack Morgenstein #endif 57b1d8eb5aSJack Morgenstein #define pr_fmt(fmt) "<" MLX4_IB_DRV_NAME "> %s: " fmt, __func__ 58b1d8eb5aSJack Morgenstein 59b1d8eb5aSJack Morgenstein #define mlx4_ib_warn(ibdev, format, arg...) \ 60d66c88a8SBart Van Assche dev_warn((ibdev)->dev.parent, MLX4_IB_DRV_NAME ": " format, ## arg) 61b1d8eb5aSJack Morgenstein 62fc2d0044SSagi Grimberg enum { 63fc2d0044SSagi Grimberg MLX4_IB_SQ_MIN_WQE_SHIFT = 6, 64fc2d0044SSagi Grimberg MLX4_IB_MAX_HEADROOM = 2048 65fc2d0044SSagi Grimberg }; 66fc2d0044SSagi Grimberg 67fc2d0044SSagi Grimberg #define MLX4_IB_SQ_HEADROOM(shift) ((MLX4_IB_MAX_HEADROOM >> (shift)) + 1) 68fc2d0044SSagi Grimberg #define MLX4_IB_SQ_MAX_SPARE (MLX4_IB_SQ_HEADROOM(MLX4_IB_SQ_MIN_WQE_SHIFT)) 69fc2d0044SSagi Grimberg 70a0c64a17SJack Morgenstein /*module param to indicate if SM assigns the alias_GUID*/ 71a0c64a17SJack Morgenstein extern int mlx4_ib_sm_guid_assign; 72a0c64a17SJack Morgenstein 73c1c98501SMatan Barak #define MLX4_IB_UC_STEER_QPN_ALIGN 1 74c1c98501SMatan Barak #define MLX4_IB_UC_MAX_NUM_QPS 256 75ae184ddeSYishai Hadas 76ae184ddeSYishai Hadas enum hw_bar_type { 77ae184ddeSYishai Hadas HW_BAR_BF, 78ae184ddeSYishai Hadas HW_BAR_DB, 79ae184ddeSYishai Hadas HW_BAR_CLOCK, 80ae184ddeSYishai Hadas HW_BAR_COUNT 81ae184ddeSYishai Hadas }; 82ae184ddeSYishai Hadas 83225c7b1fSRoland Dreier struct mlx4_ib_ucontext { 84225c7b1fSRoland Dreier struct ib_ucontext ibucontext; 85225c7b1fSRoland Dreier struct mlx4_uar uar; 86225c7b1fSRoland Dreier struct list_head db_page_list; 87225c7b1fSRoland Dreier struct mutex db_page_mutex; 88400b1ebcSGuy Levi struct list_head wqn_ranges_list; 89400b1ebcSGuy Levi struct mutex wqn_ranges_mutex; /* protect wqn_ranges_list */ 90225c7b1fSRoland Dreier }; 91225c7b1fSRoland Dreier 92225c7b1fSRoland Dreier struct mlx4_ib_pd { 93225c7b1fSRoland Dreier struct ib_pd ibpd; 94225c7b1fSRoland Dreier u32 pdn; 95225c7b1fSRoland Dreier }; 96225c7b1fSRoland Dreier 97012a8ff5SSean Hefty struct mlx4_ib_xrcd { 98012a8ff5SSean Hefty struct ib_xrcd ibxrcd; 99012a8ff5SSean Hefty u32 xrcdn; 100012a8ff5SSean Hefty struct ib_pd *pd; 101012a8ff5SSean Hefty struct ib_cq *cq; 102012a8ff5SSean Hefty }; 103012a8ff5SSean Hefty 104225c7b1fSRoland Dreier struct mlx4_ib_cq_buf { 105225c7b1fSRoland Dreier struct mlx4_buf buf; 106225c7b1fSRoland Dreier struct mlx4_mtt mtt; 10708ff3235SOr Gerlitz int entry_size; 108225c7b1fSRoland Dreier }; 109225c7b1fSRoland Dreier 110bbf8eed1SVladimir Sokolovsky struct mlx4_ib_cq_resize { 111bbf8eed1SVladimir Sokolovsky struct mlx4_ib_cq_buf buf; 112bbf8eed1SVladimir Sokolovsky int cqe; 113bbf8eed1SVladimir Sokolovsky }; 114bbf8eed1SVladimir Sokolovsky 115225c7b1fSRoland Dreier struct mlx4_ib_cq { 116225c7b1fSRoland Dreier struct ib_cq ibcq; 117225c7b1fSRoland Dreier struct mlx4_cq mcq; 118225c7b1fSRoland Dreier struct mlx4_ib_cq_buf buf; 119bbf8eed1SVladimir Sokolovsky struct mlx4_ib_cq_resize *resize_buf; 1206296883cSYevgeny Petrilin struct mlx4_db db; 121225c7b1fSRoland Dreier spinlock_t lock; 122bbf8eed1SVladimir Sokolovsky struct mutex resize_mutex; 123225c7b1fSRoland Dreier struct ib_umem *umem; 124bbf8eed1SVladimir Sokolovsky struct ib_umem *resize_umem; 1254b664c43SMatan Barak int create_flags; 12635f05dabSYishai Hadas /* List of qps that it serves.*/ 12735f05dabSYishai Hadas struct list_head send_qp_list; 12835f05dabSYishai Hadas struct list_head recv_qp_list; 129225c7b1fSRoland Dreier }; 130225c7b1fSRoland Dreier 1311b2cd0fcSSagi Grimberg #define MLX4_MR_PAGES_ALIGN 0x40 1321b2cd0fcSSagi Grimberg 133225c7b1fSRoland Dreier struct mlx4_ib_mr { 134225c7b1fSRoland Dreier struct ib_mr ibmr; 1351b2cd0fcSSagi Grimberg __be64 *pages; 1361b2cd0fcSSagi Grimberg dma_addr_t page_map; 1371b2cd0fcSSagi Grimberg u32 npages; 1381b2cd0fcSSagi Grimberg u32 max_pages; 139225c7b1fSRoland Dreier struct mlx4_mr mmr; 140225c7b1fSRoland Dreier struct ib_umem *umem; 141cbc9355aSChuck Lever size_t page_map_size; 142225c7b1fSRoland Dreier }; 143225c7b1fSRoland Dreier 144804d6a89SShani Michaeli struct mlx4_ib_mw { 145804d6a89SShani Michaeli struct ib_mw ibmw; 146804d6a89SShani Michaeli struct mlx4_mw mmw; 147804d6a89SShani Michaeli }; 148804d6a89SShani Michaeli 149146d6e19SMoni Shoua #define MAX_REGS_PER_FLOW 2 150146d6e19SMoni Shoua 151146d6e19SMoni Shoua struct mlx4_flow_reg_id { 152146d6e19SMoni Shoua u64 id; 153146d6e19SMoni Shoua u64 mirror; 154146d6e19SMoni Shoua }; 155146d6e19SMoni Shoua 156f77c0162SHadar Hen Zion struct mlx4_ib_flow { 157f77c0162SHadar Hen Zion struct ib_flow ibflow; 158f77c0162SHadar Hen Zion /* translating DMFS verbs sniffer rule to FW API requires two reg IDs */ 159146d6e19SMoni Shoua struct mlx4_flow_reg_id reg_id[MAX_REGS_PER_FLOW]; 160f77c0162SHadar Hen Zion }; 161f77c0162SHadar Hen Zion 162225c7b1fSRoland Dreier struct mlx4_ib_wq { 163225c7b1fSRoland Dreier u64 *wrid; 164225c7b1fSRoland Dreier spinlock_t lock; 1650e6e7416SRoland Dreier int wqe_cnt; 1660e6e7416SRoland Dreier int max_post; 167225c7b1fSRoland Dreier int max_gs; 168225c7b1fSRoland Dreier int offset; 169225c7b1fSRoland Dreier int wqe_shift; 170225c7b1fSRoland Dreier unsigned head; 171225c7b1fSRoland Dreier unsigned tail; 172225c7b1fSRoland Dreier }; 173225c7b1fSRoland Dreier 174e1b866c6SMoni Shoua enum { 175e1b866c6SMoni Shoua MLX4_IB_QP_CREATE_ROCE_V2_GSI = IB_QP_CREATE_RESERVED_START 176e1b866c6SMoni Shoua }; 177e1b866c6SMoni Shoua 178b832be1eSEli Cohen enum mlx4_ib_qp_flags { 1791ffeb2ebSJack Morgenstein MLX4_IB_QP_LSO = IB_QP_CREATE_IPOIB_UD_LSO, 1801ffeb2ebSJack Morgenstein MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK = IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK, 181c1c98501SMatan Barak MLX4_IB_QP_NETIF = IB_QP_CREATE_NETIF_QP, 1826d06c9aaSGuy Levi MLX4_IB_QP_SCATTER_FCS = IB_QP_CREATE_SCATTER_FCS, 183e1b866c6SMoni Shoua 184e1b866c6SMoni Shoua /* Mellanox specific flags start from IB_QP_CREATE_RESERVED_START */ 185e1b866c6SMoni Shoua MLX4_IB_ROCE_V2_GSI_QP = MLX4_IB_QP_CREATE_ROCE_V2_GSI, 1861ffeb2ebSJack Morgenstein MLX4_IB_SRIOV_TUNNEL_QP = 1 << 30, 1871ffeb2ebSJack Morgenstein MLX4_IB_SRIOV_SQP = 1 << 31, 188b832be1eSEli Cohen }; 189b832be1eSEli Cohen 190fa417f7bSEli Cohen struct mlx4_ib_gid_entry { 191fa417f7bSEli Cohen struct list_head list; 192fa417f7bSEli Cohen union ib_gid gid; 193fa417f7bSEli Cohen int added; 194fa417f7bSEli Cohen u8 port; 195fa417f7bSEli Cohen }; 196fa417f7bSEli Cohen 1971ffeb2ebSJack Morgenstein enum mlx4_ib_qp_type { 1981ffeb2ebSJack Morgenstein /* 1991ffeb2ebSJack Morgenstein * IB_QPT_SMI and IB_QPT_GSI have to be the first two entries 2001ffeb2ebSJack Morgenstein * here (and in that order) since the MAD layer uses them as 2011ffeb2ebSJack Morgenstein * indices into a 2-entry table. 2021ffeb2ebSJack Morgenstein */ 2031ffeb2ebSJack Morgenstein MLX4_IB_QPT_SMI = IB_QPT_SMI, 2041ffeb2ebSJack Morgenstein MLX4_IB_QPT_GSI = IB_QPT_GSI, 2051ffeb2ebSJack Morgenstein 2061ffeb2ebSJack Morgenstein MLX4_IB_QPT_RC = IB_QPT_RC, 2071ffeb2ebSJack Morgenstein MLX4_IB_QPT_UC = IB_QPT_UC, 2081ffeb2ebSJack Morgenstein MLX4_IB_QPT_UD = IB_QPT_UD, 2091ffeb2ebSJack Morgenstein MLX4_IB_QPT_RAW_IPV6 = IB_QPT_RAW_IPV6, 2101ffeb2ebSJack Morgenstein MLX4_IB_QPT_RAW_ETHERTYPE = IB_QPT_RAW_ETHERTYPE, 2111ffeb2ebSJack Morgenstein MLX4_IB_QPT_RAW_PACKET = IB_QPT_RAW_PACKET, 2121ffeb2ebSJack Morgenstein MLX4_IB_QPT_XRC_INI = IB_QPT_XRC_INI, 2131ffeb2ebSJack Morgenstein MLX4_IB_QPT_XRC_TGT = IB_QPT_XRC_TGT, 2141ffeb2ebSJack Morgenstein 2151ffeb2ebSJack Morgenstein MLX4_IB_QPT_PROXY_SMI_OWNER = 1 << 16, 2161ffeb2ebSJack Morgenstein MLX4_IB_QPT_PROXY_SMI = 1 << 17, 2171ffeb2ebSJack Morgenstein MLX4_IB_QPT_PROXY_GSI = 1 << 18, 2181ffeb2ebSJack Morgenstein MLX4_IB_QPT_TUN_SMI_OWNER = 1 << 19, 2191ffeb2ebSJack Morgenstein MLX4_IB_QPT_TUN_SMI = 1 << 20, 2201ffeb2ebSJack Morgenstein MLX4_IB_QPT_TUN_GSI = 1 << 21, 2211ffeb2ebSJack Morgenstein }; 2221ffeb2ebSJack Morgenstein 2231ffeb2ebSJack Morgenstein #define MLX4_IB_QPT_ANY_SRIOV (MLX4_IB_QPT_PROXY_SMI_OWNER | \ 2241ffeb2ebSJack Morgenstein MLX4_IB_QPT_PROXY_SMI | MLX4_IB_QPT_PROXY_GSI | MLX4_IB_QPT_TUN_SMI_OWNER | \ 2251ffeb2ebSJack Morgenstein MLX4_IB_QPT_TUN_SMI | MLX4_IB_QPT_TUN_GSI) 2261ffeb2ebSJack Morgenstein 2270a9a0188SJack Morgenstein enum mlx4_ib_mad_ifc_flags { 2280a9a0188SJack Morgenstein MLX4_MAD_IFC_IGNORE_MKEY = 1, 2290a9a0188SJack Morgenstein MLX4_MAD_IFC_IGNORE_BKEY = 2, 2300a9a0188SJack Morgenstein MLX4_MAD_IFC_IGNORE_KEYS = (MLX4_MAD_IFC_IGNORE_MKEY | 2310a9a0188SJack Morgenstein MLX4_MAD_IFC_IGNORE_BKEY), 2320a9a0188SJack Morgenstein MLX4_MAD_IFC_NET_VIEW = 4, 2330a9a0188SJack Morgenstein }; 2340a9a0188SJack Morgenstein 235fc06573dSJack Morgenstein enum { 2360ae207fbSHåkon Bugge MLX4_NUM_TUNNEL_BUFS = 512, 2370ae207fbSHåkon Bugge MLX4_NUM_WIRE_BUFS = 2048, 238fc06573dSJack Morgenstein }; 239fc06573dSJack Morgenstein 2401ffeb2ebSJack Morgenstein struct mlx4_ib_tunnel_header { 2411ffeb2ebSJack Morgenstein struct mlx4_av av; 2421ffeb2ebSJack Morgenstein __be32 remote_qpn; 2431ffeb2ebSJack Morgenstein __be32 qkey; 2441ffeb2ebSJack Morgenstein __be16 vlan; 2451ffeb2ebSJack Morgenstein u8 mac[6]; 2461ffeb2ebSJack Morgenstein __be16 pkey_index; 2471ffeb2ebSJack Morgenstein u8 reserved[6]; 2481ffeb2ebSJack Morgenstein }; 2491ffeb2ebSJack Morgenstein 2501ffeb2ebSJack Morgenstein struct mlx4_ib_buf { 2511ffeb2ebSJack Morgenstein void *addr; 2521ffeb2ebSJack Morgenstein dma_addr_t map; 2531ffeb2ebSJack Morgenstein }; 2541ffeb2ebSJack Morgenstein 2551ffeb2ebSJack Morgenstein struct mlx4_rcv_tunnel_hdr { 2561ffeb2ebSJack Morgenstein __be32 flags_src_qp; /* flags[6:5] is defined for VLANs: 2571ffeb2ebSJack Morgenstein * 0x0 - no vlan was in the packet 2581ffeb2ebSJack Morgenstein * 0x01 - C-VLAN was in the packet */ 2591ffeb2ebSJack Morgenstein u8 g_ml_path; /* gid bit stands for ipv6/4 header in RoCE */ 2601ffeb2ebSJack Morgenstein u8 reserved; 2611ffeb2ebSJack Morgenstein __be16 pkey_index; 2621ffeb2ebSJack Morgenstein __be16 sl_vid; 2631ffeb2ebSJack Morgenstein __be16 slid_mac_47_32; 2641ffeb2ebSJack Morgenstein __be32 mac_31_0; 2651ffeb2ebSJack Morgenstein }; 2661ffeb2ebSJack Morgenstein 2671ffeb2ebSJack Morgenstein struct mlx4_ib_proxy_sqp_hdr { 2681ffeb2ebSJack Morgenstein struct ib_grh grh; 2691ffeb2ebSJack Morgenstein struct mlx4_rcv_tunnel_hdr tun; 2701ffeb2ebSJack Morgenstein } __packed; 2711ffeb2ebSJack Morgenstein 2722f5bb473SJack Morgenstein struct mlx4_roce_smac_vlan_info { 2732f5bb473SJack Morgenstein u64 smac; 2742f5bb473SJack Morgenstein int smac_index; 2752f5bb473SJack Morgenstein int smac_port; 2762f5bb473SJack Morgenstein u64 candidate_smac; 2772f5bb473SJack Morgenstein int candidate_smac_index; 2782f5bb473SJack Morgenstein int candidate_smac_port; 2792f5bb473SJack Morgenstein u16 vid; 2802f5bb473SJack Morgenstein int vlan_index; 2812f5bb473SJack Morgenstein int vlan_port; 2822f5bb473SJack Morgenstein u16 candidate_vid; 2832f5bb473SJack Morgenstein int candidate_vlan_index; 2842f5bb473SJack Morgenstein int candidate_vlan_port; 2852f5bb473SJack Morgenstein int update_vid; 2862f5bb473SJack Morgenstein }; 2872f5bb473SJack Morgenstein 288400b1ebcSGuy Levi struct mlx4_wqn_range { 289400b1ebcSGuy Levi int base_wqn; 290400b1ebcSGuy Levi int size; 291400b1ebcSGuy Levi int refcount; 292400b1ebcSGuy Levi bool dirty; 293400b1ebcSGuy Levi struct list_head list; 294400b1ebcSGuy Levi }; 295400b1ebcSGuy Levi 2963078f5f1SGuy Levi struct mlx4_ib_rss { 2973078f5f1SGuy Levi unsigned int base_qpn_tbl_sz; 2983078f5f1SGuy Levi u8 flags; 2993078f5f1SGuy Levi u8 rss_key[MLX4_EN_RSS_KEY_SIZE]; 3003078f5f1SGuy Levi }; 3013078f5f1SGuy Levi 302915ec7edSLeon Romanovsky enum { 303915ec7edSLeon Romanovsky /* 304915ec7edSLeon Romanovsky * Largest possible UD header: send with GRH and immediate 305915ec7edSLeon Romanovsky * data plus 18 bytes for an Ethernet header with VLAN/802.1Q 306915ec7edSLeon Romanovsky * tag. (LRH would only use 8 bytes, so Ethernet is the 307915ec7edSLeon Romanovsky * biggest case) 308915ec7edSLeon Romanovsky */ 309915ec7edSLeon Romanovsky MLX4_IB_UD_HEADER_SIZE = 82, 310915ec7edSLeon Romanovsky MLX4_IB_LSO_HEADER_SPARE = 128, 311915ec7edSLeon Romanovsky }; 312915ec7edSLeon Romanovsky 313915ec7edSLeon Romanovsky struct mlx4_ib_sqp { 314915ec7edSLeon Romanovsky int pkey_index; 315915ec7edSLeon Romanovsky u32 qkey; 316915ec7edSLeon Romanovsky u32 send_psn; 317915ec7edSLeon Romanovsky struct ib_ud_header ud_header; 318915ec7edSLeon Romanovsky u8 header_buf[MLX4_IB_UD_HEADER_SIZE]; 319915ec7edSLeon Romanovsky struct ib_qp *roce_v2_gsi; 320915ec7edSLeon Romanovsky }; 321915ec7edSLeon Romanovsky 322225c7b1fSRoland Dreier struct mlx4_ib_qp { 323400b1ebcSGuy Levi union { 324225c7b1fSRoland Dreier struct ib_qp ibqp; 325400b1ebcSGuy Levi struct ib_wq ibwq; 326400b1ebcSGuy Levi }; 327225c7b1fSRoland Dreier struct mlx4_qp mqp; 328225c7b1fSRoland Dreier struct mlx4_buf buf; 329225c7b1fSRoland Dreier 3306296883cSYevgeny Petrilin struct mlx4_db db; 331225c7b1fSRoland Dreier struct mlx4_ib_wq rq; 332225c7b1fSRoland Dreier 333225c7b1fSRoland Dreier u32 doorbell_qpn; 334225c7b1fSRoland Dreier __be32 sq_signal_bits; 335ea54b10cSJack Morgenstein unsigned sq_next_wqe; 3360e6e7416SRoland Dreier int sq_spare_wqes; 337225c7b1fSRoland Dreier struct mlx4_ib_wq sq; 338225c7b1fSRoland Dreier 3391ffeb2ebSJack Morgenstein enum mlx4_ib_qp_type mlx4_ib_qp_type; 340225c7b1fSRoland Dreier struct ib_umem *umem; 341225c7b1fSRoland Dreier struct mlx4_mtt mtt; 342225c7b1fSRoland Dreier int buf_size; 343225c7b1fSRoland Dreier struct mutex mutex; 3440a1405daSSean Hefty u16 xrcdn; 345b832be1eSEli Cohen u32 flags; 346225c7b1fSRoland Dreier u8 port; 347225c7b1fSRoland Dreier u8 alt_port; 348225c7b1fSRoland Dreier u8 atomic_rd_en; 349225c7b1fSRoland Dreier u8 resp_depth; 3500e6e7416SRoland Dreier u8 sq_no_prefetch; 351225c7b1fSRoland Dreier u8 state; 352fa417f7bSEli Cohen int mlx_type; 353ea30b966SMaor Gottlieb u32 inl_recv_sz; 354fa417f7bSEli Cohen struct list_head gid_list; 3550ff1fb65SHadar Hen Zion struct list_head steering_rules; 3561ffeb2ebSJack Morgenstein struct mlx4_ib_buf *sqp_proxy_rcv; 3572f5bb473SJack Morgenstein struct mlx4_roce_smac_vlan_info pri; 3582f5bb473SJack Morgenstein struct mlx4_roce_smac_vlan_info alt; 359c1c98501SMatan Barak u64 reg_id; 36035f05dabSYishai Hadas struct list_head qps_list; 36135f05dabSYishai Hadas struct list_head cq_recv_list; 36235f05dabSYishai Hadas struct list_head cq_send_list; 3637b59f0f9SEran Ben Elisha struct counter_index *counter_index; 364400b1ebcSGuy Levi struct mlx4_wqn_range *wqn_range; 365400b1ebcSGuy Levi /* Number of RSS QP parents that uses this WQ */ 366400b1ebcSGuy Levi u32 rss_usecnt; 367915ec7edSLeon Romanovsky union { 3683078f5f1SGuy Levi struct mlx4_ib_rss *rss_ctx; 369915ec7edSLeon Romanovsky struct mlx4_ib_sqp *sqp; 370915ec7edSLeon Romanovsky }; 371225c7b1fSRoland Dreier }; 372225c7b1fSRoland Dreier 373225c7b1fSRoland Dreier struct mlx4_ib_srq { 374225c7b1fSRoland Dreier struct ib_srq ibsrq; 375225c7b1fSRoland Dreier struct mlx4_srq msrq; 376225c7b1fSRoland Dreier struct mlx4_buf buf; 3776296883cSYevgeny Petrilin struct mlx4_db db; 378225c7b1fSRoland Dreier u64 *wrid; 379225c7b1fSRoland Dreier spinlock_t lock; 380225c7b1fSRoland Dreier int head; 381225c7b1fSRoland Dreier int tail; 382225c7b1fSRoland Dreier u16 wqe_ctr; 383225c7b1fSRoland Dreier struct ib_umem *umem; 384225c7b1fSRoland Dreier struct mlx4_mtt mtt; 385225c7b1fSRoland Dreier struct mutex mutex; 386225c7b1fSRoland Dreier }; 387225c7b1fSRoland Dreier 388225c7b1fSRoland Dreier struct mlx4_ib_ah { 389225c7b1fSRoland Dreier struct ib_ah ibah; 390fa417f7bSEli Cohen union mlx4_ext_av av; 391fa417f7bSEli Cohen }; 392fa417f7bSEli Cohen 393c0a6b5ecSLeon Romanovsky struct mlx4_ib_rwq_ind_table { 394c0a6b5ecSLeon Romanovsky struct ib_rwq_ind_table ib_rwq_ind_tbl; 395c0a6b5ecSLeon Romanovsky }; 396c0a6b5ecSLeon Romanovsky 397a0c64a17SJack Morgenstein /****************************************/ 398a0c64a17SJack Morgenstein /* alias guid support */ 399a0c64a17SJack Morgenstein /****************************************/ 400a0c64a17SJack Morgenstein #define NUM_PORT_ALIAS_GUID 2 401a0c64a17SJack Morgenstein #define NUM_ALIAS_GUID_IN_REC 8 402a0c64a17SJack Morgenstein #define NUM_ALIAS_GUID_REC_IN_PORT 16 403a0c64a17SJack Morgenstein #define GUID_REC_SIZE 8 404a0c64a17SJack Morgenstein #define NUM_ALIAS_GUID_PER_PORT 128 405a0c64a17SJack Morgenstein #define MLX4_NOT_SET_GUID (0x00LL) 406a0c64a17SJack Morgenstein #define MLX4_GUID_FOR_DELETE_VAL (~(0x00LL)) 407a0c64a17SJack Morgenstein 408a0c64a17SJack Morgenstein enum mlx4_guid_alias_rec_status { 409a0c64a17SJack Morgenstein MLX4_GUID_INFO_STATUS_IDLE, 410a0c64a17SJack Morgenstein MLX4_GUID_INFO_STATUS_SET, 411a0c64a17SJack Morgenstein }; 412a0c64a17SJack Morgenstein 413f5479601SYishai Hadas #define GUID_STATE_NEED_PORT_INIT 0x01 414a0c64a17SJack Morgenstein 415a0c64a17SJack Morgenstein enum mlx4_guid_alias_rec_method { 416a0c64a17SJack Morgenstein MLX4_GUID_INFO_RECORD_SET = IB_MGMT_METHOD_SET, 417a0c64a17SJack Morgenstein MLX4_GUID_INFO_RECORD_DELETE = IB_SA_METHOD_DELETE, 418a0c64a17SJack Morgenstein }; 419a0c64a17SJack Morgenstein 420a0c64a17SJack Morgenstein struct mlx4_sriov_alias_guid_info_rec_det { 421a0c64a17SJack Morgenstein u8 all_recs[GUID_REC_SIZE * NUM_ALIAS_GUID_IN_REC]; 422a0c64a17SJack Morgenstein ib_sa_comp_mask guid_indexes; /*indicates what from the 8 records are valid*/ 423a0c64a17SJack Morgenstein enum mlx4_guid_alias_rec_status status; /*indicates the administraively status of the record.*/ 42499ee4df6SYishai Hadas unsigned int guids_retry_schedule[NUM_ALIAS_GUID_IN_REC]; 42599ee4df6SYishai Hadas u64 time_to_run; 426a0c64a17SJack Morgenstein }; 427a0c64a17SJack Morgenstein 428a0c64a17SJack Morgenstein struct mlx4_sriov_alias_guid_port_rec_det { 429a0c64a17SJack Morgenstein struct mlx4_sriov_alias_guid_info_rec_det all_rec_per_port[NUM_ALIAS_GUID_REC_IN_PORT]; 430a0c64a17SJack Morgenstein struct workqueue_struct *wq; 431a0c64a17SJack Morgenstein struct delayed_work alias_guid_work; 4321fb7f897SMark Bloch u32 port; 433f5479601SYishai Hadas u32 state_flags; 434a0c64a17SJack Morgenstein struct mlx4_sriov_alias_guid *parent; 435a0c64a17SJack Morgenstein struct list_head cb_list; 436a0c64a17SJack Morgenstein }; 437a0c64a17SJack Morgenstein 438a0c64a17SJack Morgenstein struct mlx4_sriov_alias_guid { 439a0c64a17SJack Morgenstein struct mlx4_sriov_alias_guid_port_rec_det ports_guid[MLX4_MAX_PORTS]; 440a0c64a17SJack Morgenstein spinlock_t ag_work_lock; 441a0c64a17SJack Morgenstein struct ib_sa_client *sa_client; 442a0c64a17SJack Morgenstein }; 443a0c64a17SJack Morgenstein 444fc06573dSJack Morgenstein struct mlx4_ib_demux_work { 445fc06573dSJack Morgenstein struct work_struct work; 446fc06573dSJack Morgenstein struct mlx4_ib_dev *dev; 447fc06573dSJack Morgenstein int slave; 448fc06573dSJack Morgenstein int do_init; 449fc06573dSJack Morgenstein u8 port; 450fc06573dSJack Morgenstein 451fc06573dSJack Morgenstein }; 452fc06573dSJack Morgenstein 4531ffeb2ebSJack Morgenstein struct mlx4_ib_tun_tx_buf { 4541ffeb2ebSJack Morgenstein struct mlx4_ib_buf buf; 4551ffeb2ebSJack Morgenstein struct ib_ah *ah; 4561ffeb2ebSJack Morgenstein }; 4571ffeb2ebSJack Morgenstein 4581ffeb2ebSJack Morgenstein struct mlx4_ib_demux_pv_qp { 4591ffeb2ebSJack Morgenstein struct ib_qp *qp; 4601ffeb2ebSJack Morgenstein enum ib_qp_type proxy_qpt; 4611ffeb2ebSJack Morgenstein struct mlx4_ib_buf *ring; 4621ffeb2ebSJack Morgenstein struct mlx4_ib_tun_tx_buf *tx_ring; 4631ffeb2ebSJack Morgenstein spinlock_t tx_lock; 4641ffeb2ebSJack Morgenstein unsigned tx_ix_head; 4651ffeb2ebSJack Morgenstein unsigned tx_ix_tail; 4661ffeb2ebSJack Morgenstein }; 4671ffeb2ebSJack Morgenstein 468fc06573dSJack Morgenstein enum mlx4_ib_demux_pv_state { 469fc06573dSJack Morgenstein DEMUX_PV_STATE_DOWN, 470fc06573dSJack Morgenstein DEMUX_PV_STATE_STARTING, 471fc06573dSJack Morgenstein DEMUX_PV_STATE_ACTIVE, 472fc06573dSJack Morgenstein DEMUX_PV_STATE_DOWNING, 473fc06573dSJack Morgenstein }; 474fc06573dSJack Morgenstein 4751ffeb2ebSJack Morgenstein struct mlx4_ib_demux_pv_ctx { 4761ffeb2ebSJack Morgenstein int port; 4771ffeb2ebSJack Morgenstein int slave; 478fc06573dSJack Morgenstein enum mlx4_ib_demux_pv_state state; 4791ffeb2ebSJack Morgenstein int has_smi; 4801ffeb2ebSJack Morgenstein struct ib_device *ib_dev; 4811ffeb2ebSJack Morgenstein struct ib_cq *cq; 4821ffeb2ebSJack Morgenstein struct ib_pd *pd; 4831ffeb2ebSJack Morgenstein struct work_struct work; 4841ffeb2ebSJack Morgenstein struct workqueue_struct *wq; 4857fd1507dSHåkon Bugge struct workqueue_struct *wi_wq; 4861ffeb2ebSJack Morgenstein struct mlx4_ib_demux_pv_qp qp[2]; 4871ffeb2ebSJack Morgenstein }; 4881ffeb2ebSJack Morgenstein 4891ffeb2ebSJack Morgenstein struct mlx4_ib_demux_ctx { 4901ffeb2ebSJack Morgenstein struct ib_device *ib_dev; 4911ffeb2ebSJack Morgenstein int port; 4921ffeb2ebSJack Morgenstein struct workqueue_struct *wq; 4937fd1507dSHåkon Bugge struct workqueue_struct *wi_wq; 4941ffeb2ebSJack Morgenstein struct workqueue_struct *ud_wq; 4951ffeb2ebSJack Morgenstein spinlock_t ud_lock; 4968ec07bf8SJack Morgenstein atomic64_t subnet_prefix; 4971ffeb2ebSJack Morgenstein __be64 guid_cache[128]; 4981ffeb2ebSJack Morgenstein struct mlx4_ib_dev *dev; 499b9c5d6a6SOren Duer /* the following lock protects both mcg_table and mcg_mgid0_list */ 500b9c5d6a6SOren Duer struct mutex mcg_table_lock; 501b9c5d6a6SOren Duer struct rb_root mcg_table; 502b9c5d6a6SOren Duer struct list_head mcg_mgid0_list; 503b9c5d6a6SOren Duer struct workqueue_struct *mcg_wq; 5041ffeb2ebSJack Morgenstein struct mlx4_ib_demux_pv_ctx **tun; 505b9c5d6a6SOren Duer atomic_t tid; 506b9c5d6a6SOren Duer int flushing; /* flushing the work queue */ 5071ffeb2ebSJack Morgenstein }; 5081ffeb2ebSJack Morgenstein 5091ffeb2ebSJack Morgenstein struct mlx4_ib_sriov { 5101ffeb2ebSJack Morgenstein struct mlx4_ib_demux_ctx demux[MLX4_MAX_PORTS]; 5111ffeb2ebSJack Morgenstein struct mlx4_ib_demux_pv_ctx *sqps[MLX4_MAX_PORTS]; 5121ffeb2ebSJack Morgenstein /* when using this spinlock you should use "irq" because 5131ffeb2ebSJack Morgenstein * it may be called from interrupt context.*/ 5141ffeb2ebSJack Morgenstein spinlock_t going_down_lock; 5151ffeb2ebSJack Morgenstein int is_going_down; 5163cf69cc8SAmir Vadai 517a0c64a17SJack Morgenstein struct mlx4_sriov_alias_guid alias_guid; 518a0c64a17SJack Morgenstein 5193cf69cc8SAmir Vadai /* CM paravirtualization fields */ 520f1430536SMatthew Wilcox struct xarray pv_id_table; 521f1430536SMatthew Wilcox u32 pv_id_next; 5223cf69cc8SAmir Vadai spinlock_t id_map_lock; 5233cf69cc8SAmir Vadai struct rb_root sl_id_map; 524f1430536SMatthew Wilcox struct list_head cm_list; 525bf6a4764SHåkon Bugge struct xarray xa_rej_tmout; 5261ffeb2ebSJack Morgenstein }; 5271ffeb2ebSJack Morgenstein 528e26be1bfSMoni Shoua struct gid_cache_context { 529e26be1bfSMoni Shoua int real_index; 530e26be1bfSMoni Shoua int refcount; 531e26be1bfSMoni Shoua }; 532e26be1bfSMoni Shoua 533e26be1bfSMoni Shoua struct gid_entry { 534e26be1bfSMoni Shoua union ib_gid gid; 535b699a859SMoni Shoua enum ib_gid_type gid_type; 536e26be1bfSMoni Shoua struct gid_cache_context *ctx; 537ff3195b3SDanit Goldberg u16 vlan_id; 538e26be1bfSMoni Shoua }; 539e26be1bfSMoni Shoua 540e26be1bfSMoni Shoua struct mlx4_port_gid_table { 541e26be1bfSMoni Shoua struct gid_entry gids[MLX4_MAX_PORT_GIDS]; 542e26be1bfSMoni Shoua }; 543e26be1bfSMoni Shoua 544fa417f7bSEli Cohen struct mlx4_ib_iboe { 545fa417f7bSEli Cohen spinlock_t lock; 546fa417f7bSEli Cohen struct net_device *netdevs[MLX4_MAX_PORTS]; 5473e0629cbSJack Morgenstein atomic64_t mac[MLX4_MAX_PORTS]; 548fa417f7bSEli Cohen struct notifier_block nb; 549e26be1bfSMoni Shoua struct mlx4_port_gid_table gids[MLX4_MAX_PORTS]; 550fc6526fbSUrsula Braun enum ib_port_state last_port_state[MLX4_MAX_PORTS]; 551225c7b1fSRoland Dreier }; 552225c7b1fSRoland Dreier 553fc06573dSJack Morgenstein struct pkey_mgt { 554fc06573dSJack Morgenstein u8 virt2phys_pkey[MLX4_MFUNC_MAX][MLX4_MAX_PORTS][MLX4_MAX_PORT_PKEYS]; 555fc06573dSJack Morgenstein u16 phys_pkey_cache[MLX4_MAX_PORTS][MLX4_MAX_PORT_PKEYS]; 556fc06573dSJack Morgenstein struct list_head pkey_port_list[MLX4_MFUNC_MAX]; 557fc06573dSJack Morgenstein struct kobject *device_parent[MLX4_MFUNC_MAX]; 558fc06573dSJack Morgenstein }; 559fc06573dSJack Morgenstein 560c1e7e466SJack Morgenstein struct mlx4_ib_iov_sysfs_attr { 561c1e7e466SJack Morgenstein void *ctx; 562c1e7e466SJack Morgenstein struct kobject *kobj; 563c1e7e466SJack Morgenstein unsigned long data; 564c1e7e466SJack Morgenstein u32 entry_num; 565c1e7e466SJack Morgenstein char name[15]; 566c1e7e466SJack Morgenstein struct device_attribute dentry; 567c1e7e466SJack Morgenstein struct device *dev; 568c1e7e466SJack Morgenstein }; 569c1e7e466SJack Morgenstein 570c1e7e466SJack Morgenstein struct mlx4_ib_iov_sysfs_attr_ar { 571c1e7e466SJack Morgenstein struct mlx4_ib_iov_sysfs_attr dentries[3 * NUM_ALIAS_GUID_PER_PORT + 1]; 572c1e7e466SJack Morgenstein }; 573c1e7e466SJack Morgenstein 574c1e7e466SJack Morgenstein struct mlx4_ib_iov_port { 575c1e7e466SJack Morgenstein char name[100]; 576c1e7e466SJack Morgenstein u8 num; 577c1e7e466SJack Morgenstein struct mlx4_ib_dev *dev; 578c1e7e466SJack Morgenstein struct list_head list; 579c1e7e466SJack Morgenstein struct mlx4_ib_iov_sysfs_attr_ar *dentr_ar; 580c1e7e466SJack Morgenstein struct ib_port_attr attr; 581c1e7e466SJack Morgenstein struct kobject *cur_port; 582c1e7e466SJack Morgenstein struct kobject *admin_alias_parent; 583c1e7e466SJack Morgenstein struct kobject *gids_parent; 584c1e7e466SJack Morgenstein struct kobject *pkeys_parent; 585c1e7e466SJack Morgenstein struct kobject *mcgs_parent; 586c1e7e466SJack Morgenstein struct mlx4_ib_iov_sysfs_attr mcg_dentry; 587c1e7e466SJack Morgenstein }; 588c1e7e466SJack Morgenstein 589c3abb51bSEran Ben Elisha struct counter_index { 5903ba8e31dSEran Ben Elisha struct list_head list; 591c3abb51bSEran Ben Elisha u32 index; 592c3abb51bSEran Ben Elisha u8 allocated; 593c3abb51bSEran Ben Elisha }; 594c3abb51bSEran Ben Elisha 5953ba8e31dSEran Ben Elisha struct mlx4_ib_counters { 5963ba8e31dSEran Ben Elisha struct list_head counters_list; 5973ba8e31dSEran Ben Elisha struct mutex mutex; /* mutex for accessing counters list */ 5983ba8e31dSEran Ben Elisha u32 default_counter; 5993ba8e31dSEran Ben Elisha }; 6003ba8e31dSEran Ben Elisha 6013f85f2aaSMark Bloch #define MLX4_DIAG_COUNTERS_TYPES 2 6023f85f2aaSMark Bloch 6033f85f2aaSMark Bloch struct mlx4_ib_diag_counters { 60413f30b0fSAharon Landau struct rdma_stat_desc *descs; 6053f85f2aaSMark Bloch u32 *offset; 6063f85f2aaSMark Bloch u32 num_counters; 6073f85f2aaSMark Bloch }; 6083f85f2aaSMark Bloch 609225c7b1fSRoland Dreier struct mlx4_ib_dev { 610225c7b1fSRoland Dreier struct ib_device ib_dev; 611225c7b1fSRoland Dreier struct mlx4_dev *dev; 6127ff93f8bSYevgeny Petrilin int num_ports; 613225c7b1fSRoland Dreier void __iomem *uar_map; 614225c7b1fSRoland Dreier 615225c7b1fSRoland Dreier struct mlx4_uar priv_uar; 616225c7b1fSRoland Dreier u32 priv_pdn; 617225c7b1fSRoland Dreier MLX4_DECLARE_DOORBELL_LOCK(uar_lock); 618225c7b1fSRoland Dreier 619225c7b1fSRoland Dreier struct ib_mad_agent *send_agent[MLX4_MAX_PORTS][2]; 620225c7b1fSRoland Dreier struct ib_ah *sm_ah[MLX4_MAX_PORTS]; 621225c7b1fSRoland Dreier spinlock_t sm_lock; 622fd10ed8eSJack Morgenstein atomic64_t sl2vl[MLX4_MAX_PORTS]; 6231ffeb2ebSJack Morgenstein struct mlx4_ib_sriov sriov; 624225c7b1fSRoland Dreier 625225c7b1fSRoland Dreier struct mutex cap_mask_mutex; 6263b4a8cd5SJack Morgenstein bool ib_active; 627fa417f7bSEli Cohen struct mlx4_ib_iboe iboe; 6283ba8e31dSEran Ben Elisha struct mlx4_ib_counters counters_table[MLX4_MAX_PORTS]; 629e605b743SShlomo Pongratz int *eq_table; 630c1e7e466SJack Morgenstein struct kobject *iov_parent; 631c1e7e466SJack Morgenstein struct kobject *ports_parent; 632c1e7e466SJack Morgenstein struct kobject *dev_ports_parent[MLX4_MFUNC_MAX]; 633c1e7e466SJack Morgenstein struct mlx4_ib_iov_port iov_ports[MLX4_MAX_PORTS]; 634fc06573dSJack Morgenstein struct pkey_mgt pkeys; 635c1c98501SMatan Barak unsigned long *ib_uc_qpns_bitmap; 636c1c98501SMatan Barak int steer_qpn_count; 637c1c98501SMatan Barak int steer_qpn_base; 6380a9b7d59SMatan Barak int steering_support; 6399433c188SMatan Barak struct mlx4_ib_qp *qp1_proxy[MLX4_MAX_PORTS]; 6409433c188SMatan Barak /* lock when destroying qp1_proxy and getting netdev events */ 6419433c188SMatan Barak struct mutex qp1_proxy_lock[MLX4_MAX_PORTS]; 642c6215745SMoni Shoua u8 bond_next_port; 64335f05dabSYishai Hadas /* protect resources needed as part of reset flow */ 64435f05dabSYishai Hadas spinlock_t reset_flow_resource_lock; 64535f05dabSYishai Hadas struct list_head qp_list; 6463f85f2aaSMark Bloch struct mlx4_ib_diag_counters diag_counters[MLX4_DIAG_COUNTERS_TYPES]; 647225c7b1fSRoland Dreier }; 648225c7b1fSRoland Dreier 64900f5ce99SJack Morgenstein struct ib_event_work { 65000f5ce99SJack Morgenstein struct work_struct work; 65100f5ce99SJack Morgenstein struct mlx4_ib_dev *ib_dev; 65200f5ce99SJack Morgenstein struct mlx4_eqe ib_eqe; 653fd10ed8eSJack Morgenstein int port; 65400f5ce99SJack Morgenstein }; 65500f5ce99SJack Morgenstein 6561ffeb2ebSJack Morgenstein struct mlx4_ib_qp_tunnel_init_attr { 6571ffeb2ebSJack Morgenstein struct ib_qp_init_attr init_attr; 6581ffeb2ebSJack Morgenstein int slave; 6591ffeb2ebSJack Morgenstein enum ib_qp_type proxy_qp_type; 6601fb7f897SMark Bloch u32 port; 6611ffeb2ebSJack Morgenstein }; 6621ffeb2ebSJack Morgenstein 6634b664c43SMatan Barak struct mlx4_uverbs_ex_query_device { 6644b664c43SMatan Barak __u32 comp_mask; 6654b664c43SMatan Barak __u32 reserved; 6664b664c43SMatan Barak }; 6674b664c43SMatan Barak 668225c7b1fSRoland Dreier static inline struct mlx4_ib_dev *to_mdev(struct ib_device *ibdev) 669225c7b1fSRoland Dreier { 670225c7b1fSRoland Dreier return container_of(ibdev, struct mlx4_ib_dev, ib_dev); 671225c7b1fSRoland Dreier } 672225c7b1fSRoland Dreier 673225c7b1fSRoland Dreier static inline struct mlx4_ib_ucontext *to_mucontext(struct ib_ucontext *ibucontext) 674225c7b1fSRoland Dreier { 675225c7b1fSRoland Dreier return container_of(ibucontext, struct mlx4_ib_ucontext, ibucontext); 676225c7b1fSRoland Dreier } 677225c7b1fSRoland Dreier 678225c7b1fSRoland Dreier static inline struct mlx4_ib_pd *to_mpd(struct ib_pd *ibpd) 679225c7b1fSRoland Dreier { 680225c7b1fSRoland Dreier return container_of(ibpd, struct mlx4_ib_pd, ibpd); 681225c7b1fSRoland Dreier } 682225c7b1fSRoland Dreier 683012a8ff5SSean Hefty static inline struct mlx4_ib_xrcd *to_mxrcd(struct ib_xrcd *ibxrcd) 684012a8ff5SSean Hefty { 685012a8ff5SSean Hefty return container_of(ibxrcd, struct mlx4_ib_xrcd, ibxrcd); 686012a8ff5SSean Hefty } 687012a8ff5SSean Hefty 688225c7b1fSRoland Dreier static inline struct mlx4_ib_cq *to_mcq(struct ib_cq *ibcq) 689225c7b1fSRoland Dreier { 690225c7b1fSRoland Dreier return container_of(ibcq, struct mlx4_ib_cq, ibcq); 691225c7b1fSRoland Dreier } 692225c7b1fSRoland Dreier 693225c7b1fSRoland Dreier static inline struct mlx4_ib_cq *to_mibcq(struct mlx4_cq *mcq) 694225c7b1fSRoland Dreier { 695225c7b1fSRoland Dreier return container_of(mcq, struct mlx4_ib_cq, mcq); 696225c7b1fSRoland Dreier } 697225c7b1fSRoland Dreier 698225c7b1fSRoland Dreier static inline struct mlx4_ib_mr *to_mmr(struct ib_mr *ibmr) 699225c7b1fSRoland Dreier { 700225c7b1fSRoland Dreier return container_of(ibmr, struct mlx4_ib_mr, ibmr); 701225c7b1fSRoland Dreier } 702225c7b1fSRoland Dreier 703804d6a89SShani Michaeli static inline struct mlx4_ib_mw *to_mmw(struct ib_mw *ibmw) 704804d6a89SShani Michaeli { 705804d6a89SShani Michaeli return container_of(ibmw, struct mlx4_ib_mw, ibmw); 706804d6a89SShani Michaeli } 707804d6a89SShani Michaeli 708f77c0162SHadar Hen Zion static inline struct mlx4_ib_flow *to_mflow(struct ib_flow *ibflow) 709f77c0162SHadar Hen Zion { 710f77c0162SHadar Hen Zion return container_of(ibflow, struct mlx4_ib_flow, ibflow); 711f77c0162SHadar Hen Zion } 712f77c0162SHadar Hen Zion 713225c7b1fSRoland Dreier static inline struct mlx4_ib_qp *to_mqp(struct ib_qp *ibqp) 714225c7b1fSRoland Dreier { 715225c7b1fSRoland Dreier return container_of(ibqp, struct mlx4_ib_qp, ibqp); 716225c7b1fSRoland Dreier } 717225c7b1fSRoland Dreier 718225c7b1fSRoland Dreier static inline struct mlx4_ib_qp *to_mibqp(struct mlx4_qp *mqp) 719225c7b1fSRoland Dreier { 720225c7b1fSRoland Dreier return container_of(mqp, struct mlx4_ib_qp, mqp); 721225c7b1fSRoland Dreier } 722225c7b1fSRoland Dreier 723225c7b1fSRoland Dreier static inline struct mlx4_ib_srq *to_msrq(struct ib_srq *ibsrq) 724225c7b1fSRoland Dreier { 725225c7b1fSRoland Dreier return container_of(ibsrq, struct mlx4_ib_srq, ibsrq); 726225c7b1fSRoland Dreier } 727225c7b1fSRoland Dreier 728225c7b1fSRoland Dreier static inline struct mlx4_ib_srq *to_mibsrq(struct mlx4_srq *msrq) 729225c7b1fSRoland Dreier { 730225c7b1fSRoland Dreier return container_of(msrq, struct mlx4_ib_srq, msrq); 731225c7b1fSRoland Dreier } 732225c7b1fSRoland Dreier 733225c7b1fSRoland Dreier static inline struct mlx4_ib_ah *to_mah(struct ib_ah *ibah) 734225c7b1fSRoland Dreier { 735225c7b1fSRoland Dreier return container_of(ibah, struct mlx4_ib_ah, ibah); 736225c7b1fSRoland Dreier } 737225c7b1fSRoland Dreier 738c6215745SMoni Shoua static inline u8 mlx4_ib_bond_next_port(struct mlx4_ib_dev *dev) 739c6215745SMoni Shoua { 740c6215745SMoni Shoua dev->bond_next_port = (dev->bond_next_port + 1) % dev->num_ports; 741c6215745SMoni Shoua 742c6215745SMoni Shoua return dev->bond_next_port + 1; 743c6215745SMoni Shoua } 744c6215745SMoni Shoua 745fc06573dSJack Morgenstein int mlx4_ib_init_sriov(struct mlx4_ib_dev *dev); 746fc06573dSJack Morgenstein void mlx4_ib_close_sriov(struct mlx4_ib_dev *dev); 747fc06573dSJack Morgenstein 748ff23dfa1SShamir Rabinovitch int mlx4_ib_db_map_user(struct ib_udata *udata, unsigned long virt, 7496296883cSYevgeny Petrilin struct mlx4_db *db); 7506296883cSYevgeny Petrilin void mlx4_ib_db_unmap_user(struct mlx4_ib_ucontext *context, struct mlx4_db *db); 751225c7b1fSRoland Dreier 752225c7b1fSRoland Dreier struct ib_mr *mlx4_ib_get_dma_mr(struct ib_pd *pd, int acc); 753225c7b1fSRoland Dreier int mlx4_ib_umem_write_mtt(struct mlx4_ib_dev *dev, struct mlx4_mtt *mtt, 754225c7b1fSRoland Dreier struct ib_umem *umem); 755225c7b1fSRoland Dreier struct ib_mr *mlx4_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, 756225c7b1fSRoland Dreier u64 virt_addr, int access_flags, 757225c7b1fSRoland Dreier struct ib_udata *udata); 758c4367a26SShamir Rabinovitch int mlx4_ib_dereg_mr(struct ib_mr *mr, struct ib_udata *udata); 759d18bb3e1SLeon Romanovsky int mlx4_ib_alloc_mw(struct ib_mw *mw, struct ib_udata *udata); 760804d6a89SShani Michaeli int mlx4_ib_dealloc_mw(struct ib_mw *mw); 761c4367a26SShamir Rabinovitch struct ib_mr *mlx4_ib_alloc_mr(struct ib_pd *pd, enum ib_mr_type mr_type, 76242a3b153SGal Pressman u32 max_num_sg); 763ff2ba993SChristoph Hellwig int mlx4_ib_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents, 7649aa8b321SBart Van Assche unsigned int *sg_offset); 7653fdcb97fSEli Cohen int mlx4_ib_modify_cq(struct ib_cq *cq, u16 cq_count, u16 cq_period); 766bbf8eed1SVladimir Sokolovsky int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata); 767e39afe3dSLeon Romanovsky int mlx4_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, 768225c7b1fSRoland Dreier struct ib_udata *udata); 76943d781b9SLeon Romanovsky int mlx4_ib_destroy_cq(struct ib_cq *cq, struct ib_udata *udata); 770225c7b1fSRoland Dreier int mlx4_ib_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc); 771225c7b1fSRoland Dreier int mlx4_ib_arm_cq(struct ib_cq *cq, enum ib_cq_notify_flags flags); 772225c7b1fSRoland Dreier void __mlx4_ib_cq_clean(struct mlx4_ib_cq *cq, u32 qpn, struct mlx4_ib_srq *srq); 773225c7b1fSRoland Dreier void mlx4_ib_cq_clean(struct mlx4_ib_cq *cq, u32 qpn, struct mlx4_ib_srq *srq); 774225c7b1fSRoland Dreier 775fa5d010cSMaor Gottlieb int mlx4_ib_create_ah(struct ib_ah *ah, struct rdma_ah_init_attr *init_attr, 776d3456914SLeon Romanovsky struct ib_udata *udata); 777d3456914SLeon Romanovsky int mlx4_ib_create_ah_slave(struct ib_ah *ah, struct rdma_ah_attr *ah_attr, 778d3456914SLeon Romanovsky int slave_sgid_index, u8 *s_mac, u16 vlan_tag); 77990898850SDasaratharaman Chandramouli int mlx4_ib_query_ah(struct ib_ah *ibah, struct rdma_ah_attr *ah_attr); 7809a9ebf8cSLeon Romanovsky static inline int mlx4_ib_destroy_ah(struct ib_ah *ah, u32 flags) 7819a9ebf8cSLeon Romanovsky { 7829a9ebf8cSLeon Romanovsky return 0; 7839a9ebf8cSLeon Romanovsky } 784225c7b1fSRoland Dreier 78568e326deSLeon Romanovsky int mlx4_ib_create_srq(struct ib_srq *srq, struct ib_srq_init_attr *init_attr, 786225c7b1fSRoland Dreier struct ib_udata *udata); 787225c7b1fSRoland Dreier int mlx4_ib_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr, 788225c7b1fSRoland Dreier enum ib_srq_attr_mask attr_mask, struct ib_udata *udata); 78965541cb7SJack Morgenstein int mlx4_ib_query_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr); 790119181d1SLeon Romanovsky int mlx4_ib_destroy_srq(struct ib_srq *srq, struct ib_udata *udata); 791225c7b1fSRoland Dreier void mlx4_ib_free_srq_wqe(struct mlx4_ib_srq *srq, int wqe_index); 792d34ac5cdSBart Van Assche int mlx4_ib_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr, 793d34ac5cdSBart Van Assche const struct ib_recv_wr **bad_wr); 794225c7b1fSRoland Dreier 795514aee66SLeon Romanovsky int mlx4_ib_create_qp(struct ib_qp *qp, struct ib_qp_init_attr *init_attr, 796225c7b1fSRoland Dreier struct ib_udata *udata); 797c4367a26SShamir Rabinovitch int mlx4_ib_destroy_qp(struct ib_qp *qp, struct ib_udata *udata); 7981975acd9SYishai Hadas void mlx4_ib_drain_sq(struct ib_qp *qp); 7991975acd9SYishai Hadas void mlx4_ib_drain_rq(struct ib_qp *qp); 800225c7b1fSRoland Dreier int mlx4_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, 801225c7b1fSRoland Dreier int attr_mask, struct ib_udata *udata); 8026a775e2bSJack Morgenstein int mlx4_ib_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr, int qp_attr_mask, 8036a775e2bSJack Morgenstein struct ib_qp_init_attr *qp_init_attr); 804d34ac5cdSBart Van Assche int mlx4_ib_post_send(struct ib_qp *ibqp, const struct ib_send_wr *wr, 805d34ac5cdSBart Van Assche const struct ib_send_wr **bad_wr); 806d34ac5cdSBart Van Assche int mlx4_ib_post_recv(struct ib_qp *ibqp, const struct ib_recv_wr *wr, 807d34ac5cdSBart Van Assche const struct ib_recv_wr **bad_wr); 808225c7b1fSRoland Dreier 8090a9a0188SJack Morgenstein int mlx4_MAD_IFC(struct mlx4_ib_dev *dev, int mad_ifc_flags, 810a97e2d86SIra Weiny int port, const struct ib_wc *in_wc, const struct ib_grh *in_grh, 811a97e2d86SIra Weiny const void *in_mad, void *response_mad); 8121fb7f897SMark Bloch int mlx4_ib_process_mad(struct ib_device *ibdev, int mad_flags, u32 port_num, 813a97e2d86SIra Weiny const struct ib_wc *in_wc, const struct ib_grh *in_grh, 814e26e7b88SLeon Romanovsky const struct ib_mad *in, struct ib_mad *out, 815e26e7b88SLeon Romanovsky size_t *out_mad_size, u16 *out_mad_pkey_index); 816225c7b1fSRoland Dreier int mlx4_ib_mad_init(struct mlx4_ib_dev *dev); 817225c7b1fSRoland Dreier void mlx4_ib_mad_cleanup(struct mlx4_ib_dev *dev); 818225c7b1fSRoland Dreier 8191fb7f897SMark Bloch int __mlx4_ib_query_port(struct ib_device *ibdev, u32 port, 8200a9a0188SJack Morgenstein struct ib_port_attr *props, int netw_view); 8211fb7f897SMark Bloch int __mlx4_ib_query_pkey(struct ib_device *ibdev, u32 port, u16 index, 8220a9a0188SJack Morgenstein u16 *pkey, int netw_view); 8238ad11fb6SJack Morgenstein 8241fb7f897SMark Bloch int __mlx4_ib_query_gid(struct ib_device *ibdev, u32 port, int index, 825a0c64a17SJack Morgenstein union ib_gid *gid, int netw_view); 826a0c64a17SJack Morgenstein 827a29bec12SRoland Dreier static inline bool mlx4_ib_ah_grh_present(struct mlx4_ib_ah *ah) 828225c7b1fSRoland Dreier { 8291fb7f897SMark Bloch u32 port = be32_to_cpu(ah->av.ib.port_pd) >> 24 & 3; 830fa417f7bSEli Cohen 831fa417f7bSEli Cohen if (rdma_port_get_link_layer(ah->ibah.device, port) == IB_LINK_LAYER_ETHERNET) 832a29bec12SRoland Dreier return true; 833fa417f7bSEli Cohen 834fa417f7bSEli Cohen return !!(ah->av.ib.g_slid & 0x80); 835225c7b1fSRoland Dreier } 836225c7b1fSRoland Dreier 837b9c5d6a6SOren Duer int mlx4_ib_mcg_port_init(struct mlx4_ib_demux_ctx *ctx); 838b9c5d6a6SOren Duer void mlx4_ib_mcg_port_cleanup(struct mlx4_ib_demux_ctx *ctx, int destroy_wq); 839b9c5d6a6SOren Duer void clean_vf_mcast(struct mlx4_ib_demux_ctx *ctx, int slave); 840b9c5d6a6SOren Duer int mlx4_ib_mcg_init(void); 841b9c5d6a6SOren Duer void mlx4_ib_mcg_destroy(void); 842b9c5d6a6SOren Duer 8431fb7f897SMark Bloch int mlx4_ib_find_real_gid(struct ib_device *ibdev, u32 port, __be64 guid); 844b9c5d6a6SOren Duer 845b9c5d6a6SOren Duer int mlx4_ib_mcg_multiplex_handler(struct ib_device *ibdev, int port, int slave, 846b9c5d6a6SOren Duer struct ib_sa_mad *sa_mad); 847b9c5d6a6SOren Duer int mlx4_ib_mcg_demux_handler(struct ib_device *ibdev, int port, int slave, 848b9c5d6a6SOren Duer struct ib_sa_mad *mad); 849b9c5d6a6SOren Duer 850fa417f7bSEli Cohen int mlx4_ib_add_mc(struct mlx4_ib_dev *mdev, struct mlx4_ib_qp *mqp, 851fa417f7bSEli Cohen union ib_gid *gid); 852fa417f7bSEli Cohen 8531fb7f897SMark Bloch void mlx4_ib_dispatch_event(struct mlx4_ib_dev *dev, u32 port_num, 85400f5ce99SJack Morgenstein enum ib_event_type type); 85500f5ce99SJack Morgenstein 856fc06573dSJack Morgenstein void mlx4_ib_tunnels_update_work(struct work_struct *work); 857fc06573dSJack Morgenstein 8581fb7f897SMark Bloch int mlx4_ib_send_to_slave(struct mlx4_ib_dev *dev, int slave, u32 port, 859b9c5d6a6SOren Duer enum ib_qp_type qpt, struct ib_wc *wc, 860b9c5d6a6SOren Duer struct ib_grh *grh, struct ib_mad *mad); 8615ea8bbfcSJack Morgenstein 8621fb7f897SMark Bloch int mlx4_ib_send_to_wire(struct mlx4_ib_dev *dev, int slave, u32 port, 863b9c5d6a6SOren Duer enum ib_qp_type dest_qpt, u16 pkey_index, u32 remote_qpn, 86490898850SDasaratharaman Chandramouli u32 qkey, struct rdma_ah_attr *attr, u8 *s_mac, 865dbf727deSMatan Barak u16 vlan_id, struct ib_mad *mad); 8665ea8bbfcSJack Morgenstein 867b9c5d6a6SOren Duer __be64 mlx4_ib_get_new_demux_tid(struct mlx4_ib_demux_ctx *ctx); 868b9c5d6a6SOren Duer 8693cf69cc8SAmir Vadai int mlx4_ib_demux_cm_handler(struct ib_device *ibdev, int port, int *slave, 8703cf69cc8SAmir Vadai struct ib_mad *mad); 8713cf69cc8SAmir Vadai 8723cf69cc8SAmir Vadai int mlx4_ib_multiplex_cm_handler(struct ib_device *ibdev, int port, int slave_id, 8733cf69cc8SAmir Vadai struct ib_mad *mad); 8743cf69cc8SAmir Vadai 8753cf69cc8SAmir Vadai void mlx4_ib_cm_paravirt_init(struct mlx4_ib_dev *dev); 8763cf69cc8SAmir Vadai void mlx4_ib_cm_paravirt_clean(struct mlx4_ib_dev *dev, int slave_id); 8773cf69cc8SAmir Vadai 878a0c64a17SJack Morgenstein /* alias guid support */ 879a0c64a17SJack Morgenstein void mlx4_ib_init_alias_guid_work(struct mlx4_ib_dev *dev, int port); 880a0c64a17SJack Morgenstein int mlx4_ib_init_alias_guid_service(struct mlx4_ib_dev *dev); 881a0c64a17SJack Morgenstein void mlx4_ib_destroy_alias_guid_service(struct mlx4_ib_dev *dev); 882a0c64a17SJack Morgenstein void mlx4_ib_invalidate_all_guid_record(struct mlx4_ib_dev *dev, int port); 883a0c64a17SJack Morgenstein 884a0c64a17SJack Morgenstein void mlx4_ib_notify_slaves_on_guid_change(struct mlx4_ib_dev *dev, 885a0c64a17SJack Morgenstein int block_num, 8861fb7f897SMark Bloch u32 port_num, u8 *p_data); 887a0c64a17SJack Morgenstein 888a0c64a17SJack Morgenstein void mlx4_ib_update_cache_on_guid_change(struct mlx4_ib_dev *dev, 8891fb7f897SMark Bloch int block_num, u32 port_num, 890a0c64a17SJack Morgenstein u8 *p_data); 891a0c64a17SJack Morgenstein 892c1e7e466SJack Morgenstein int add_sysfs_port_mcg_attr(struct mlx4_ib_dev *device, int port_num, 893c1e7e466SJack Morgenstein struct attribute *attr); 894c1e7e466SJack Morgenstein void del_sysfs_port_mcg_attr(struct mlx4_ib_dev *device, int port_num, 895c1e7e466SJack Morgenstein struct attribute *attr); 896c1e7e466SJack Morgenstein ib_sa_comp_mask mlx4_ib_get_aguid_comp_mask_from_ix(int index); 897ee59fa0dSYishai Hadas void mlx4_ib_slave_alias_guid_event(struct mlx4_ib_dev *dev, int slave, 898ee59fa0dSYishai Hadas int port, int slave_init); 899c1e7e466SJack Morgenstein 900c1e7e466SJack Morgenstein int mlx4_ib_device_register_sysfs(struct mlx4_ib_dev *device) ; 901c1e7e466SJack Morgenstein 902c1e7e466SJack Morgenstein void mlx4_ib_device_unregister_sysfs(struct mlx4_ib_dev *device); 903c1e7e466SJack Morgenstein 904afa8fd1dSJack Morgenstein __be64 mlx4_ib_gen_node_guid(void); 905afa8fd1dSJack Morgenstein 906c1c98501SMatan Barak int mlx4_ib_steer_qp_alloc(struct mlx4_ib_dev *dev, int count, int *qpn); 907c1c98501SMatan Barak void mlx4_ib_steer_qp_free(struct mlx4_ib_dev *dev, u32 qpn, int count); 908c1c98501SMatan Barak int mlx4_ib_steer_qp_reg(struct mlx4_ib_dev *mdev, struct mlx4_ib_qp *mqp, 909c1c98501SMatan Barak int is_attach); 9106e0954b1SJason Gunthorpe struct ib_mr *mlx4_ib_rereg_user_mr(struct ib_mr *mr, int flags, u64 start, 9116e0954b1SJason Gunthorpe u64 length, u64 virt_addr, 9129376932dSMatan Barak int mr_access_flags, struct ib_pd *pd, 9139376932dSMatan Barak struct ib_udata *udata); 914e26be1bfSMoni Shoua int mlx4_ib_gid_index_to_real_index(struct mlx4_ib_dev *ibdev, 9157492052aSParav Pandit const struct ib_gid_attr *attr); 916afa8fd1dSJack Morgenstein 917fd10ed8eSJack Morgenstein void mlx4_sched_ib_sl2vl_update_work(struct mlx4_ib_dev *ibdev, 918fd10ed8eSJack Morgenstein int port); 919fd10ed8eSJack Morgenstein 920fd10ed8eSJack Morgenstein void mlx4_ib_sl2vl_update(struct mlx4_ib_dev *mdev, int port); 921fd10ed8eSJack Morgenstein 922400b1ebcSGuy Levi struct ib_wq *mlx4_ib_create_wq(struct ib_pd *pd, 923400b1ebcSGuy Levi struct ib_wq_init_attr *init_attr, 924400b1ebcSGuy Levi struct ib_udata *udata); 925add53535SLeon Romanovsky int mlx4_ib_destroy_wq(struct ib_wq *wq, struct ib_udata *udata); 926400b1ebcSGuy Levi int mlx4_ib_modify_wq(struct ib_wq *wq, struct ib_wq_attr *wq_attr, 927400b1ebcSGuy Levi u32 wq_attr_mask, struct ib_udata *udata); 928400b1ebcSGuy Levi 929c0a6b5ecSLeon Romanovsky int mlx4_ib_create_rwq_ind_table(struct ib_rwq_ind_table *ib_rwq_ind_tbl, 930b8d46ca0SGuy Levi struct ib_rwq_ind_table_init_attr *init_attr, 931b8d46ca0SGuy Levi struct ib_udata *udata); 932c0a6b5ecSLeon Romanovsky static inline int 933c0a6b5ecSLeon Romanovsky mlx4_ib_destroy_rwq_ind_table(struct ib_rwq_ind_table *wq_ind_table) 934c0a6b5ecSLeon Romanovsky { 935c0a6b5ecSLeon Romanovsky return 0; 936c0a6b5ecSLeon Romanovsky } 937ed8637d3SGuy Levi int mlx4_ib_umem_calc_optimal_mtt_size(struct ib_umem *umem, u64 start_va, 938ed8637d3SGuy Levi int *num_of_mtts); 939b8d46ca0SGuy Levi 940*9cf62d91STetsuo Handa int mlx4_ib_cm_init(void); 941*9cf62d91STetsuo Handa void mlx4_ib_cm_destroy(void); 942*9cf62d91STetsuo Handa 943225c7b1fSRoland Dreier #endif /* MLX4_IB_H */ 944