xref: /kernel/linux/linux-6.6/include/rdma/ib_hdrs.h (revision 62306a36)
162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright(c) 2016 - 2018 Intel Corporation.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef IB_HDRS_H
762306a36Sopenharmony_ci#define IB_HDRS_H
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/types.h>
1062306a36Sopenharmony_ci#include <asm/unaligned.h>
1162306a36Sopenharmony_ci#include <rdma/ib_verbs.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#define IB_SEQ_NAK	(3 << 29)
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/* AETH NAK opcode values */
1662306a36Sopenharmony_ci#define IB_RNR_NAK                      0x20
1762306a36Sopenharmony_ci#define IB_NAK_PSN_ERROR                0x60
1862306a36Sopenharmony_ci#define IB_NAK_INVALID_REQUEST          0x61
1962306a36Sopenharmony_ci#define IB_NAK_REMOTE_ACCESS_ERROR      0x62
2062306a36Sopenharmony_ci#define IB_NAK_REMOTE_OPERATIONAL_ERROR 0x63
2162306a36Sopenharmony_ci#define IB_NAK_INVALID_RD_REQUEST       0x64
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define IB_BTH_REQ_ACK		BIT(31)
2462306a36Sopenharmony_ci#define IB_BTH_SOLICITED	BIT(23)
2562306a36Sopenharmony_ci#define IB_BTH_MIG_REQ		BIT(22)
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#define IB_GRH_VERSION		6
2862306a36Sopenharmony_ci#define IB_GRH_VERSION_MASK	0xF
2962306a36Sopenharmony_ci#define IB_GRH_VERSION_SHIFT	28
3062306a36Sopenharmony_ci#define IB_GRH_TCLASS_MASK	0xFF
3162306a36Sopenharmony_ci#define IB_GRH_TCLASS_SHIFT	20
3262306a36Sopenharmony_ci#define IB_GRH_FLOW_MASK	0xFFFFF
3362306a36Sopenharmony_ci#define IB_GRH_FLOW_SHIFT	0
3462306a36Sopenharmony_ci#define IB_GRH_NEXT_HDR		0x1B
3562306a36Sopenharmony_ci#define IB_FECN_SHIFT 31
3662306a36Sopenharmony_ci#define IB_FECN_MASK 1
3762306a36Sopenharmony_ci#define IB_FECN_SMASK BIT(IB_FECN_SHIFT)
3862306a36Sopenharmony_ci#define IB_BECN_SHIFT 30
3962306a36Sopenharmony_ci#define IB_BECN_MASK 1
4062306a36Sopenharmony_ci#define IB_BECN_SMASK BIT(IB_BECN_SHIFT)
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#define IB_AETH_CREDIT_SHIFT	24
4362306a36Sopenharmony_ci#define IB_AETH_CREDIT_MASK	0x1F
4462306a36Sopenharmony_ci#define IB_AETH_CREDIT_INVAL	0x1F
4562306a36Sopenharmony_ci#define IB_AETH_NAK_SHIFT	29
4662306a36Sopenharmony_ci#define IB_MSN_MASK		0xFFFFFF
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistruct ib_reth {
4962306a36Sopenharmony_ci	__be64 vaddr;        /* potentially unaligned */
5062306a36Sopenharmony_ci	__be32 rkey;
5162306a36Sopenharmony_ci	__be32 length;
5262306a36Sopenharmony_ci} __packed;
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistruct ib_atomic_eth {
5562306a36Sopenharmony_ci	__be64 vaddr;        /* potentially unaligned */
5662306a36Sopenharmony_ci	__be32 rkey;
5762306a36Sopenharmony_ci	__be64 swap_data;    /* potentially unaligned */
5862306a36Sopenharmony_ci	__be64 compare_data; /* potentially unaligned */
5962306a36Sopenharmony_ci} __packed;
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#include <rdma/tid_rdma_defs.h>
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ciunion ib_ehdrs {
6462306a36Sopenharmony_ci	struct {
6562306a36Sopenharmony_ci		__be32 deth[2];
6662306a36Sopenharmony_ci		__be32 imm_data;
6762306a36Sopenharmony_ci	} ud;
6862306a36Sopenharmony_ci	struct {
6962306a36Sopenharmony_ci		struct ib_reth reth;
7062306a36Sopenharmony_ci		__be32 imm_data;
7162306a36Sopenharmony_ci	} rc;
7262306a36Sopenharmony_ci	struct {
7362306a36Sopenharmony_ci		__be32 aeth;
7462306a36Sopenharmony_ci		__be64 atomic_ack_eth; /* potentially unaligned */
7562306a36Sopenharmony_ci	} __packed at;
7662306a36Sopenharmony_ci	__be32 imm_data;
7762306a36Sopenharmony_ci	__be32 aeth;
7862306a36Sopenharmony_ci	__be32 ieth;
7962306a36Sopenharmony_ci	struct ib_atomic_eth atomic_eth;
8062306a36Sopenharmony_ci	/* TID RDMA headers */
8162306a36Sopenharmony_ci	union {
8262306a36Sopenharmony_ci		struct tid_rdma_read_req r_req;
8362306a36Sopenharmony_ci		struct tid_rdma_read_resp r_rsp;
8462306a36Sopenharmony_ci		struct tid_rdma_write_req w_req;
8562306a36Sopenharmony_ci		struct tid_rdma_write_resp w_rsp;
8662306a36Sopenharmony_ci		struct tid_rdma_write_data w_data;
8762306a36Sopenharmony_ci		struct tid_rdma_resync resync;
8862306a36Sopenharmony_ci		struct tid_rdma_ack ack;
8962306a36Sopenharmony_ci	} tid_rdma;
9062306a36Sopenharmony_ci}  __packed;
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_cistruct ib_other_headers {
9362306a36Sopenharmony_ci	__be32 bth[3];
9462306a36Sopenharmony_ci	union ib_ehdrs u;
9562306a36Sopenharmony_ci} __packed;
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_cistruct ib_header {
9862306a36Sopenharmony_ci	__be16 lrh[4];
9962306a36Sopenharmony_ci	union {
10062306a36Sopenharmony_ci		struct {
10162306a36Sopenharmony_ci			struct ib_grh grh;
10262306a36Sopenharmony_ci			struct ib_other_headers oth;
10362306a36Sopenharmony_ci		} l;
10462306a36Sopenharmony_ci		struct ib_other_headers oth;
10562306a36Sopenharmony_ci	} u;
10662306a36Sopenharmony_ci} __packed;
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci/* accessors for unaligned __be64 items */
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_cistatic inline u64 ib_u64_get(__be64 *p)
11162306a36Sopenharmony_ci{
11262306a36Sopenharmony_ci	return get_unaligned_be64(p);
11362306a36Sopenharmony_ci}
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_cistatic inline void ib_u64_put(u64 val, __be64 *p)
11662306a36Sopenharmony_ci{
11762306a36Sopenharmony_ci	put_unaligned_be64(val, p);
11862306a36Sopenharmony_ci}
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_cistatic inline u64 get_ib_reth_vaddr(struct ib_reth *reth)
12162306a36Sopenharmony_ci{
12262306a36Sopenharmony_ci	return ib_u64_get(&reth->vaddr);
12362306a36Sopenharmony_ci}
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_cistatic inline void put_ib_reth_vaddr(u64 val, struct ib_reth *reth)
12662306a36Sopenharmony_ci{
12762306a36Sopenharmony_ci	ib_u64_put(val, &reth->vaddr);
12862306a36Sopenharmony_ci}
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_cistatic inline u64 get_ib_ateth_vaddr(struct ib_atomic_eth *ateth)
13162306a36Sopenharmony_ci{
13262306a36Sopenharmony_ci	return ib_u64_get(&ateth->vaddr);
13362306a36Sopenharmony_ci}
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_cistatic inline void put_ib_ateth_vaddr(u64 val, struct ib_atomic_eth *ateth)
13662306a36Sopenharmony_ci{
13762306a36Sopenharmony_ci	ib_u64_put(val, &ateth->vaddr);
13862306a36Sopenharmony_ci}
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_cistatic inline u64 get_ib_ateth_swap(struct ib_atomic_eth *ateth)
14162306a36Sopenharmony_ci{
14262306a36Sopenharmony_ci	return ib_u64_get(&ateth->swap_data);
14362306a36Sopenharmony_ci}
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_cistatic inline void put_ib_ateth_swap(u64 val, struct ib_atomic_eth *ateth)
14662306a36Sopenharmony_ci{
14762306a36Sopenharmony_ci	ib_u64_put(val, &ateth->swap_data);
14862306a36Sopenharmony_ci}
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_cistatic inline u64 get_ib_ateth_compare(struct ib_atomic_eth *ateth)
15162306a36Sopenharmony_ci{
15262306a36Sopenharmony_ci	return ib_u64_get(&ateth->compare_data);
15362306a36Sopenharmony_ci}
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_cistatic inline void put_ib_ateth_compare(u64 val, struct ib_atomic_eth *ateth)
15662306a36Sopenharmony_ci{
15762306a36Sopenharmony_ci	ib_u64_put(val, &ateth->compare_data);
15862306a36Sopenharmony_ci}
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci/*
16162306a36Sopenharmony_ci * 9B/IB Packet Format
16262306a36Sopenharmony_ci */
16362306a36Sopenharmony_ci#define IB_LNH_MASK		3
16462306a36Sopenharmony_ci#define IB_SC_MASK		0xf
16562306a36Sopenharmony_ci#define IB_SC_SHIFT		12
16662306a36Sopenharmony_ci#define IB_SC5_MASK		0x10
16762306a36Sopenharmony_ci#define IB_SL_MASK		0xf
16862306a36Sopenharmony_ci#define IB_SL_SHIFT		4
16962306a36Sopenharmony_ci#define IB_SL_SHIFT		4
17062306a36Sopenharmony_ci#define IB_LVER_MASK	0xf
17162306a36Sopenharmony_ci#define IB_LVER_SHIFT	8
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_cistatic inline u8 ib_get_lnh(struct ib_header *hdr)
17462306a36Sopenharmony_ci{
17562306a36Sopenharmony_ci	return (be16_to_cpu(hdr->lrh[0]) & IB_LNH_MASK);
17662306a36Sopenharmony_ci}
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_cistatic inline u8 ib_get_sc(struct ib_header *hdr)
17962306a36Sopenharmony_ci{
18062306a36Sopenharmony_ci	return ((be16_to_cpu(hdr->lrh[0]) >> IB_SC_SHIFT) & IB_SC_MASK);
18162306a36Sopenharmony_ci}
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_cistatic inline bool ib_is_sc5(u16 sc5)
18462306a36Sopenharmony_ci{
18562306a36Sopenharmony_ci	return !!(sc5 & IB_SC5_MASK);
18662306a36Sopenharmony_ci}
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_cistatic inline u8 ib_get_sl(struct ib_header *hdr)
18962306a36Sopenharmony_ci{
19062306a36Sopenharmony_ci	return ((be16_to_cpu(hdr->lrh[0]) >> IB_SL_SHIFT) & IB_SL_MASK);
19162306a36Sopenharmony_ci}
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_cistatic inline u16 ib_get_dlid(struct ib_header *hdr)
19462306a36Sopenharmony_ci{
19562306a36Sopenharmony_ci	return (be16_to_cpu(hdr->lrh[1]));
19662306a36Sopenharmony_ci}
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_cistatic inline u16 ib_get_slid(struct ib_header *hdr)
19962306a36Sopenharmony_ci{
20062306a36Sopenharmony_ci	return (be16_to_cpu(hdr->lrh[3]));
20162306a36Sopenharmony_ci}
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_cistatic inline u8 ib_get_lver(struct ib_header *hdr)
20462306a36Sopenharmony_ci{
20562306a36Sopenharmony_ci	return (u8)((be16_to_cpu(hdr->lrh[0]) >> IB_LVER_SHIFT) &
20662306a36Sopenharmony_ci		   IB_LVER_MASK);
20762306a36Sopenharmony_ci}
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_cistatic inline u32 ib_get_qkey(struct ib_other_headers *ohdr)
21062306a36Sopenharmony_ci{
21162306a36Sopenharmony_ci	return be32_to_cpu(ohdr->u.ud.deth[0]);
21262306a36Sopenharmony_ci}
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_cistatic inline u32 ib_get_sqpn(struct ib_other_headers *ohdr)
21562306a36Sopenharmony_ci{
21662306a36Sopenharmony_ci	return ((be32_to_cpu(ohdr->u.ud.deth[1])) & IB_QPN_MASK);
21762306a36Sopenharmony_ci}
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ci/*
22062306a36Sopenharmony_ci * BTH
22162306a36Sopenharmony_ci */
22262306a36Sopenharmony_ci#define IB_BTH_OPCODE_MASK	0xff
22362306a36Sopenharmony_ci#define IB_BTH_OPCODE_SHIFT	24
22462306a36Sopenharmony_ci#define IB_BTH_PAD_MASK	3
22562306a36Sopenharmony_ci#define IB_BTH_PKEY_MASK	0xffff
22662306a36Sopenharmony_ci#define IB_BTH_PAD_SHIFT	20
22762306a36Sopenharmony_ci#define IB_BTH_A_MASK		1
22862306a36Sopenharmony_ci#define IB_BTH_A_SHIFT		31
22962306a36Sopenharmony_ci#define IB_BTH_M_MASK		1
23062306a36Sopenharmony_ci#define IB_BTH_M_SHIFT		22
23162306a36Sopenharmony_ci#define IB_BTH_SE_MASK		1
23262306a36Sopenharmony_ci#define IB_BTH_SE_SHIFT	23
23362306a36Sopenharmony_ci#define IB_BTH_TVER_MASK	0xf
23462306a36Sopenharmony_ci#define IB_BTH_TVER_SHIFT	16
23562306a36Sopenharmony_ci#define IB_BTH_OPCODE_CNP	0x81
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_cistatic inline u8 ib_bth_get_pad(struct ib_other_headers *ohdr)
23862306a36Sopenharmony_ci{
23962306a36Sopenharmony_ci	return ((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_PAD_SHIFT) &
24062306a36Sopenharmony_ci		   IB_BTH_PAD_MASK);
24162306a36Sopenharmony_ci}
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_cistatic inline u16 ib_bth_get_pkey(struct ib_other_headers *ohdr)
24462306a36Sopenharmony_ci{
24562306a36Sopenharmony_ci	return (be32_to_cpu(ohdr->bth[0]) & IB_BTH_PKEY_MASK);
24662306a36Sopenharmony_ci}
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_cistatic inline u8 ib_bth_get_opcode(struct ib_other_headers *ohdr)
24962306a36Sopenharmony_ci{
25062306a36Sopenharmony_ci	return ((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_OPCODE_SHIFT) &
25162306a36Sopenharmony_ci		   IB_BTH_OPCODE_MASK);
25262306a36Sopenharmony_ci}
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_cistatic inline u8 ib_bth_get_ackreq(struct ib_other_headers *ohdr)
25562306a36Sopenharmony_ci{
25662306a36Sopenharmony_ci	return (u8)((be32_to_cpu(ohdr->bth[2]) >> IB_BTH_A_SHIFT) &
25762306a36Sopenharmony_ci		   IB_BTH_A_MASK);
25862306a36Sopenharmony_ci}
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_cistatic inline u8 ib_bth_get_migreq(struct ib_other_headers *ohdr)
26162306a36Sopenharmony_ci{
26262306a36Sopenharmony_ci	return (u8)((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_M_SHIFT) &
26362306a36Sopenharmony_ci		    IB_BTH_M_MASK);
26462306a36Sopenharmony_ci}
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_cistatic inline u8 ib_bth_get_se(struct ib_other_headers *ohdr)
26762306a36Sopenharmony_ci{
26862306a36Sopenharmony_ci	return (u8)((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_SE_SHIFT) &
26962306a36Sopenharmony_ci		    IB_BTH_SE_MASK);
27062306a36Sopenharmony_ci}
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_cistatic inline u32 ib_bth_get_psn(struct ib_other_headers *ohdr)
27362306a36Sopenharmony_ci{
27462306a36Sopenharmony_ci	return (u32)(be32_to_cpu(ohdr->bth[2]));
27562306a36Sopenharmony_ci}
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_cistatic inline u32 ib_bth_get_qpn(struct ib_other_headers *ohdr)
27862306a36Sopenharmony_ci{
27962306a36Sopenharmony_ci	return (u32)((be32_to_cpu(ohdr->bth[1])) & IB_QPN_MASK);
28062306a36Sopenharmony_ci}
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_cistatic inline bool ib_bth_get_becn(struct ib_other_headers *ohdr)
28362306a36Sopenharmony_ci{
28462306a36Sopenharmony_ci	return (ohdr->bth[1]) & cpu_to_be32(IB_BECN_SMASK);
28562306a36Sopenharmony_ci}
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_cistatic inline bool ib_bth_get_fecn(struct ib_other_headers *ohdr)
28862306a36Sopenharmony_ci{
28962306a36Sopenharmony_ci	return (ohdr->bth[1]) & cpu_to_be32(IB_FECN_SMASK);
29062306a36Sopenharmony_ci}
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_cistatic inline u8 ib_bth_get_tver(struct ib_other_headers *ohdr)
29362306a36Sopenharmony_ci{
29462306a36Sopenharmony_ci	return (u8)((be32_to_cpu(ohdr->bth[0]) >> IB_BTH_TVER_SHIFT)  &
29562306a36Sopenharmony_ci		    IB_BTH_TVER_MASK);
29662306a36Sopenharmony_ci}
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_cistatic inline bool ib_bth_is_solicited(struct ib_other_headers *ohdr)
29962306a36Sopenharmony_ci{
30062306a36Sopenharmony_ci	return ohdr->bth[0] & cpu_to_be32(IB_BTH_SOLICITED);
30162306a36Sopenharmony_ci}
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_cistatic inline bool ib_bth_is_migration(struct ib_other_headers *ohdr)
30462306a36Sopenharmony_ci{
30562306a36Sopenharmony_ci	return ohdr->bth[0] & cpu_to_be32(IB_BTH_MIG_REQ);
30662306a36Sopenharmony_ci}
30762306a36Sopenharmony_ci#endif                          /* IB_HDRS_H */
308