1 /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR Linux-OpenIB) */ 2 /* 3 * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. 4 * 5 * This software is available to you under a choice of one of two 6 * licenses. You may choose to be licensed under the terms of the GNU 7 * General Public License (GPL) Version 2, available from the file 8 * COPYING in the main directory of this source tree, or the 9 * OpenIB.org BSD license below: 10 * 11 * Redistribution and use in source and binary forms, with or 12 * without modification, are permitted provided that the following 13 * conditions are met: 14 * 15 * - Redistributions of source code must retain the above 16 * copyright notice, this list of conditions and the following 17 * disclaimer. 18 * 19 * - Redistributions in binary form must reproduce the above 20 * copyright notice, this list of conditions and the following 21 * disclaimer in the documentation and/or other materials 22 * provided with the distribution. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 * SOFTWARE. 32 */ 33 34 #ifndef RDMA_USER_RXE_H 35 #define RDMA_USER_RXE_H 36 37 #include <linux/types.h> 38 #include <linux/socket.h> 39 #include <linux/in.h> 40 #include <linux/in6.h> 41 42 enum { 43 RXE_NETWORK_TYPE_IPV4 = 1, 44 RXE_NETWORK_TYPE_IPV6 = 2, 45 }; 46 47 union rxe_gid { 48 __u8 raw[16]; 49 struct { 50 __be64 subnet_prefix; 51 __be64 interface_id; 52 } global; 53 }; 54 55 struct rxe_global_route { 56 union rxe_gid dgid; 57 __u32 flow_label; 58 __u8 sgid_index; 59 __u8 hop_limit; 60 __u8 traffic_class; 61 }; 62 63 struct rxe_av { 64 __u8 port_num; 65 /* From RXE_NETWORK_TYPE_* */ 66 __u8 network_type; 67 __u8 dmac[6]; 68 struct rxe_global_route grh; 69 union { 70 struct sockaddr_in _sockaddr_in; 71 struct sockaddr_in6 _sockaddr_in6; 72 } sgid_addr, dgid_addr; 73 }; 74 75 struct rxe_send_wr { 76 __aligned_u64 wr_id; 77 __u32 reserved; 78 __u32 opcode; 79 __u32 send_flags; 80 union { 81 __be32 imm_data; 82 __u32 invalidate_rkey; 83 } ex; 84 union { 85 struct { 86 __aligned_u64 remote_addr; 87 __u32 length; 88 __u32 rkey; 89 __u8 type; 90 __u8 level; 91 } flush; 92 struct { 93 __aligned_u64 remote_addr; 94 __u32 rkey; 95 __u32 reserved; 96 } rdma; 97 struct { 98 __aligned_u64 remote_addr; 99 __aligned_u64 compare_add; 100 __aligned_u64 swap; 101 __u32 rkey; 102 __u32 reserved; 103 } atomic; 104 struct { 105 __u32 remote_qpn; 106 __u32 remote_qkey; 107 __u16 pkey_index; 108 __u16 reserved; 109 __u32 ah_num; 110 __u32 pad[4]; 111 struct rxe_av av; 112 } ud; 113 struct { 114 __aligned_u64 addr; 115 __aligned_u64 length; 116 __u32 mr_lkey; 117 __u32 mw_rkey; 118 __u32 rkey; 119 __u32 access; 120 } mw; 121 /* reg is only used by the kernel and is not part of the uapi */ 122 #ifdef __KERNEL__ 123 struct { 124 union { 125 struct ib_mr *mr; 126 __aligned_u64 reserved; 127 }; 128 __u32 key; 129 __u32 access; 130 } reg; 131 #endif 132 } wr; 133 }; 134 135 struct rxe_sge { 136 __aligned_u64 addr; 137 __u32 length; 138 __u32 lkey; 139 }; 140 141 struct mminfo { 142 __aligned_u64 offset; 143 __u32 size; 144 __u32 pad; 145 }; 146 147 struct rxe_dma_info { 148 __u32 length; 149 __u32 resid; 150 __u32 cur_sge; 151 __u32 num_sge; 152 __u32 sge_offset; 153 __u32 reserved; 154 union { 155 __DECLARE_FLEX_ARRAY(__u8, inline_data); 156 __DECLARE_FLEX_ARRAY(__u8, atomic_wr); 157 __DECLARE_FLEX_ARRAY(struct rxe_sge, sge); 158 }; 159 }; 160 161 struct rxe_send_wqe { 162 struct rxe_send_wr wr; 163 __u32 status; 164 __u32 state; 165 __aligned_u64 iova; 166 __u32 mask; 167 __u32 first_psn; 168 __u32 last_psn; 169 __u32 ack_length; 170 __u32 ssn; 171 __u32 has_rd_atomic; 172 struct rxe_dma_info dma; 173 }; 174 175 struct rxe_recv_wqe { 176 __aligned_u64 wr_id; 177 __u32 reserved; 178 __u32 padding; 179 struct rxe_dma_info dma; 180 }; 181 182 struct rxe_create_ah_resp { 183 __u32 ah_num; 184 __u32 reserved; 185 }; 186 187 struct rxe_create_cq_resp { 188 struct mminfo mi; 189 }; 190 191 struct rxe_resize_cq_resp { 192 struct mminfo mi; 193 }; 194 195 struct rxe_create_qp_resp { 196 struct mminfo rq_mi; 197 struct mminfo sq_mi; 198 }; 199 200 struct rxe_create_srq_resp { 201 struct mminfo mi; 202 __u32 srq_num; 203 __u32 reserved; 204 }; 205 206 struct rxe_modify_srq_cmd { 207 __aligned_u64 mmap_info_addr; 208 }; 209 210 /* This data structure is stored at the base of work and 211 * completion queues shared between user space and kernel space. 212 * It contains the producer and consumer indices. Is also 213 * contains a copy of the queue size parameters for user space 214 * to use but the kernel must use the parameters in the 215 * rxe_queue struct. For performance reasons arrange to have 216 * producer and consumer indices in separate cache lines 217 * the kernel should always mask the indices to avoid accessing 218 * memory outside of the data area 219 */ 220 struct rxe_queue_buf { 221 __u32 log2_elem_size; 222 __u32 index_mask; 223 __u32 pad_1[30]; 224 __u32 producer_index; 225 __u32 pad_2[31]; 226 __u32 consumer_index; 227 __u32 pad_3[31]; 228 __u8 data[]; 229 }; 230 231 #endif /* RDMA_USER_RXE_H */ 232