linux/include/uapi/rdma/rdma_user_rxe.h
<<
>>
Prefs
   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
  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                   num_sge;
  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   rkey;
  88                        __u32   reserved;
  89                } rdma;
  90                struct {
  91                        __aligned_u64 remote_addr;
  92                        __aligned_u64 compare_add;
  93                        __aligned_u64 swap;
  94                        __u32   rkey;
  95                        __u32   reserved;
  96                } atomic;
  97                struct {
  98                        __u32   remote_qpn;
  99                        __u32   remote_qkey;
 100                        __u16   pkey_index;
 101                } ud;
 102                struct {
 103                        __aligned_u64   addr;
 104                        __aligned_u64   length;
 105                        __u32           mr_lkey;
 106                        __u32           mw_rkey;
 107                        __u32           rkey;
 108                        __u32           access;
 109                } mw;
 110                /* reg is only used by the kernel and is not part of the uapi */
 111#ifdef __KERNEL__
 112                struct {
 113                        union {
 114                                struct ib_mr *mr;
 115                                __aligned_u64 reserved;
 116                        };
 117                        __u32        key;
 118                        __u32        access;
 119                } reg;
 120#endif
 121        } wr;
 122};
 123
 124struct rxe_sge {
 125        __aligned_u64 addr;
 126        __u32   length;
 127        __u32   lkey;
 128};
 129
 130struct mminfo {
 131        __aligned_u64           offset;
 132        __u32                   size;
 133        __u32                   pad;
 134};
 135
 136struct rxe_dma_info {
 137        __u32                   length;
 138        __u32                   resid;
 139        __u32                   cur_sge;
 140        __u32                   num_sge;
 141        __u32                   sge_offset;
 142        __u32                   reserved;
 143        union {
 144                __u8            inline_data[0];
 145                struct rxe_sge  sge[0];
 146        };
 147};
 148
 149struct rxe_send_wqe {
 150        struct rxe_send_wr      wr;
 151        struct rxe_av           av;
 152        __u32                   status;
 153        __u32                   state;
 154        __aligned_u64           iova;
 155        __u32                   mask;
 156        __u32                   first_psn;
 157        __u32                   last_psn;
 158        __u32                   ack_length;
 159        __u32                   ssn;
 160        __u32                   has_rd_atomic;
 161        struct rxe_dma_info     dma;
 162};
 163
 164struct rxe_recv_wqe {
 165        __aligned_u64           wr_id;
 166        __u32                   num_sge;
 167        __u32                   padding;
 168        struct rxe_dma_info     dma;
 169};
 170
 171struct rxe_create_cq_resp {
 172        struct mminfo mi;
 173};
 174
 175struct rxe_resize_cq_resp {
 176        struct mminfo mi;
 177};
 178
 179struct rxe_create_qp_resp {
 180        struct mminfo rq_mi;
 181        struct mminfo sq_mi;
 182};
 183
 184struct rxe_create_srq_resp {
 185        struct mminfo mi;
 186        __u32 srq_num;
 187        __u32 reserved;
 188};
 189
 190struct rxe_modify_srq_cmd {
 191        __aligned_u64 mmap_info_addr;
 192};
 193
 194/* This data structure is stored at the base of work and
 195 * completion queues shared between user space and kernel space.
 196 * It contains the producer and consumer indices. Is also
 197 * contains a copy of the queue size parameters for user space
 198 * to use but the kernel must use the parameters in the
 199 * rxe_queue struct. For performance reasons arrange to have
 200 * producer and consumer indices in separate cache lines
 201 * the kernel should always mask the indices to avoid accessing
 202 * memory outside of the data area
 203 */
 204struct rxe_queue_buf {
 205        __u32                   log2_elem_size;
 206        __u32                   index_mask;
 207        __u32                   pad_1[30];
 208        __u32                   producer_index;
 209        __u32                   pad_2[31];
 210        __u32                   consumer_index;
 211        __u32                   pad_3[31];
 212        __u8                    data[];
 213};
 214
 215#endif /* RDMA_USER_RXE_H */
 216