xref: /openbmc/linux/include/rdma/opa_addr.h (revision 4b4193256c8d3bc3a5397b5cd9494c2ad386317d)
1*6bf9d8f6SLeon Romanovsky /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
287f0faadSDoug Ledford /*
387f0faadSDoug Ledford  * Copyright(c) 2017 Intel Corporation.
487f0faadSDoug Ledford  */
587f0faadSDoug Ledford 
687f0faadSDoug Ledford #ifndef OPA_ADDR_H
787f0faadSDoug Ledford #define OPA_ADDR_H
887f0faadSDoug Ledford 
913c19222SDon Hiatt #include <rdma/opa_smi.h>
1013c19222SDon Hiatt 
1187f0faadSDoug Ledford #define	OPA_SPECIAL_OUI		(0x00066AULL)
1287f0faadSDoug Ledford #define OPA_MAKE_ID(x)          (cpu_to_be64(OPA_SPECIAL_OUI << 40 | (x)))
13582faf31SDasaratharaman Chandramouli #define OPA_TO_IB_UCAST_LID(x) (((x) >= be16_to_cpu(IB_MULTICAST_LID_BASE)) \
14582faf31SDasaratharaman Chandramouli 				? 0 : x)
1588733e3bSDon Hiatt #define OPA_GID_INDEX		0x1
1687f0faadSDoug Ledford /**
1713c19222SDon Hiatt  * 0xF8 - 4 bits of multicast range and 1 bit for collective range
1813c19222SDon Hiatt  * Example: For 24 bit LID space,
1913c19222SDon Hiatt  * Multicast range: 0xF00000 to 0xF7FFFF
2013c19222SDon Hiatt  * Collective range: 0xF80000 to 0xFFFFFE
2113c19222SDon Hiatt  */
2213c19222SDon Hiatt #define OPA_MCAST_NR 0x4 /* Number of top bits set */
2313c19222SDon Hiatt #define OPA_COLLECTIVE_NR 0x1 /* Number of bits after MCAST_NR */
2413c19222SDon Hiatt 
2513c19222SDon Hiatt /**
2687f0faadSDoug Ledford  * ib_is_opa_gid: Returns true if the top 24 bits of the gid
2787f0faadSDoug Ledford  * contains the OPA_STL_OUI identifier. This identifies that
2887f0faadSDoug Ledford  * the provided gid is a special purpose GID meant to carry
2987f0faadSDoug Ledford  * extended LID information.
3087f0faadSDoug Ledford  *
3187f0faadSDoug Ledford  * @gid: The Global identifier
3287f0faadSDoug Ledford  */
ib_is_opa_gid(const union ib_gid * gid)33d98bb7f7SDon Hiatt static inline bool ib_is_opa_gid(const union ib_gid *gid)
3487f0faadSDoug Ledford {
3587f0faadSDoug Ledford 	return ((be64_to_cpu(gid->global.interface_id) >> 40) ==
3687f0faadSDoug Ledford 		OPA_SPECIAL_OUI);
3787f0faadSDoug Ledford }
3887f0faadSDoug Ledford 
3987f0faadSDoug Ledford /**
4087f0faadSDoug Ledford  * opa_get_lid_from_gid: Returns the last 32 bits of the gid.
4187f0faadSDoug Ledford  * OPA devices use one of the gids in the gid table to also
4287f0faadSDoug Ledford  * store the lid.
4387f0faadSDoug Ledford  *
4487f0faadSDoug Ledford  * @gid: The Global identifier
4587f0faadSDoug Ledford  */
opa_get_lid_from_gid(const union ib_gid * gid)46d98bb7f7SDon Hiatt static inline u32 opa_get_lid_from_gid(const union ib_gid *gid)
4787f0faadSDoug Ledford {
4887f0faadSDoug Ledford 	return be64_to_cpu(gid->global.interface_id) & 0xFFFFFFFF;
4987f0faadSDoug Ledford }
50e92aa00aSHiatt, Don 
51e92aa00aSHiatt, Don /**
52e92aa00aSHiatt, Don  * opa_is_extended_lid: Returns true if dlid or slid are
53e92aa00aSHiatt, Don  * extended.
54e92aa00aSHiatt, Don  *
55e92aa00aSHiatt, Don  * @dlid: The DLID
56e92aa00aSHiatt, Don  * @slid: The SLID
57e92aa00aSHiatt, Don  */
opa_is_extended_lid(__be32 dlid,__be32 slid)58a917374eSDon Hiatt static inline bool opa_is_extended_lid(__be32 dlid, __be32 slid)
59e92aa00aSHiatt, Don {
60e92aa00aSHiatt, Don 	if ((be32_to_cpu(dlid) >=
61e92aa00aSHiatt, Don 	     be16_to_cpu(IB_MULTICAST_LID_BASE)) ||
62e92aa00aSHiatt, Don 	    (be32_to_cpu(slid) >=
63e92aa00aSHiatt, Don 	     be16_to_cpu(IB_MULTICAST_LID_BASE)))
64e92aa00aSHiatt, Don 		return true;
65a917374eSDon Hiatt 
66e92aa00aSHiatt, Don 	return false;
67e92aa00aSHiatt, Don }
6813c19222SDon Hiatt 
6913c19222SDon Hiatt /* Get multicast lid base */
opa_get_mcast_base(u32 nr_top_bits)7013c19222SDon Hiatt static inline u32 opa_get_mcast_base(u32 nr_top_bits)
7113c19222SDon Hiatt {
7213c19222SDon Hiatt 	return (be32_to_cpu(OPA_LID_PERMISSIVE) << (32 - nr_top_bits));
7313c19222SDon Hiatt }
7413c19222SDon Hiatt 
75af808eceSVenkata Sandeep Dhanalakota /* Check for a valid unicast LID for non-SM traffic types */
rdma_is_valid_unicast_lid(struct rdma_ah_attr * attr)76af808eceSVenkata Sandeep Dhanalakota static inline bool rdma_is_valid_unicast_lid(struct rdma_ah_attr *attr)
77af808eceSVenkata Sandeep Dhanalakota {
78af808eceSVenkata Sandeep Dhanalakota 	if (attr->type == RDMA_AH_ATTR_TYPE_IB) {
79af808eceSVenkata Sandeep Dhanalakota 		if (!rdma_ah_get_dlid(attr) ||
80af808eceSVenkata Sandeep Dhanalakota 		    rdma_ah_get_dlid(attr) >=
814eefd62cSBart Van Assche 		    be16_to_cpu(IB_MULTICAST_LID_BASE))
82af808eceSVenkata Sandeep Dhanalakota 			return false;
83af808eceSVenkata Sandeep Dhanalakota 	} else if (attr->type == RDMA_AH_ATTR_TYPE_OPA) {
84af808eceSVenkata Sandeep Dhanalakota 		if (!rdma_ah_get_dlid(attr) ||
85af808eceSVenkata Sandeep Dhanalakota 		    rdma_ah_get_dlid(attr) >=
86af808eceSVenkata Sandeep Dhanalakota 		    opa_get_mcast_base(OPA_MCAST_NR))
87af808eceSVenkata Sandeep Dhanalakota 			return false;
88af808eceSVenkata Sandeep Dhanalakota 	}
89af808eceSVenkata Sandeep Dhanalakota 	return true;
90af808eceSVenkata Sandeep Dhanalakota }
9187f0faadSDoug Ledford #endif /* OPA_ADDR_H */
92