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