root/include/rdma/ib_hdrs.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. ib_u64_get
  2. ib_u64_put
  3. get_ib_reth_vaddr
  4. put_ib_reth_vaddr
  5. get_ib_ateth_vaddr
  6. put_ib_ateth_vaddr
  7. get_ib_ateth_swap
  8. put_ib_ateth_swap
  9. get_ib_ateth_compare
  10. put_ib_ateth_compare
  11. ib_get_lnh
  12. ib_get_sc
  13. ib_is_sc5
  14. ib_get_sl
  15. ib_get_dlid
  16. ib_get_slid
  17. ib_get_lver
  18. ib_get_len
  19. ib_get_qkey
  20. ib_get_sqpn
  21. ib_bth_get_pad
  22. ib_bth_get_pkey
  23. ib_bth_get_opcode
  24. ib_bth_get_ackreq
  25. ib_bth_get_migreq
  26. ib_bth_get_se
  27. ib_bth_get_psn
  28. ib_bth_get_qpn
  29. ib_bth_get_becn
  30. ib_bth_get_fecn
  31. ib_bth_get_tver
  32. ib_bth_is_solicited
  33. ib_bth_is_migration

   1 /*
   2  * Copyright(c) 2016 - 2018 Intel Corporation.
   3  *
   4  * This file is provided under a dual BSD/GPLv2 license.  When using or
   5  * redistributing this file, you may do so under either license.
   6  *
   7  * GPL LICENSE SUMMARY
   8  *
   9  * This program is free software; you can redistribute it and/or modify
  10  * it under the terms of version 2 of the GNU General Public License as
  11  * published by the Free Software Foundation.
  12  *
  13  * This program is distributed in the hope that it will be useful, but
  14  * WITHOUT ANY WARRANTY; without even the implied warranty of
  15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16  * General Public License for more details.
  17  *
  18  * BSD LICENSE
  19  *
  20  * Redistribution and use in source and binary forms, with or without
  21  * modification, are permitted provided that the following conditions
  22  * are met:
  23  *
  24  *  - Redistributions of source code must retain the above copyright
  25  *    notice, this list of conditions and the following disclaimer.
  26  *  - Redistributions in binary form must reproduce the above copyright
  27  *    notice, this list of conditions and the following disclaimer in
  28  *    the documentation and/or other materials provided with the
  29  *    distribution.
  30  *  - Neither the name of Intel Corporation nor the names of its
  31  *    contributors may be used to endorse or promote products derived
  32  *    from this software without specific prior written permission.
  33  *
  34  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  35  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  36  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  37  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  38  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  39  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  40  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  41  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  42  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  43  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  44  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  45  *
  46  */
  47 
  48 #ifndef IB_HDRS_H
  49 #define IB_HDRS_H
  50 
  51 #include <linux/types.h>
  52 #include <asm/unaligned.h>
  53 #include <rdma/ib_verbs.h>
  54 
  55 #define IB_SEQ_NAK      (3 << 29)
  56 
  57 /* AETH NAK opcode values */
  58 #define IB_RNR_NAK                      0x20
  59 #define IB_NAK_PSN_ERROR                0x60
  60 #define IB_NAK_INVALID_REQUEST          0x61
  61 #define IB_NAK_REMOTE_ACCESS_ERROR      0x62
  62 #define IB_NAK_REMOTE_OPERATIONAL_ERROR 0x63
  63 #define IB_NAK_INVALID_RD_REQUEST       0x64
  64 
  65 #define IB_BTH_REQ_ACK          BIT(31)
  66 #define IB_BTH_SOLICITED        BIT(23)
  67 #define IB_BTH_MIG_REQ          BIT(22)
  68 
  69 #define IB_GRH_VERSION          6
  70 #define IB_GRH_VERSION_MASK     0xF
  71 #define IB_GRH_VERSION_SHIFT    28
  72 #define IB_GRH_TCLASS_MASK      0xFF
  73 #define IB_GRH_TCLASS_SHIFT     20
  74 #define IB_GRH_FLOW_MASK        0xFFFFF
  75 #define IB_GRH_FLOW_SHIFT       0
  76 #define IB_GRH_NEXT_HDR         0x1B
  77 #define IB_FECN_SHIFT 31
  78 #define IB_FECN_MASK 1
  79 #define IB_FECN_SMASK BIT(IB_FECN_SHIFT)
  80 #define IB_BECN_SHIFT 30
  81 #define IB_BECN_MASK 1
  82 #define IB_BECN_SMASK BIT(IB_BECN_SHIFT)
  83 
  84 #define IB_AETH_CREDIT_SHIFT    24
  85 #define IB_AETH_CREDIT_MASK     0x1F
  86 #define IB_AETH_CREDIT_INVAL    0x1F
  87 #define IB_AETH_NAK_SHIFT       29
  88 #define IB_MSN_MASK             0xFFFFFF
  89 
  90 struct ib_reth {
  91         __be64 vaddr;        /* potentially unaligned */
  92         __be32 rkey;
  93         __be32 length;
  94 } __packed;
  95 
  96 struct ib_atomic_eth {
  97         __be64 vaddr;        /* potentially unaligned */
  98         __be32 rkey;
  99         __be64 swap_data;    /* potentially unaligned */
 100         __be64 compare_data; /* potentially unaligned */
 101 } __packed;
 102 
 103 #include <rdma/tid_rdma_defs.h>
 104 
 105 union ib_ehdrs {
 106         struct {
 107                 __be32 deth[2];
 108                 __be32 imm_data;
 109         } ud;
 110         struct {
 111                 struct ib_reth reth;
 112                 __be32 imm_data;
 113         } rc;
 114         struct {
 115                 __be32 aeth;
 116                 __be64 atomic_ack_eth; /* potentially unaligned */
 117         } __packed at;
 118         __be32 imm_data;
 119         __be32 aeth;
 120         __be32 ieth;
 121         struct ib_atomic_eth atomic_eth;
 122         /* TID RDMA headers */
 123         union {
 124                 struct tid_rdma_read_req r_req;
 125                 struct tid_rdma_read_resp r_rsp;
 126                 struct tid_rdma_write_req w_req;
 127                 struct tid_rdma_write_resp w_rsp;
 128                 struct tid_rdma_write_data w_data;
 129                 struct tid_rdma_resync resync;
 130                 struct tid_rdma_ack ack;
 131         } tid_rdma;
 132 }  __packed;
 133 
 134 struct ib_other_headers {
 135         __be32 bth[3];
 136         union ib_ehdrs u;
 137 } __packed;
 138 
 139 struct ib_header {
 140         __be16 lrh[4];
 141         union {
 142                 struct {
 143                         struct ib_grh grh;
 144                         struct ib_other_headers oth;
 145                 } l;
 146                 struct ib_other_headers oth;
 147         } u;
 148 } __packed;
 149 
 150 /* accessors for unaligned __be64 items */
 151 
 152 static inline u64 ib_u64_get(__be64 *p)
 153 {
 154         return get_unaligned_be64(p);
 155 }
 156 
 157 static inline void ib_u64_put(u64 val, __be64 *p)
 158 {
 159         put_unaligned_be64(val, p);
 160 }
 161 
 162 static inline u64 get_ib_reth_vaddr(struct ib_reth *reth)
 163 {
 164         return ib_u64_get(&reth->vaddr);
 165 }
 166 
 167 static inline void put_ib_reth_vaddr(u64 val, struct ib_reth *reth)
 168 {
 169         ib_u64_put(val, &reth->vaddr);
 170 }
 171 
 172 static inline u64 get_ib_ateth_vaddr(struct ib_atomic_eth *ateth)
 173 {
 174         return ib_u64_get(&ateth->vaddr);
 175 }
 176 
 177 static inline void put_ib_ateth_vaddr(u64 val, struct ib_atomic_eth *ateth)
 178 {
 179         ib_u64_put(val, &ateth->vaddr);
 180 }
 181 
 182 static inline u64 get_ib_ateth_swap(struct ib_atomic_eth *ateth)
 183 {
 184         return ib_u64_get(&ateth->swap_data);
 185 }
 186 
 187 static inline void put_ib_ateth_swap(u64 val, struct ib_atomic_eth *ateth)
 188 {
 189         ib_u64_put(val, &ateth->swap_data);
 190 }
 191 
 192 static inline u64 get_ib_ateth_compare(struct ib_atomic_eth *ateth)
 193 {
 194         return ib_u64_get(&ateth->compare_data);
 195 }
 196 
 197 static inline void put_ib_ateth_compare(u64 val, struct ib_atomic_eth *ateth)
 198 {
 199         ib_u64_put(val, &ateth->compare_data);
 200 }
 201 
 202 /*
 203  * 9B/IB Packet Format
 204  */
 205 #define IB_LNH_MASK             3
 206 #define IB_SC_MASK              0xf
 207 #define IB_SC_SHIFT             12
 208 #define IB_SC5_MASK             0x10
 209 #define IB_SL_MASK              0xf
 210 #define IB_SL_SHIFT             4
 211 #define IB_SL_SHIFT             4
 212 #define IB_LVER_MASK    0xf
 213 #define IB_LVER_SHIFT   8
 214 
 215 static inline u8 ib_get_lnh(struct ib_header *hdr)
 216 {
 217         return (be16_to_cpu(hdr->lrh[0]) & IB_LNH_MASK);
 218 }
 219 
 220 static inline u8 ib_get_sc(struct ib_header *hdr)
 221 {
 222         return ((be16_to_cpu(hdr->lrh[0]) >> IB_SC_SHIFT) & IB_SC_MASK);
 223 }
 224 
 225 static inline bool ib_is_sc5(u16 sc5)
 226 {
 227         return !!(sc5 & IB_SC5_MASK);
 228 }
 229 
 230 static inline u8 ib_get_sl(struct ib_header *hdr)
 231 {
 232         return ((be16_to_cpu(hdr->lrh[0]) >> IB_SL_SHIFT) & IB_SL_MASK);
 233 }
 234 
 235 static inline u16 ib_get_dlid(struct ib_header *hdr)
 236 {
 237         return (be16_to_cpu(hdr->lrh[1]));
 238 }
 239 
 240 static inline u16 ib_get_slid(struct ib_header *hdr)
 241 {
 242         return (be16_to_cpu(hdr->lrh[3]));
 243 }
 244 
 245 static inline u8 ib_get_lver(struct ib_header *hdr)
 246 {
 247         return (u8)((be16_to_cpu(hdr->lrh[0]) >> IB_LVER_SHIFT) &
 248                    IB_LVER_MASK);
 249 }
 250 
 251 static inline u16 ib_get_len(struct ib_header *hdr)
 252 {
 253         return (u16)(be16_to_cpu(hdr->lrh[2]));
 254 }
 255 
 256 static inline u32 ib_get_qkey(struct ib_other_headers *ohdr)
 257 {
 258         return be32_to_cpu(ohdr->u.ud.deth[0]);
 259 }
 260 
 261 static inline u32 ib_get_sqpn(struct ib_other_headers *ohdr)
 262 {
 263         return ((be32_to_cpu(ohdr->u.ud.deth[1])) & IB_QPN_MASK);
 264 }
 265 
 266 /*
 267  * BTH
 268  */
 269 #define IB_BTH_OPCODE_MASK      0xff
 270 #define IB_BTH_OPCODE_SHIFT     24
 271 #define IB_BTH_PAD_MASK 3
 272 #define IB_BTH_PKEY_MASK        0xffff
 273 #define IB_BTH_PAD_SHIFT        20
 274 #define IB_BTH_A_MASK           1
 275 #define IB_BTH_A_SHIFT          31
 276 #define IB_BTH_M_MASK           1
 277 #define IB_BTH_M_SHIFT          22
 278 #define IB_BTH_SE_MASK          1
 279 #define IB_BTH_SE_SHIFT 23
 280 #define IB_BTH_TVER_MASK        0xf
 281 #define IB_BTH_TVER_SHIFT       16
 282 
 283 static inline u8 ib_bth_get_pad(struct ib_other_headers *ohdr)
 284 {
 285         return ((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_PAD_SHIFT) &
 286                    IB_BTH_PAD_MASK);
 287 }
 288 
 289 static inline u16 ib_bth_get_pkey(struct ib_other_headers *ohdr)
 290 {
 291         return (be32_to_cpu(ohdr->bth[0]) & IB_BTH_PKEY_MASK);
 292 }
 293 
 294 static inline u8 ib_bth_get_opcode(struct ib_other_headers *ohdr)
 295 {
 296         return ((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_OPCODE_SHIFT) &
 297                    IB_BTH_OPCODE_MASK);
 298 }
 299 
 300 static inline u8 ib_bth_get_ackreq(struct ib_other_headers *ohdr)
 301 {
 302         return (u8)((be32_to_cpu(ohdr->bth[2]) >> IB_BTH_A_SHIFT) &
 303                    IB_BTH_A_MASK);
 304 }
 305 
 306 static inline u8 ib_bth_get_migreq(struct ib_other_headers *ohdr)
 307 {
 308         return (u8)((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_M_SHIFT) &
 309                     IB_BTH_M_MASK);
 310 }
 311 
 312 static inline u8 ib_bth_get_se(struct ib_other_headers *ohdr)
 313 {
 314         return (u8)((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_SE_SHIFT) &
 315                     IB_BTH_SE_MASK);
 316 }
 317 
 318 static inline u32 ib_bth_get_psn(struct ib_other_headers *ohdr)
 319 {
 320         return (u32)(be32_to_cpu(ohdr->bth[2]));
 321 }
 322 
 323 static inline u32 ib_bth_get_qpn(struct ib_other_headers *ohdr)
 324 {
 325         return (u32)((be32_to_cpu(ohdr->bth[1])) & IB_QPN_MASK);
 326 }
 327 
 328 static inline bool ib_bth_get_becn(struct ib_other_headers *ohdr)
 329 {
 330         return (ohdr->bth[1]) & cpu_to_be32(IB_BECN_SMASK);
 331 }
 332 
 333 static inline bool ib_bth_get_fecn(struct ib_other_headers *ohdr)
 334 {
 335         return (ohdr->bth[1]) & cpu_to_be32(IB_FECN_SMASK);
 336 }
 337 
 338 static inline u8 ib_bth_get_tver(struct ib_other_headers *ohdr)
 339 {
 340         return (u8)((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_TVER_SHIFT)  &
 341                     IB_BTH_TVER_MASK);
 342 }
 343 
 344 static inline bool ib_bth_is_solicited(struct ib_other_headers *ohdr)
 345 {
 346         return ohdr->bth[0] & cpu_to_be32(IB_BTH_SOLICITED);
 347 }
 348 
 349 static inline bool ib_bth_is_migration(struct ib_other_headers *ohdr)
 350 {
 351         return ohdr->bth[0] & cpu_to_be32(IB_BTH_MIG_REQ);
 352 }
 353 #endif                          /* IB_HDRS_H */

/* [<][>][^][v][top][bottom][index][help] */