xref: /openbmc/linux/include/rdma/ib_hdrs.h (revision 7dafbab3)
17368ef02SMike Marciniszyn /*
27368ef02SMike Marciniszyn  * Copyright(c) 2016 Intel Corporation.
37368ef02SMike Marciniszyn  *
47368ef02SMike Marciniszyn  * This file is provided under a dual BSD/GPLv2 license.  When using or
57368ef02SMike Marciniszyn  * redistributing this file, you may do so under either license.
67368ef02SMike Marciniszyn  *
77368ef02SMike Marciniszyn  * GPL LICENSE SUMMARY
87368ef02SMike Marciniszyn  *
97368ef02SMike Marciniszyn  * This program is free software; you can redistribute it and/or modify
107368ef02SMike Marciniszyn  * it under the terms of version 2 of the GNU General Public License as
117368ef02SMike Marciniszyn  * published by the Free Software Foundation.
127368ef02SMike Marciniszyn  *
137368ef02SMike Marciniszyn  * This program is distributed in the hope that it will be useful, but
147368ef02SMike Marciniszyn  * WITHOUT ANY WARRANTY; without even the implied warranty of
157368ef02SMike Marciniszyn  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
167368ef02SMike Marciniszyn  * General Public License for more details.
177368ef02SMike Marciniszyn  *
187368ef02SMike Marciniszyn  * BSD LICENSE
197368ef02SMike Marciniszyn  *
207368ef02SMike Marciniszyn  * Redistribution and use in source and binary forms, with or without
217368ef02SMike Marciniszyn  * modification, are permitted provided that the following conditions
227368ef02SMike Marciniszyn  * are met:
237368ef02SMike Marciniszyn  *
247368ef02SMike Marciniszyn  *  - Redistributions of source code must retain the above copyright
257368ef02SMike Marciniszyn  *    notice, this list of conditions and the following disclaimer.
267368ef02SMike Marciniszyn  *  - Redistributions in binary form must reproduce the above copyright
277368ef02SMike Marciniszyn  *    notice, this list of conditions and the following disclaimer in
287368ef02SMike Marciniszyn  *    the documentation and/or other materials provided with the
297368ef02SMike Marciniszyn  *    distribution.
307368ef02SMike Marciniszyn  *  - Neither the name of Intel Corporation nor the names of its
317368ef02SMike Marciniszyn  *    contributors may be used to endorse or promote products derived
327368ef02SMike Marciniszyn  *    from this software without specific prior written permission.
337368ef02SMike Marciniszyn  *
347368ef02SMike Marciniszyn  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
357368ef02SMike Marciniszyn  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
367368ef02SMike Marciniszyn  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
377368ef02SMike Marciniszyn  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
387368ef02SMike Marciniszyn  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
397368ef02SMike Marciniszyn  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
407368ef02SMike Marciniszyn  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
417368ef02SMike Marciniszyn  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
427368ef02SMike Marciniszyn  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
437368ef02SMike Marciniszyn  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
447368ef02SMike Marciniszyn  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
457368ef02SMike Marciniszyn  *
467368ef02SMike Marciniszyn  */
477368ef02SMike Marciniszyn 
487368ef02SMike Marciniszyn #ifndef IB_HDRS_H
497368ef02SMike Marciniszyn #define IB_HDRS_H
507368ef02SMike Marciniszyn 
517368ef02SMike Marciniszyn #include <linux/types.h>
527368ef02SMike Marciniszyn #include <asm/unaligned.h>
537368ef02SMike Marciniszyn #include <rdma/ib_verbs.h>
547368ef02SMike Marciniszyn 
557368ef02SMike Marciniszyn #define IB_SEQ_NAK	(3 << 29)
567368ef02SMike Marciniszyn 
577368ef02SMike Marciniszyn /* AETH NAK opcode values */
587368ef02SMike Marciniszyn #define IB_RNR_NAK                      0x20
597368ef02SMike Marciniszyn #define IB_NAK_PSN_ERROR                0x60
607368ef02SMike Marciniszyn #define IB_NAK_INVALID_REQUEST          0x61
617368ef02SMike Marciniszyn #define IB_NAK_REMOTE_ACCESS_ERROR      0x62
627368ef02SMike Marciniszyn #define IB_NAK_REMOTE_OPERATIONAL_ERROR 0x63
637368ef02SMike Marciniszyn #define IB_NAK_INVALID_RD_REQUEST       0x64
647368ef02SMike Marciniszyn 
657368ef02SMike Marciniszyn #define IB_BTH_REQ_ACK		BIT(31)
667368ef02SMike Marciniszyn #define IB_BTH_SOLICITED	BIT(23)
677368ef02SMike Marciniszyn #define IB_BTH_MIG_REQ		BIT(22)
687368ef02SMike Marciniszyn 
697368ef02SMike Marciniszyn #define IB_GRH_VERSION		6
707368ef02SMike Marciniszyn #define IB_GRH_VERSION_MASK	0xF
717368ef02SMike Marciniszyn #define IB_GRH_VERSION_SHIFT	28
727368ef02SMike Marciniszyn #define IB_GRH_TCLASS_MASK	0xFF
737368ef02SMike Marciniszyn #define IB_GRH_TCLASS_SHIFT	20
747368ef02SMike Marciniszyn #define IB_GRH_FLOW_MASK	0xFFFFF
757368ef02SMike Marciniszyn #define IB_GRH_FLOW_SHIFT	0
767368ef02SMike Marciniszyn #define IB_GRH_NEXT_HDR		0x1B
773d591099SDon Hiatt #define IB_FECN_SHIFT 31
783d591099SDon Hiatt #define IB_FECN_MASK 1
793d591099SDon Hiatt #define IB_FECN_SMASK BIT(IB_FECN_SHIFT)
803d591099SDon Hiatt #define IB_BECN_SHIFT 30
813d591099SDon Hiatt #define IB_BECN_MASK 1
823d591099SDon Hiatt #define IB_BECN_SMASK BIT(IB_BECN_SHIFT)
837368ef02SMike Marciniszyn 
84832666c1SDon Hiatt #define IB_AETH_CREDIT_SHIFT	24
85832666c1SDon Hiatt #define IB_AETH_CREDIT_MASK	0x1F
86832666c1SDon Hiatt #define IB_AETH_CREDIT_INVAL	0x1F
87832666c1SDon Hiatt #define IB_AETH_NAK_SHIFT	29
88832666c1SDon Hiatt #define IB_MSN_MASK		0xFFFFFF
89832666c1SDon Hiatt 
907368ef02SMike Marciniszyn struct ib_reth {
917368ef02SMike Marciniszyn 	__be64 vaddr;        /* potentially unaligned */
927368ef02SMike Marciniszyn 	__be32 rkey;
937368ef02SMike Marciniszyn 	__be32 length;
947368ef02SMike Marciniszyn } __packed;
957368ef02SMike Marciniszyn 
967368ef02SMike Marciniszyn struct ib_atomic_eth {
977368ef02SMike Marciniszyn 	__be64 vaddr;        /* potentially unaligned */
987368ef02SMike Marciniszyn 	__be32 rkey;
997368ef02SMike Marciniszyn 	__be64 swap_data;    /* potentially unaligned */
1007368ef02SMike Marciniszyn 	__be64 compare_data; /* potentially unaligned */
1017368ef02SMike Marciniszyn } __packed;
1027368ef02SMike Marciniszyn 
1037368ef02SMike Marciniszyn union ib_ehdrs {
1047368ef02SMike Marciniszyn 	struct {
1057368ef02SMike Marciniszyn 		__be32 deth[2];
1067368ef02SMike Marciniszyn 		__be32 imm_data;
1077368ef02SMike Marciniszyn 	} ud;
1087368ef02SMike Marciniszyn 	struct {
1097368ef02SMike Marciniszyn 		struct ib_reth reth;
1107368ef02SMike Marciniszyn 		__be32 imm_data;
1117368ef02SMike Marciniszyn 	} rc;
1127368ef02SMike Marciniszyn 	struct {
1137368ef02SMike Marciniszyn 		__be32 aeth;
1147368ef02SMike Marciniszyn 		__be64 atomic_ack_eth; /* potentially unaligned */
1157368ef02SMike Marciniszyn 	} __packed at;
1167368ef02SMike Marciniszyn 	__be32 imm_data;
1177368ef02SMike Marciniszyn 	__be32 aeth;
1187368ef02SMike Marciniszyn 	__be32 ieth;
1197368ef02SMike Marciniszyn 	struct ib_atomic_eth atomic_eth;
1207368ef02SMike Marciniszyn }  __packed;
1217368ef02SMike Marciniszyn 
1227368ef02SMike Marciniszyn struct ib_other_headers {
1237368ef02SMike Marciniszyn 	__be32 bth[3];
1247368ef02SMike Marciniszyn 	union ib_ehdrs u;
1257368ef02SMike Marciniszyn } __packed;
1267368ef02SMike Marciniszyn 
1277368ef02SMike Marciniszyn struct ib_header {
1287368ef02SMike Marciniszyn 	__be16 lrh[4];
1297368ef02SMike Marciniszyn 	union {
1307368ef02SMike Marciniszyn 		struct {
1317368ef02SMike Marciniszyn 			struct ib_grh grh;
1327368ef02SMike Marciniszyn 			struct ib_other_headers oth;
1337368ef02SMike Marciniszyn 		} l;
1347368ef02SMike Marciniszyn 		struct ib_other_headers oth;
1357368ef02SMike Marciniszyn 	} u;
1367368ef02SMike Marciniszyn } __packed;
1377368ef02SMike Marciniszyn 
1387368ef02SMike Marciniszyn /* accessors for unaligned __be64 items */
1397368ef02SMike Marciniszyn 
1407368ef02SMike Marciniszyn static inline u64 ib_u64_get(__be64 *p)
1417368ef02SMike Marciniszyn {
1427368ef02SMike Marciniszyn 	return get_unaligned_be64(p);
1437368ef02SMike Marciniszyn }
1447368ef02SMike Marciniszyn 
1457368ef02SMike Marciniszyn static inline void ib_u64_put(u64 val, __be64 *p)
1467368ef02SMike Marciniszyn {
1477368ef02SMike Marciniszyn 	put_unaligned_be64(val, p);
1487368ef02SMike Marciniszyn }
1497368ef02SMike Marciniszyn 
1507368ef02SMike Marciniszyn static inline u64 get_ib_reth_vaddr(struct ib_reth *reth)
1517368ef02SMike Marciniszyn {
1527368ef02SMike Marciniszyn 	return ib_u64_get(&reth->vaddr);
1537368ef02SMike Marciniszyn }
1547368ef02SMike Marciniszyn 
1557368ef02SMike Marciniszyn static inline void put_ib_reth_vaddr(u64 val, struct ib_reth *reth)
1567368ef02SMike Marciniszyn {
1577368ef02SMike Marciniszyn 	ib_u64_put(val, &reth->vaddr);
1587368ef02SMike Marciniszyn }
1597368ef02SMike Marciniszyn 
1607368ef02SMike Marciniszyn static inline u64 get_ib_ateth_vaddr(struct ib_atomic_eth *ateth)
1617368ef02SMike Marciniszyn {
1627368ef02SMike Marciniszyn 	return ib_u64_get(&ateth->vaddr);
1637368ef02SMike Marciniszyn }
1647368ef02SMike Marciniszyn 
1657368ef02SMike Marciniszyn static inline void put_ib_ateth_vaddr(u64 val, struct ib_atomic_eth *ateth)
1667368ef02SMike Marciniszyn {
1677368ef02SMike Marciniszyn 	ib_u64_put(val, &ateth->vaddr);
1687368ef02SMike Marciniszyn }
1697368ef02SMike Marciniszyn 
1707368ef02SMike Marciniszyn static inline u64 get_ib_ateth_swap(struct ib_atomic_eth *ateth)
1717368ef02SMike Marciniszyn {
1727368ef02SMike Marciniszyn 	return ib_u64_get(&ateth->swap_data);
1737368ef02SMike Marciniszyn }
1747368ef02SMike Marciniszyn 
1757368ef02SMike Marciniszyn static inline void put_ib_ateth_swap(u64 val, struct ib_atomic_eth *ateth)
1767368ef02SMike Marciniszyn {
1777368ef02SMike Marciniszyn 	ib_u64_put(val, &ateth->swap_data);
1787368ef02SMike Marciniszyn }
1797368ef02SMike Marciniszyn 
1807368ef02SMike Marciniszyn static inline u64 get_ib_ateth_compare(struct ib_atomic_eth *ateth)
1817368ef02SMike Marciniszyn {
1827368ef02SMike Marciniszyn 	return ib_u64_get(&ateth->compare_data);
1837368ef02SMike Marciniszyn }
1847368ef02SMike Marciniszyn 
1857368ef02SMike Marciniszyn static inline void put_ib_ateth_compare(u64 val, struct ib_atomic_eth *ateth)
1867368ef02SMike Marciniszyn {
1877368ef02SMike Marciniszyn 	ib_u64_put(val, &ateth->compare_data);
1887368ef02SMike Marciniszyn }
1897368ef02SMike Marciniszyn 
190cb427057SDon Hiatt /*
191cb427057SDon Hiatt  * 9B/IB Packet Format
192cb427057SDon Hiatt  */
193cb427057SDon Hiatt #define IB_LNH_MASK		3
194cb427057SDon Hiatt #define IB_SC_MASK		0xf
195cb427057SDon Hiatt #define IB_SC_SHIFT		12
1967dafbab3SDon Hiatt #define IB_SC5_MASK		0x10
197cb427057SDon Hiatt #define IB_SL_MASK		0xf
198cb427057SDon Hiatt #define IB_SL_SHIFT		4
1997dafbab3SDon Hiatt #define IB_SL_SHIFT		4
2007dafbab3SDon Hiatt #define IB_LVER_MASK	0xf
2017dafbab3SDon Hiatt #define IB_LVER_SHIFT	8
202cb427057SDon Hiatt 
203cb427057SDon Hiatt static inline u8 ib_get_lnh(struct ib_header *hdr)
204cb427057SDon Hiatt {
205cb427057SDon Hiatt 	return (be16_to_cpu(hdr->lrh[0]) & IB_LNH_MASK);
206cb427057SDon Hiatt }
207cb427057SDon Hiatt 
208cb427057SDon Hiatt static inline u8 ib_get_sc(struct ib_header *hdr)
209cb427057SDon Hiatt {
210cb427057SDon Hiatt 	return ((be16_to_cpu(hdr->lrh[0]) >> IB_SC_SHIFT) & IB_SC_MASK);
211cb427057SDon Hiatt }
212cb427057SDon Hiatt 
2137dafbab3SDon Hiatt static inline bool ib_is_sc5(u16 sc5)
2147dafbab3SDon Hiatt {
2157dafbab3SDon Hiatt 	return !!(sc5 & IB_SC5_MASK);
2167dafbab3SDon Hiatt }
2177dafbab3SDon Hiatt 
218cb427057SDon Hiatt static inline u8 ib_get_sl(struct ib_header *hdr)
219cb427057SDon Hiatt {
220cb427057SDon Hiatt 	return ((be16_to_cpu(hdr->lrh[0]) >> IB_SL_SHIFT) & IB_SL_MASK);
221cb427057SDon Hiatt }
222cb427057SDon Hiatt 
223cb427057SDon Hiatt static inline u16 ib_get_dlid(struct ib_header *hdr)
224cb427057SDon Hiatt {
225cb427057SDon Hiatt 	return (be16_to_cpu(hdr->lrh[1]));
226cb427057SDon Hiatt }
227cb427057SDon Hiatt 
228cb427057SDon Hiatt static inline u16 ib_get_slid(struct ib_header *hdr)
229cb427057SDon Hiatt {
230cb427057SDon Hiatt 	return (be16_to_cpu(hdr->lrh[3]));
231cb427057SDon Hiatt }
232cb427057SDon Hiatt 
2337dafbab3SDon Hiatt static inline u8 ib_get_lver(struct ib_header *hdr)
2347dafbab3SDon Hiatt {
2357dafbab3SDon Hiatt 	return (u8)((be16_to_cpu(hdr->lrh[0]) >> IB_LVER_SHIFT) &
2367dafbab3SDon Hiatt 		   IB_LVER_MASK);
2377dafbab3SDon Hiatt }
2387dafbab3SDon Hiatt 
2397dafbab3SDon Hiatt static inline u16 ib_get_len(struct ib_header *hdr)
2407dafbab3SDon Hiatt {
2417dafbab3SDon Hiatt 	return (u16)(be16_to_cpu(hdr->lrh[2]));
2427dafbab3SDon Hiatt }
2437dafbab3SDon Hiatt 
2447dafbab3SDon Hiatt static inline u32 ib_get_qkey(struct ib_other_headers *ohdr)
2457dafbab3SDon Hiatt {
2467dafbab3SDon Hiatt 	return be32_to_cpu(ohdr->u.ud.deth[0]);
2477dafbab3SDon Hiatt }
2487dafbab3SDon Hiatt 
2497dafbab3SDon Hiatt static inline u32 ib_get_sqpn(struct ib_other_headers *ohdr)
2507dafbab3SDon Hiatt {
2517dafbab3SDon Hiatt 	return ((be32_to_cpu(ohdr->u.ud.deth[1])) & IB_QPN_MASK);
2527dafbab3SDon Hiatt }
2537dafbab3SDon Hiatt 
254cb427057SDon Hiatt /*
255cb427057SDon Hiatt  * BTH
256cb427057SDon Hiatt  */
257cb427057SDon Hiatt #define IB_BTH_OPCODE_MASK	0xff
258cb427057SDon Hiatt #define IB_BTH_OPCODE_SHIFT	24
259cb427057SDon Hiatt #define IB_BTH_PAD_MASK	3
260cb427057SDon Hiatt #define IB_BTH_PKEY_MASK	0xffff
261cb427057SDon Hiatt #define IB_BTH_PAD_SHIFT	20
2627dafbab3SDon Hiatt #define IB_BTH_A_MASK		1
2637dafbab3SDon Hiatt #define IB_BTH_A_SHIFT		31
2647dafbab3SDon Hiatt #define IB_BTH_M_MASK		1
2657dafbab3SDon Hiatt #define IB_BTH_M_SHIFT		22
2667dafbab3SDon Hiatt #define IB_BTH_SE_MASK		1
2677dafbab3SDon Hiatt #define IB_BTH_SE_SHIFT	23
2687dafbab3SDon Hiatt #define IB_BTH_TVER_MASK	0xf
2697dafbab3SDon Hiatt #define IB_BTH_TVER_SHIFT	16
270cb427057SDon Hiatt 
271cb427057SDon Hiatt static inline u8 ib_bth_get_pad(struct ib_other_headers *ohdr)
272cb427057SDon Hiatt {
273cb427057SDon Hiatt 	return ((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_PAD_SHIFT) &
274cb427057SDon Hiatt 		   IB_BTH_PAD_MASK);
275cb427057SDon Hiatt }
276cb427057SDon Hiatt 
277cb427057SDon Hiatt static inline u16 ib_bth_get_pkey(struct ib_other_headers *ohdr)
278cb427057SDon Hiatt {
279cb427057SDon Hiatt 	return (be32_to_cpu(ohdr->bth[0]) & IB_BTH_PKEY_MASK);
280cb427057SDon Hiatt }
281cb427057SDon Hiatt 
282cb427057SDon Hiatt static inline u8 ib_bth_get_opcode(struct ib_other_headers *ohdr)
283cb427057SDon Hiatt {
284cb427057SDon Hiatt 	return ((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_OPCODE_SHIFT) &
285cb427057SDon Hiatt 		   IB_BTH_OPCODE_MASK);
286cb427057SDon Hiatt }
287cb427057SDon Hiatt 
2887dafbab3SDon Hiatt static inline u8 ib_bth_get_ackreq(struct ib_other_headers *ohdr)
2897dafbab3SDon Hiatt {
2907dafbab3SDon Hiatt 	return (u8)((be32_to_cpu(ohdr->bth[2]) >> IB_BTH_A_SHIFT) &
2917dafbab3SDon Hiatt 		   IB_BTH_A_MASK);
2927dafbab3SDon Hiatt }
2937dafbab3SDon Hiatt 
2947dafbab3SDon Hiatt static inline u8 ib_bth_get_migreq(struct ib_other_headers *ohdr)
2957dafbab3SDon Hiatt {
2967dafbab3SDon Hiatt 	return (u8)((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_M_SHIFT) &
2977dafbab3SDon Hiatt 		    IB_BTH_M_MASK);
2987dafbab3SDon Hiatt }
2997dafbab3SDon Hiatt 
3007dafbab3SDon Hiatt static inline u8 ib_bth_get_se(struct ib_other_headers *ohdr)
3017dafbab3SDon Hiatt {
3027dafbab3SDon Hiatt 	return (u8)((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_SE_SHIFT) &
3037dafbab3SDon Hiatt 		    IB_BTH_SE_MASK);
3047dafbab3SDon Hiatt }
3057dafbab3SDon Hiatt 
3067dafbab3SDon Hiatt static inline u32 ib_bth_get_psn(struct ib_other_headers *ohdr)
3077dafbab3SDon Hiatt {
3087dafbab3SDon Hiatt 	return (u32)(be32_to_cpu(ohdr->bth[2]));
3097dafbab3SDon Hiatt }
3107dafbab3SDon Hiatt 
3117dafbab3SDon Hiatt static inline u32 ib_bth_get_qpn(struct ib_other_headers *ohdr)
3127dafbab3SDon Hiatt {
3137dafbab3SDon Hiatt 	return (u32)((be32_to_cpu(ohdr->bth[1])) & IB_QPN_MASK);
3147dafbab3SDon Hiatt }
3157dafbab3SDon Hiatt 
3167dafbab3SDon Hiatt static inline u8 ib_bth_get_becn(struct ib_other_headers *ohdr)
3177dafbab3SDon Hiatt {
3187dafbab3SDon Hiatt 	return (u8)((be32_to_cpu(ohdr->bth[1]) >> IB_BECN_SHIFT) &
3197dafbab3SDon Hiatt 		     IB_BECN_MASK);
3207dafbab3SDon Hiatt }
3217dafbab3SDon Hiatt 
3227dafbab3SDon Hiatt static inline u8 ib_bth_get_fecn(struct ib_other_headers *ohdr)
3237dafbab3SDon Hiatt {
3247dafbab3SDon Hiatt 	return (u8)((be32_to_cpu(ohdr->bth[1]) >> IB_FECN_SHIFT) &
3257dafbab3SDon Hiatt 		    IB_FECN_MASK);
3267dafbab3SDon Hiatt }
3277dafbab3SDon Hiatt 
3287dafbab3SDon Hiatt static inline u8 ib_bth_get_tver(struct ib_other_headers *ohdr)
3297dafbab3SDon Hiatt {
3307dafbab3SDon Hiatt 	return (u8)((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_TVER_SHIFT)  &
3317dafbab3SDon Hiatt 		    IB_BTH_TVER_MASK);
3327dafbab3SDon Hiatt }
3337dafbab3SDon Hiatt 
3347368ef02SMike Marciniszyn #endif                          /* IB_HDRS_H */
335