162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright(c) 2017 Intel Corporation. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef OPA_ADDR_H 762306a36Sopenharmony_ci#define OPA_ADDR_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <rdma/opa_smi.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define OPA_SPECIAL_OUI (0x00066AULL) 1262306a36Sopenharmony_ci#define OPA_MAKE_ID(x) (cpu_to_be64(OPA_SPECIAL_OUI << 40 | (x))) 1362306a36Sopenharmony_ci#define OPA_TO_IB_UCAST_LID(x) (((x) >= be16_to_cpu(IB_MULTICAST_LID_BASE)) \ 1462306a36Sopenharmony_ci ? 0 : x) 1562306a36Sopenharmony_ci#define OPA_GID_INDEX 0x1 1662306a36Sopenharmony_ci/** 1762306a36Sopenharmony_ci * 0xF8 - 4 bits of multicast range and 1 bit for collective range 1862306a36Sopenharmony_ci * Example: For 24 bit LID space, 1962306a36Sopenharmony_ci * Multicast range: 0xF00000 to 0xF7FFFF 2062306a36Sopenharmony_ci * Collective range: 0xF80000 to 0xFFFFFE 2162306a36Sopenharmony_ci */ 2262306a36Sopenharmony_ci#define OPA_MCAST_NR 0x4 /* Number of top bits set */ 2362306a36Sopenharmony_ci#define OPA_COLLECTIVE_NR 0x1 /* Number of bits after MCAST_NR */ 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci/** 2662306a36Sopenharmony_ci * ib_is_opa_gid: Returns true if the top 24 bits of the gid 2762306a36Sopenharmony_ci * contains the OPA_STL_OUI identifier. This identifies that 2862306a36Sopenharmony_ci * the provided gid is a special purpose GID meant to carry 2962306a36Sopenharmony_ci * extended LID information. 3062306a36Sopenharmony_ci * 3162306a36Sopenharmony_ci * @gid: The Global identifier 3262306a36Sopenharmony_ci */ 3362306a36Sopenharmony_cistatic inline bool ib_is_opa_gid(const union ib_gid *gid) 3462306a36Sopenharmony_ci{ 3562306a36Sopenharmony_ci return ((be64_to_cpu(gid->global.interface_id) >> 40) == 3662306a36Sopenharmony_ci OPA_SPECIAL_OUI); 3762306a36Sopenharmony_ci} 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/** 4062306a36Sopenharmony_ci * opa_get_lid_from_gid: Returns the last 32 bits of the gid. 4162306a36Sopenharmony_ci * OPA devices use one of the gids in the gid table to also 4262306a36Sopenharmony_ci * store the lid. 4362306a36Sopenharmony_ci * 4462306a36Sopenharmony_ci * @gid: The Global identifier 4562306a36Sopenharmony_ci */ 4662306a36Sopenharmony_cistatic inline u32 opa_get_lid_from_gid(const union ib_gid *gid) 4762306a36Sopenharmony_ci{ 4862306a36Sopenharmony_ci return be64_to_cpu(gid->global.interface_id) & 0xFFFFFFFF; 4962306a36Sopenharmony_ci} 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci/** 5262306a36Sopenharmony_ci * opa_is_extended_lid: Returns true if dlid or slid are 5362306a36Sopenharmony_ci * extended. 5462306a36Sopenharmony_ci * 5562306a36Sopenharmony_ci * @dlid: The DLID 5662306a36Sopenharmony_ci * @slid: The SLID 5762306a36Sopenharmony_ci */ 5862306a36Sopenharmony_cistatic inline bool opa_is_extended_lid(__be32 dlid, __be32 slid) 5962306a36Sopenharmony_ci{ 6062306a36Sopenharmony_ci if ((be32_to_cpu(dlid) >= 6162306a36Sopenharmony_ci be16_to_cpu(IB_MULTICAST_LID_BASE)) || 6262306a36Sopenharmony_ci (be32_to_cpu(slid) >= 6362306a36Sopenharmony_ci be16_to_cpu(IB_MULTICAST_LID_BASE))) 6462306a36Sopenharmony_ci return true; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci return false; 6762306a36Sopenharmony_ci} 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/* Get multicast lid base */ 7062306a36Sopenharmony_cistatic inline u32 opa_get_mcast_base(u32 nr_top_bits) 7162306a36Sopenharmony_ci{ 7262306a36Sopenharmony_ci return (be32_to_cpu(OPA_LID_PERMISSIVE) << (32 - nr_top_bits)); 7362306a36Sopenharmony_ci} 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci/* Check for a valid unicast LID for non-SM traffic types */ 7662306a36Sopenharmony_cistatic inline bool rdma_is_valid_unicast_lid(struct rdma_ah_attr *attr) 7762306a36Sopenharmony_ci{ 7862306a36Sopenharmony_ci if (attr->type == RDMA_AH_ATTR_TYPE_IB) { 7962306a36Sopenharmony_ci if (!rdma_ah_get_dlid(attr) || 8062306a36Sopenharmony_ci rdma_ah_get_dlid(attr) >= 8162306a36Sopenharmony_ci be16_to_cpu(IB_MULTICAST_LID_BASE)) 8262306a36Sopenharmony_ci return false; 8362306a36Sopenharmony_ci } else if (attr->type == RDMA_AH_ATTR_TYPE_OPA) { 8462306a36Sopenharmony_ci if (!rdma_ah_get_dlid(attr) || 8562306a36Sopenharmony_ci rdma_ah_get_dlid(attr) >= 8662306a36Sopenharmony_ci opa_get_mcast_base(OPA_MCAST_NR)) 8762306a36Sopenharmony_ci return false; 8862306a36Sopenharmony_ci } 8962306a36Sopenharmony_ci return true; 9062306a36Sopenharmony_ci} 9162306a36Sopenharmony_ci#endif /* OPA_ADDR_H */ 92