xref: /OK3568_Linux_fs/kernel/include/rdma/ib_hdrs.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright(c) 2016 - 2018 Intel Corporation.
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #ifndef IB_HDRS_H
7*4882a593Smuzhiyun #define IB_HDRS_H
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include <linux/types.h>
10*4882a593Smuzhiyun #include <asm/unaligned.h>
11*4882a593Smuzhiyun #include <rdma/ib_verbs.h>
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #define IB_SEQ_NAK	(3 << 29)
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun /* AETH NAK opcode values */
16*4882a593Smuzhiyun #define IB_RNR_NAK                      0x20
17*4882a593Smuzhiyun #define IB_NAK_PSN_ERROR                0x60
18*4882a593Smuzhiyun #define IB_NAK_INVALID_REQUEST          0x61
19*4882a593Smuzhiyun #define IB_NAK_REMOTE_ACCESS_ERROR      0x62
20*4882a593Smuzhiyun #define IB_NAK_REMOTE_OPERATIONAL_ERROR 0x63
21*4882a593Smuzhiyun #define IB_NAK_INVALID_RD_REQUEST       0x64
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define IB_BTH_REQ_ACK		BIT(31)
24*4882a593Smuzhiyun #define IB_BTH_SOLICITED	BIT(23)
25*4882a593Smuzhiyun #define IB_BTH_MIG_REQ		BIT(22)
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #define IB_GRH_VERSION		6
28*4882a593Smuzhiyun #define IB_GRH_VERSION_MASK	0xF
29*4882a593Smuzhiyun #define IB_GRH_VERSION_SHIFT	28
30*4882a593Smuzhiyun #define IB_GRH_TCLASS_MASK	0xFF
31*4882a593Smuzhiyun #define IB_GRH_TCLASS_SHIFT	20
32*4882a593Smuzhiyun #define IB_GRH_FLOW_MASK	0xFFFFF
33*4882a593Smuzhiyun #define IB_GRH_FLOW_SHIFT	0
34*4882a593Smuzhiyun #define IB_GRH_NEXT_HDR		0x1B
35*4882a593Smuzhiyun #define IB_FECN_SHIFT 31
36*4882a593Smuzhiyun #define IB_FECN_MASK 1
37*4882a593Smuzhiyun #define IB_FECN_SMASK BIT(IB_FECN_SHIFT)
38*4882a593Smuzhiyun #define IB_BECN_SHIFT 30
39*4882a593Smuzhiyun #define IB_BECN_MASK 1
40*4882a593Smuzhiyun #define IB_BECN_SMASK BIT(IB_BECN_SHIFT)
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define IB_AETH_CREDIT_SHIFT	24
43*4882a593Smuzhiyun #define IB_AETH_CREDIT_MASK	0x1F
44*4882a593Smuzhiyun #define IB_AETH_CREDIT_INVAL	0x1F
45*4882a593Smuzhiyun #define IB_AETH_NAK_SHIFT	29
46*4882a593Smuzhiyun #define IB_MSN_MASK		0xFFFFFF
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun struct ib_reth {
49*4882a593Smuzhiyun 	__be64 vaddr;        /* potentially unaligned */
50*4882a593Smuzhiyun 	__be32 rkey;
51*4882a593Smuzhiyun 	__be32 length;
52*4882a593Smuzhiyun } __packed;
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun struct ib_atomic_eth {
55*4882a593Smuzhiyun 	__be64 vaddr;        /* potentially unaligned */
56*4882a593Smuzhiyun 	__be32 rkey;
57*4882a593Smuzhiyun 	__be64 swap_data;    /* potentially unaligned */
58*4882a593Smuzhiyun 	__be64 compare_data; /* potentially unaligned */
59*4882a593Smuzhiyun } __packed;
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun #include <rdma/tid_rdma_defs.h>
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun union ib_ehdrs {
64*4882a593Smuzhiyun 	struct {
65*4882a593Smuzhiyun 		__be32 deth[2];
66*4882a593Smuzhiyun 		__be32 imm_data;
67*4882a593Smuzhiyun 	} ud;
68*4882a593Smuzhiyun 	struct {
69*4882a593Smuzhiyun 		struct ib_reth reth;
70*4882a593Smuzhiyun 		__be32 imm_data;
71*4882a593Smuzhiyun 	} rc;
72*4882a593Smuzhiyun 	struct {
73*4882a593Smuzhiyun 		__be32 aeth;
74*4882a593Smuzhiyun 		__be64 atomic_ack_eth; /* potentially unaligned */
75*4882a593Smuzhiyun 	} __packed at;
76*4882a593Smuzhiyun 	__be32 imm_data;
77*4882a593Smuzhiyun 	__be32 aeth;
78*4882a593Smuzhiyun 	__be32 ieth;
79*4882a593Smuzhiyun 	struct ib_atomic_eth atomic_eth;
80*4882a593Smuzhiyun 	/* TID RDMA headers */
81*4882a593Smuzhiyun 	union {
82*4882a593Smuzhiyun 		struct tid_rdma_read_req r_req;
83*4882a593Smuzhiyun 		struct tid_rdma_read_resp r_rsp;
84*4882a593Smuzhiyun 		struct tid_rdma_write_req w_req;
85*4882a593Smuzhiyun 		struct tid_rdma_write_resp w_rsp;
86*4882a593Smuzhiyun 		struct tid_rdma_write_data w_data;
87*4882a593Smuzhiyun 		struct tid_rdma_resync resync;
88*4882a593Smuzhiyun 		struct tid_rdma_ack ack;
89*4882a593Smuzhiyun 	} tid_rdma;
90*4882a593Smuzhiyun }  __packed;
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun struct ib_other_headers {
93*4882a593Smuzhiyun 	__be32 bth[3];
94*4882a593Smuzhiyun 	union ib_ehdrs u;
95*4882a593Smuzhiyun } __packed;
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun struct ib_header {
98*4882a593Smuzhiyun 	__be16 lrh[4];
99*4882a593Smuzhiyun 	union {
100*4882a593Smuzhiyun 		struct {
101*4882a593Smuzhiyun 			struct ib_grh grh;
102*4882a593Smuzhiyun 			struct ib_other_headers oth;
103*4882a593Smuzhiyun 		} l;
104*4882a593Smuzhiyun 		struct ib_other_headers oth;
105*4882a593Smuzhiyun 	} u;
106*4882a593Smuzhiyun } __packed;
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun /* accessors for unaligned __be64 items */
109*4882a593Smuzhiyun 
ib_u64_get(__be64 * p)110*4882a593Smuzhiyun static inline u64 ib_u64_get(__be64 *p)
111*4882a593Smuzhiyun {
112*4882a593Smuzhiyun 	return get_unaligned_be64(p);
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun 
ib_u64_put(u64 val,__be64 * p)115*4882a593Smuzhiyun static inline void ib_u64_put(u64 val, __be64 *p)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun 	put_unaligned_be64(val, p);
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun 
get_ib_reth_vaddr(struct ib_reth * reth)120*4882a593Smuzhiyun static inline u64 get_ib_reth_vaddr(struct ib_reth *reth)
121*4882a593Smuzhiyun {
122*4882a593Smuzhiyun 	return ib_u64_get(&reth->vaddr);
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun 
put_ib_reth_vaddr(u64 val,struct ib_reth * reth)125*4882a593Smuzhiyun static inline void put_ib_reth_vaddr(u64 val, struct ib_reth *reth)
126*4882a593Smuzhiyun {
127*4882a593Smuzhiyun 	ib_u64_put(val, &reth->vaddr);
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun 
get_ib_ateth_vaddr(struct ib_atomic_eth * ateth)130*4882a593Smuzhiyun static inline u64 get_ib_ateth_vaddr(struct ib_atomic_eth *ateth)
131*4882a593Smuzhiyun {
132*4882a593Smuzhiyun 	return ib_u64_get(&ateth->vaddr);
133*4882a593Smuzhiyun }
134*4882a593Smuzhiyun 
put_ib_ateth_vaddr(u64 val,struct ib_atomic_eth * ateth)135*4882a593Smuzhiyun static inline void put_ib_ateth_vaddr(u64 val, struct ib_atomic_eth *ateth)
136*4882a593Smuzhiyun {
137*4882a593Smuzhiyun 	ib_u64_put(val, &ateth->vaddr);
138*4882a593Smuzhiyun }
139*4882a593Smuzhiyun 
get_ib_ateth_swap(struct ib_atomic_eth * ateth)140*4882a593Smuzhiyun static inline u64 get_ib_ateth_swap(struct ib_atomic_eth *ateth)
141*4882a593Smuzhiyun {
142*4882a593Smuzhiyun 	return ib_u64_get(&ateth->swap_data);
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun 
put_ib_ateth_swap(u64 val,struct ib_atomic_eth * ateth)145*4882a593Smuzhiyun static inline void put_ib_ateth_swap(u64 val, struct ib_atomic_eth *ateth)
146*4882a593Smuzhiyun {
147*4882a593Smuzhiyun 	ib_u64_put(val, &ateth->swap_data);
148*4882a593Smuzhiyun }
149*4882a593Smuzhiyun 
get_ib_ateth_compare(struct ib_atomic_eth * ateth)150*4882a593Smuzhiyun static inline u64 get_ib_ateth_compare(struct ib_atomic_eth *ateth)
151*4882a593Smuzhiyun {
152*4882a593Smuzhiyun 	return ib_u64_get(&ateth->compare_data);
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun 
put_ib_ateth_compare(u64 val,struct ib_atomic_eth * ateth)155*4882a593Smuzhiyun static inline void put_ib_ateth_compare(u64 val, struct ib_atomic_eth *ateth)
156*4882a593Smuzhiyun {
157*4882a593Smuzhiyun 	ib_u64_put(val, &ateth->compare_data);
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun /*
161*4882a593Smuzhiyun  * 9B/IB Packet Format
162*4882a593Smuzhiyun  */
163*4882a593Smuzhiyun #define IB_LNH_MASK		3
164*4882a593Smuzhiyun #define IB_SC_MASK		0xf
165*4882a593Smuzhiyun #define IB_SC_SHIFT		12
166*4882a593Smuzhiyun #define IB_SC5_MASK		0x10
167*4882a593Smuzhiyun #define IB_SL_MASK		0xf
168*4882a593Smuzhiyun #define IB_SL_SHIFT		4
169*4882a593Smuzhiyun #define IB_SL_SHIFT		4
170*4882a593Smuzhiyun #define IB_LVER_MASK	0xf
171*4882a593Smuzhiyun #define IB_LVER_SHIFT	8
172*4882a593Smuzhiyun 
ib_get_lnh(struct ib_header * hdr)173*4882a593Smuzhiyun static inline u8 ib_get_lnh(struct ib_header *hdr)
174*4882a593Smuzhiyun {
175*4882a593Smuzhiyun 	return (be16_to_cpu(hdr->lrh[0]) & IB_LNH_MASK);
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun 
ib_get_sc(struct ib_header * hdr)178*4882a593Smuzhiyun static inline u8 ib_get_sc(struct ib_header *hdr)
179*4882a593Smuzhiyun {
180*4882a593Smuzhiyun 	return ((be16_to_cpu(hdr->lrh[0]) >> IB_SC_SHIFT) & IB_SC_MASK);
181*4882a593Smuzhiyun }
182*4882a593Smuzhiyun 
ib_is_sc5(u16 sc5)183*4882a593Smuzhiyun static inline bool ib_is_sc5(u16 sc5)
184*4882a593Smuzhiyun {
185*4882a593Smuzhiyun 	return !!(sc5 & IB_SC5_MASK);
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun 
ib_get_sl(struct ib_header * hdr)188*4882a593Smuzhiyun static inline u8 ib_get_sl(struct ib_header *hdr)
189*4882a593Smuzhiyun {
190*4882a593Smuzhiyun 	return ((be16_to_cpu(hdr->lrh[0]) >> IB_SL_SHIFT) & IB_SL_MASK);
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun 
ib_get_dlid(struct ib_header * hdr)193*4882a593Smuzhiyun static inline u16 ib_get_dlid(struct ib_header *hdr)
194*4882a593Smuzhiyun {
195*4882a593Smuzhiyun 	return (be16_to_cpu(hdr->lrh[1]));
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun 
ib_get_slid(struct ib_header * hdr)198*4882a593Smuzhiyun static inline u16 ib_get_slid(struct ib_header *hdr)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun 	return (be16_to_cpu(hdr->lrh[3]));
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun 
ib_get_lver(struct ib_header * hdr)203*4882a593Smuzhiyun static inline u8 ib_get_lver(struct ib_header *hdr)
204*4882a593Smuzhiyun {
205*4882a593Smuzhiyun 	return (u8)((be16_to_cpu(hdr->lrh[0]) >> IB_LVER_SHIFT) &
206*4882a593Smuzhiyun 		   IB_LVER_MASK);
207*4882a593Smuzhiyun }
208*4882a593Smuzhiyun 
ib_get_len(struct ib_header * hdr)209*4882a593Smuzhiyun static inline u16 ib_get_len(struct ib_header *hdr)
210*4882a593Smuzhiyun {
211*4882a593Smuzhiyun 	return (u16)(be16_to_cpu(hdr->lrh[2]));
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun 
ib_get_qkey(struct ib_other_headers * ohdr)214*4882a593Smuzhiyun static inline u32 ib_get_qkey(struct ib_other_headers *ohdr)
215*4882a593Smuzhiyun {
216*4882a593Smuzhiyun 	return be32_to_cpu(ohdr->u.ud.deth[0]);
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun 
ib_get_sqpn(struct ib_other_headers * ohdr)219*4882a593Smuzhiyun static inline u32 ib_get_sqpn(struct ib_other_headers *ohdr)
220*4882a593Smuzhiyun {
221*4882a593Smuzhiyun 	return ((be32_to_cpu(ohdr->u.ud.deth[1])) & IB_QPN_MASK);
222*4882a593Smuzhiyun }
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun /*
225*4882a593Smuzhiyun  * BTH
226*4882a593Smuzhiyun  */
227*4882a593Smuzhiyun #define IB_BTH_OPCODE_MASK	0xff
228*4882a593Smuzhiyun #define IB_BTH_OPCODE_SHIFT	24
229*4882a593Smuzhiyun #define IB_BTH_PAD_MASK	3
230*4882a593Smuzhiyun #define IB_BTH_PKEY_MASK	0xffff
231*4882a593Smuzhiyun #define IB_BTH_PAD_SHIFT	20
232*4882a593Smuzhiyun #define IB_BTH_A_MASK		1
233*4882a593Smuzhiyun #define IB_BTH_A_SHIFT		31
234*4882a593Smuzhiyun #define IB_BTH_M_MASK		1
235*4882a593Smuzhiyun #define IB_BTH_M_SHIFT		22
236*4882a593Smuzhiyun #define IB_BTH_SE_MASK		1
237*4882a593Smuzhiyun #define IB_BTH_SE_SHIFT	23
238*4882a593Smuzhiyun #define IB_BTH_TVER_MASK	0xf
239*4882a593Smuzhiyun #define IB_BTH_TVER_SHIFT	16
240*4882a593Smuzhiyun 
ib_bth_get_pad(struct ib_other_headers * ohdr)241*4882a593Smuzhiyun static inline u8 ib_bth_get_pad(struct ib_other_headers *ohdr)
242*4882a593Smuzhiyun {
243*4882a593Smuzhiyun 	return ((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_PAD_SHIFT) &
244*4882a593Smuzhiyun 		   IB_BTH_PAD_MASK);
245*4882a593Smuzhiyun }
246*4882a593Smuzhiyun 
ib_bth_get_pkey(struct ib_other_headers * ohdr)247*4882a593Smuzhiyun static inline u16 ib_bth_get_pkey(struct ib_other_headers *ohdr)
248*4882a593Smuzhiyun {
249*4882a593Smuzhiyun 	return (be32_to_cpu(ohdr->bth[0]) & IB_BTH_PKEY_MASK);
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun 
ib_bth_get_opcode(struct ib_other_headers * ohdr)252*4882a593Smuzhiyun static inline u8 ib_bth_get_opcode(struct ib_other_headers *ohdr)
253*4882a593Smuzhiyun {
254*4882a593Smuzhiyun 	return ((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_OPCODE_SHIFT) &
255*4882a593Smuzhiyun 		   IB_BTH_OPCODE_MASK);
256*4882a593Smuzhiyun }
257*4882a593Smuzhiyun 
ib_bth_get_ackreq(struct ib_other_headers * ohdr)258*4882a593Smuzhiyun static inline u8 ib_bth_get_ackreq(struct ib_other_headers *ohdr)
259*4882a593Smuzhiyun {
260*4882a593Smuzhiyun 	return (u8)((be32_to_cpu(ohdr->bth[2]) >> IB_BTH_A_SHIFT) &
261*4882a593Smuzhiyun 		   IB_BTH_A_MASK);
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun 
ib_bth_get_migreq(struct ib_other_headers * ohdr)264*4882a593Smuzhiyun static inline u8 ib_bth_get_migreq(struct ib_other_headers *ohdr)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun 	return (u8)((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_M_SHIFT) &
267*4882a593Smuzhiyun 		    IB_BTH_M_MASK);
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun 
ib_bth_get_se(struct ib_other_headers * ohdr)270*4882a593Smuzhiyun static inline u8 ib_bth_get_se(struct ib_other_headers *ohdr)
271*4882a593Smuzhiyun {
272*4882a593Smuzhiyun 	return (u8)((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_SE_SHIFT) &
273*4882a593Smuzhiyun 		    IB_BTH_SE_MASK);
274*4882a593Smuzhiyun }
275*4882a593Smuzhiyun 
ib_bth_get_psn(struct ib_other_headers * ohdr)276*4882a593Smuzhiyun static inline u32 ib_bth_get_psn(struct ib_other_headers *ohdr)
277*4882a593Smuzhiyun {
278*4882a593Smuzhiyun 	return (u32)(be32_to_cpu(ohdr->bth[2]));
279*4882a593Smuzhiyun }
280*4882a593Smuzhiyun 
ib_bth_get_qpn(struct ib_other_headers * ohdr)281*4882a593Smuzhiyun static inline u32 ib_bth_get_qpn(struct ib_other_headers *ohdr)
282*4882a593Smuzhiyun {
283*4882a593Smuzhiyun 	return (u32)((be32_to_cpu(ohdr->bth[1])) & IB_QPN_MASK);
284*4882a593Smuzhiyun }
285*4882a593Smuzhiyun 
ib_bth_get_becn(struct ib_other_headers * ohdr)286*4882a593Smuzhiyun static inline bool ib_bth_get_becn(struct ib_other_headers *ohdr)
287*4882a593Smuzhiyun {
288*4882a593Smuzhiyun 	return (ohdr->bth[1]) & cpu_to_be32(IB_BECN_SMASK);
289*4882a593Smuzhiyun }
290*4882a593Smuzhiyun 
ib_bth_get_fecn(struct ib_other_headers * ohdr)291*4882a593Smuzhiyun static inline bool ib_bth_get_fecn(struct ib_other_headers *ohdr)
292*4882a593Smuzhiyun {
293*4882a593Smuzhiyun 	return (ohdr->bth[1]) & cpu_to_be32(IB_FECN_SMASK);
294*4882a593Smuzhiyun }
295*4882a593Smuzhiyun 
ib_bth_get_tver(struct ib_other_headers * ohdr)296*4882a593Smuzhiyun static inline u8 ib_bth_get_tver(struct ib_other_headers *ohdr)
297*4882a593Smuzhiyun {
298*4882a593Smuzhiyun 	return (u8)((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_TVER_SHIFT)  &
299*4882a593Smuzhiyun 		    IB_BTH_TVER_MASK);
300*4882a593Smuzhiyun }
301*4882a593Smuzhiyun 
ib_bth_is_solicited(struct ib_other_headers * ohdr)302*4882a593Smuzhiyun static inline bool ib_bth_is_solicited(struct ib_other_headers *ohdr)
303*4882a593Smuzhiyun {
304*4882a593Smuzhiyun 	return ohdr->bth[0] & cpu_to_be32(IB_BTH_SOLICITED);
305*4882a593Smuzhiyun }
306*4882a593Smuzhiyun 
ib_bth_is_migration(struct ib_other_headers * ohdr)307*4882a593Smuzhiyun static inline bool ib_bth_is_migration(struct ib_other_headers *ohdr)
308*4882a593Smuzhiyun {
309*4882a593Smuzhiyun 	return ohdr->bth[0] & cpu_to_be32(IB_BTH_MIG_REQ);
310*4882a593Smuzhiyun }
311*4882a593Smuzhiyun #endif                          /* IB_HDRS_H */
312