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