308 lines · c
1/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */2/*3 * Copyright(c) 2016 - 2018 Intel Corporation.4 */5 6#ifndef IB_HDRS_H7#define IB_HDRS_H8 9#include <linux/types.h>10#include <linux/unaligned.h>11#include <rdma/ib_verbs.h>12 13#define IB_SEQ_NAK (3 << 29)14 15/* AETH NAK opcode values */16#define IB_RNR_NAK 0x2017#define IB_NAK_PSN_ERROR 0x6018#define IB_NAK_INVALID_REQUEST 0x6119#define IB_NAK_REMOTE_ACCESS_ERROR 0x6220#define IB_NAK_REMOTE_OPERATIONAL_ERROR 0x6321#define IB_NAK_INVALID_RD_REQUEST 0x6422 23#define IB_BTH_REQ_ACK BIT(31)24#define IB_BTH_SOLICITED BIT(23)25#define IB_BTH_MIG_REQ BIT(22)26 27#define IB_GRH_VERSION 628#define IB_GRH_VERSION_MASK 0xF29#define IB_GRH_VERSION_SHIFT 2830#define IB_GRH_TCLASS_MASK 0xFF31#define IB_GRH_TCLASS_SHIFT 2032#define IB_GRH_FLOW_MASK 0xFFFFF33#define IB_GRH_FLOW_SHIFT 034#define IB_GRH_NEXT_HDR 0x1B35#define IB_FECN_SHIFT 3136#define IB_FECN_MASK 137#define IB_FECN_SMASK BIT(IB_FECN_SHIFT)38#define IB_BECN_SHIFT 3039#define IB_BECN_MASK 140#define IB_BECN_SMASK BIT(IB_BECN_SHIFT)41 42#define IB_AETH_CREDIT_SHIFT 2443#define IB_AETH_CREDIT_MASK 0x1F44#define IB_AETH_CREDIT_INVAL 0x1F45#define IB_AETH_NAK_SHIFT 2946#define IB_MSN_MASK 0xFFFFFF47 48struct ib_reth {49 __be64 vaddr; /* potentially unaligned */50 __be32 rkey;51 __be32 length;52} __packed;53 54struct ib_atomic_eth {55 __be64 vaddr; /* potentially unaligned */56 __be32 rkey;57 __be64 swap_data; /* potentially unaligned */58 __be64 compare_data; /* potentially unaligned */59} __packed;60 61#include <rdma/tid_rdma_defs.h>62 63union ib_ehdrs {64 struct {65 __be32 deth[2];66 __be32 imm_data;67 } ud;68 struct {69 struct ib_reth reth;70 __be32 imm_data;71 } rc;72 struct {73 __be32 aeth;74 __be64 atomic_ack_eth; /* potentially unaligned */75 } __packed at;76 __be32 imm_data;77 __be32 aeth;78 __be32 ieth;79 struct ib_atomic_eth atomic_eth;80 /* TID RDMA headers */81 union {82 struct tid_rdma_read_req r_req;83 struct tid_rdma_read_resp r_rsp;84 struct tid_rdma_write_req w_req;85 struct tid_rdma_write_resp w_rsp;86 struct tid_rdma_write_data w_data;87 struct tid_rdma_resync resync;88 struct tid_rdma_ack ack;89 } tid_rdma;90} __packed;91 92struct ib_other_headers {93 __be32 bth[3];94 union ib_ehdrs u;95} __packed;96 97struct ib_header {98 __be16 lrh[4];99 union {100 struct {101 struct ib_grh grh;102 struct ib_other_headers oth;103 } l;104 struct ib_other_headers oth;105 } u;106} __packed;107 108/* accessors for unaligned __be64 items */109 110static inline u64 ib_u64_get(__be64 *p)111{112 return get_unaligned_be64(p);113}114 115static inline void ib_u64_put(u64 val, __be64 *p)116{117 put_unaligned_be64(val, p);118}119 120static inline u64 get_ib_reth_vaddr(struct ib_reth *reth)121{122 return ib_u64_get(&reth->vaddr);123}124 125static inline void put_ib_reth_vaddr(u64 val, struct ib_reth *reth)126{127 ib_u64_put(val, &reth->vaddr);128}129 130static inline u64 get_ib_ateth_vaddr(struct ib_atomic_eth *ateth)131{132 return ib_u64_get(&ateth->vaddr);133}134 135static inline void put_ib_ateth_vaddr(u64 val, struct ib_atomic_eth *ateth)136{137 ib_u64_put(val, &ateth->vaddr);138}139 140static inline u64 get_ib_ateth_swap(struct ib_atomic_eth *ateth)141{142 return ib_u64_get(&ateth->swap_data);143}144 145static inline void put_ib_ateth_swap(u64 val, struct ib_atomic_eth *ateth)146{147 ib_u64_put(val, &ateth->swap_data);148}149 150static inline u64 get_ib_ateth_compare(struct ib_atomic_eth *ateth)151{152 return ib_u64_get(&ateth->compare_data);153}154 155static inline void put_ib_ateth_compare(u64 val, struct ib_atomic_eth *ateth)156{157 ib_u64_put(val, &ateth->compare_data);158}159 160/*161 * 9B/IB Packet Format162 */163#define IB_LNH_MASK 3164#define IB_SC_MASK 0xf165#define IB_SC_SHIFT 12166#define IB_SC5_MASK 0x10167#define IB_SL_MASK 0xf168#define IB_SL_SHIFT 4169#define IB_SL_SHIFT 4170#define IB_LVER_MASK 0xf171#define IB_LVER_SHIFT 8172 173static inline u8 ib_get_lnh(struct ib_header *hdr)174{175 return (be16_to_cpu(hdr->lrh[0]) & IB_LNH_MASK);176}177 178static inline u8 ib_get_sc(struct ib_header *hdr)179{180 return ((be16_to_cpu(hdr->lrh[0]) >> IB_SC_SHIFT) & IB_SC_MASK);181}182 183static inline bool ib_is_sc5(u16 sc5)184{185 return !!(sc5 & IB_SC5_MASK);186}187 188static inline u8 ib_get_sl(struct ib_header *hdr)189{190 return ((be16_to_cpu(hdr->lrh[0]) >> IB_SL_SHIFT) & IB_SL_MASK);191}192 193static inline u16 ib_get_dlid(struct ib_header *hdr)194{195 return (be16_to_cpu(hdr->lrh[1]));196}197 198static inline u16 ib_get_slid(struct ib_header *hdr)199{200 return (be16_to_cpu(hdr->lrh[3]));201}202 203static inline u8 ib_get_lver(struct ib_header *hdr)204{205 return (u8)((be16_to_cpu(hdr->lrh[0]) >> IB_LVER_SHIFT) &206 IB_LVER_MASK);207}208 209static inline u32 ib_get_qkey(struct ib_other_headers *ohdr)210{211 return be32_to_cpu(ohdr->u.ud.deth[0]);212}213 214static inline u32 ib_get_sqpn(struct ib_other_headers *ohdr)215{216 return ((be32_to_cpu(ohdr->u.ud.deth[1])) & IB_QPN_MASK);217}218 219/*220 * BTH221 */222#define IB_BTH_OPCODE_MASK 0xff223#define IB_BTH_OPCODE_SHIFT 24224#define IB_BTH_PAD_MASK 3225#define IB_BTH_PKEY_MASK 0xffff226#define IB_BTH_PAD_SHIFT 20227#define IB_BTH_A_MASK 1228#define IB_BTH_A_SHIFT 31229#define IB_BTH_M_MASK 1230#define IB_BTH_M_SHIFT 22231#define IB_BTH_SE_MASK 1232#define IB_BTH_SE_SHIFT 23233#define IB_BTH_TVER_MASK 0xf234#define IB_BTH_TVER_SHIFT 16235#define IB_BTH_OPCODE_CNP 0x81236 237static inline u8 ib_bth_get_pad(struct ib_other_headers *ohdr)238{239 return ((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_PAD_SHIFT) &240 IB_BTH_PAD_MASK);241}242 243static inline u16 ib_bth_get_pkey(struct ib_other_headers *ohdr)244{245 return (be32_to_cpu(ohdr->bth[0]) & IB_BTH_PKEY_MASK);246}247 248static inline u8 ib_bth_get_opcode(struct ib_other_headers *ohdr)249{250 return ((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_OPCODE_SHIFT) &251 IB_BTH_OPCODE_MASK);252}253 254static inline u8 ib_bth_get_ackreq(struct ib_other_headers *ohdr)255{256 return (u8)((be32_to_cpu(ohdr->bth[2]) >> IB_BTH_A_SHIFT) &257 IB_BTH_A_MASK);258}259 260static inline u8 ib_bth_get_migreq(struct ib_other_headers *ohdr)261{262 return (u8)((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_M_SHIFT) &263 IB_BTH_M_MASK);264}265 266static inline u8 ib_bth_get_se(struct ib_other_headers *ohdr)267{268 return (u8)((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_SE_SHIFT) &269 IB_BTH_SE_MASK);270}271 272static inline u32 ib_bth_get_psn(struct ib_other_headers *ohdr)273{274 return (u32)(be32_to_cpu(ohdr->bth[2]));275}276 277static inline u32 ib_bth_get_qpn(struct ib_other_headers *ohdr)278{279 return (u32)((be32_to_cpu(ohdr->bth[1])) & IB_QPN_MASK);280}281 282static inline bool ib_bth_get_becn(struct ib_other_headers *ohdr)283{284 return (ohdr->bth[1]) & cpu_to_be32(IB_BECN_SMASK);285}286 287static inline bool ib_bth_get_fecn(struct ib_other_headers *ohdr)288{289 return (ohdr->bth[1]) & cpu_to_be32(IB_FECN_SMASK);290}291 292static inline u8 ib_bth_get_tver(struct ib_other_headers *ohdr)293{294 return (u8)((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_TVER_SHIFT) &295 IB_BTH_TVER_MASK);296}297 298static inline bool ib_bth_is_solicited(struct ib_other_headers *ohdr)299{300 return ohdr->bth[0] & cpu_to_be32(IB_BTH_SOLICITED);301}302 303static inline bool ib_bth_is_migration(struct ib_other_headers *ohdr)304{305 return ohdr->bth[0] & cpu_to_be32(IB_BTH_MIG_REQ);306}307#endif /* IB_HDRS_H */308