232 lines · c
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 two6 * licenses. You may choose to be licensed under the terms of the GNU7 * General Public License (GPL) Version 2, available from the file8 * COPYING in the main directory of this source tree, or the9 * OpenIB.org BSD license below:10 *11 * Redistribution and use in source and binary forms, with or12 * without modification, are permitted provided that the following13 * conditions are met:14 *15 * - Redistributions of source code must retain the above16 * copyright notice, this list of conditions and the following17 * disclaimer.18 *19 * - Redistributions in binary form must reproduce the above20 * copyright notice, this list of conditions and the following21 * disclaimer in the documentation and/or other materials22 * 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 OF26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS28 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN29 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN30 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE31 * SOFTWARE.32 */33 34#ifndef RDMA_USER_RXE_H35#define RDMA_USER_RXE_H36 37#include <linux/types.h>38#include <linux/socket.h>39#include <linux/in.h>40#include <linux/in6.h>41 42enum {43 RXE_NETWORK_TYPE_IPV4 = 1,44 RXE_NETWORK_TYPE_IPV6 = 2,45};46 47union rxe_gid {48 __u8 raw[16];49 struct {50 __be64 subnet_prefix;51 __be64 interface_id;52 } global;53};54 55struct 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 63struct 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 75struct 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#endif132 } wr;133};134 135struct rxe_sge {136 __aligned_u64 addr;137 __u32 length;138 __u32 lkey;139};140 141struct mminfo {142 __aligned_u64 offset;143 __u32 size;144 __u32 pad;145};146 147struct 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 161struct 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 175struct rxe_recv_wqe {176 __aligned_u64 wr_id;177 __u32 reserved;178 __u32 padding;179 struct rxe_dma_info dma;180};181 182struct rxe_create_ah_resp {183 __u32 ah_num;184 __u32 reserved;185};186 187struct rxe_create_cq_resp {188 struct mminfo mi;189};190 191struct rxe_resize_cq_resp {192 struct mminfo mi;193};194 195struct rxe_create_qp_resp {196 struct mminfo rq_mi;197 struct mminfo sq_mi;198};199 200struct rxe_create_srq_resp {201 struct mminfo mi;202 __u32 srq_num;203 __u32 reserved;204};205 206struct rxe_modify_srq_cmd {207 __aligned_u64 mmap_info_addr;208};209 210/* This data structure is stored at the base of work and211 * completion queues shared between user space and kernel space.212 * It contains the producer and consumer indices. Is also213 * contains a copy of the queue size parameters for user space214 * to use but the kernel must use the parameters in the215 * rxe_queue struct. For performance reasons arrange to have216 * producer and consumer indices in separate cache lines217 * the kernel should always mask the indices to avoid accessing218 * memory outside of the data area219 */220struct 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