brintos

brintos / linux-shallow public Read only

0
0
Text · 6.8 KiB · 1c4c1a6 Raw
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