162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2014 Intel Corporation. All rights reserved. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef OPA_SMI_H 762306a36Sopenharmony_ci#define OPA_SMI_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <rdma/ib_mad.h> 1062306a36Sopenharmony_ci#include <rdma/ib_smi.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#define OPA_SMP_LID_DATA_SIZE 2016 1362306a36Sopenharmony_ci#define OPA_SMP_DR_DATA_SIZE 1872 1462306a36Sopenharmony_ci#define OPA_SMP_MAX_PATH_HOPS 64 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define OPA_MAX_VLS 32 1762306a36Sopenharmony_ci#define OPA_MAX_SLS 32 1862306a36Sopenharmony_ci#define OPA_MAX_SCS 32 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define OPA_LID_PERMISSIVE cpu_to_be32(0xFFFFFFFF) 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cistruct opa_smp { 2362306a36Sopenharmony_ci u8 base_version; 2462306a36Sopenharmony_ci u8 mgmt_class; 2562306a36Sopenharmony_ci u8 class_version; 2662306a36Sopenharmony_ci u8 method; 2762306a36Sopenharmony_ci __be16 status; 2862306a36Sopenharmony_ci u8 hop_ptr; 2962306a36Sopenharmony_ci u8 hop_cnt; 3062306a36Sopenharmony_ci __be64 tid; 3162306a36Sopenharmony_ci __be16 attr_id; 3262306a36Sopenharmony_ci __be16 resv; 3362306a36Sopenharmony_ci __be32 attr_mod; 3462306a36Sopenharmony_ci __be64 mkey; 3562306a36Sopenharmony_ci union { 3662306a36Sopenharmony_ci struct { 3762306a36Sopenharmony_ci uint8_t data[OPA_SMP_LID_DATA_SIZE]; 3862306a36Sopenharmony_ci } lid; 3962306a36Sopenharmony_ci struct { 4062306a36Sopenharmony_ci __be32 dr_slid; 4162306a36Sopenharmony_ci __be32 dr_dlid; 4262306a36Sopenharmony_ci u8 initial_path[OPA_SMP_MAX_PATH_HOPS]; 4362306a36Sopenharmony_ci u8 return_path[OPA_SMP_MAX_PATH_HOPS]; 4462306a36Sopenharmony_ci u8 reserved[8]; 4562306a36Sopenharmony_ci u8 data[OPA_SMP_DR_DATA_SIZE]; 4662306a36Sopenharmony_ci } dr; 4762306a36Sopenharmony_ci } route; 4862306a36Sopenharmony_ci} __packed; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci/* Subnet management attributes */ 5262306a36Sopenharmony_ci/* ... */ 5362306a36Sopenharmony_ci#define OPA_ATTRIB_ID_NODE_DESCRIPTION cpu_to_be16(0x0010) 5462306a36Sopenharmony_ci#define OPA_ATTRIB_ID_NODE_INFO cpu_to_be16(0x0011) 5562306a36Sopenharmony_ci#define OPA_ATTRIB_ID_PORT_INFO cpu_to_be16(0x0015) 5662306a36Sopenharmony_ci#define OPA_ATTRIB_ID_PARTITION_TABLE cpu_to_be16(0x0016) 5762306a36Sopenharmony_ci#define OPA_ATTRIB_ID_SL_TO_SC_MAP cpu_to_be16(0x0017) 5862306a36Sopenharmony_ci#define OPA_ATTRIB_ID_VL_ARBITRATION cpu_to_be16(0x0018) 5962306a36Sopenharmony_ci#define OPA_ATTRIB_ID_SM_INFO cpu_to_be16(0x0020) 6062306a36Sopenharmony_ci#define OPA_ATTRIB_ID_CABLE_INFO cpu_to_be16(0x0032) 6162306a36Sopenharmony_ci#define OPA_ATTRIB_ID_AGGREGATE cpu_to_be16(0x0080) 6262306a36Sopenharmony_ci#define OPA_ATTRIB_ID_SC_TO_SL_MAP cpu_to_be16(0x0082) 6362306a36Sopenharmony_ci#define OPA_ATTRIB_ID_SC_TO_VLR_MAP cpu_to_be16(0x0083) 6462306a36Sopenharmony_ci#define OPA_ATTRIB_ID_SC_TO_VLT_MAP cpu_to_be16(0x0084) 6562306a36Sopenharmony_ci#define OPA_ATTRIB_ID_SC_TO_VLNT_MAP cpu_to_be16(0x0085) 6662306a36Sopenharmony_ci/* ... */ 6762306a36Sopenharmony_ci#define OPA_ATTRIB_ID_PORT_STATE_INFO cpu_to_be16(0x0087) 6862306a36Sopenharmony_ci/* ... */ 6962306a36Sopenharmony_ci#define OPA_ATTRIB_ID_BUFFER_CONTROL_TABLE cpu_to_be16(0x008A) 7062306a36Sopenharmony_ci/* ... */ 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_cistruct opa_node_description { 7362306a36Sopenharmony_ci u8 data[64]; 7462306a36Sopenharmony_ci} __packed; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cistruct opa_node_info { 7762306a36Sopenharmony_ci u8 base_version; 7862306a36Sopenharmony_ci u8 class_version; 7962306a36Sopenharmony_ci u8 node_type; 8062306a36Sopenharmony_ci u8 num_ports; 8162306a36Sopenharmony_ci __be32 reserved; 8262306a36Sopenharmony_ci __be64 system_image_guid; 8362306a36Sopenharmony_ci __be64 node_guid; 8462306a36Sopenharmony_ci __be64 port_guid; 8562306a36Sopenharmony_ci __be16 partition_cap; 8662306a36Sopenharmony_ci __be16 device_id; 8762306a36Sopenharmony_ci __be32 revision; 8862306a36Sopenharmony_ci u8 local_port_num; 8962306a36Sopenharmony_ci u8 vendor_id[3]; /* network byte order */ 9062306a36Sopenharmony_ci} __packed; 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci#define OPA_PARTITION_TABLE_BLK_SIZE 32 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cistatic inline u8 9562306a36Sopenharmony_ciopa_get_smp_direction(struct opa_smp *smp) 9662306a36Sopenharmony_ci{ 9762306a36Sopenharmony_ci return ib_get_smp_direction((struct ib_smp *)smp); 9862306a36Sopenharmony_ci} 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_cistatic inline u8 *opa_get_smp_data(struct opa_smp *smp) 10162306a36Sopenharmony_ci{ 10262306a36Sopenharmony_ci if (smp->mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) 10362306a36Sopenharmony_ci return smp->route.dr.data; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci return smp->route.lid.data; 10662306a36Sopenharmony_ci} 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_cistatic inline size_t opa_get_smp_data_size(struct opa_smp *smp) 10962306a36Sopenharmony_ci{ 11062306a36Sopenharmony_ci if (smp->mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) 11162306a36Sopenharmony_ci return sizeof(smp->route.dr.data); 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci return sizeof(smp->route.lid.data); 11462306a36Sopenharmony_ci} 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_cistatic inline size_t opa_get_smp_header_size(struct opa_smp *smp) 11762306a36Sopenharmony_ci{ 11862306a36Sopenharmony_ci if (smp->mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) 11962306a36Sopenharmony_ci return sizeof(*smp) - sizeof(smp->route.dr.data); 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci return sizeof(*smp) - sizeof(smp->route.lid.data); 12262306a36Sopenharmony_ci} 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci#endif /* OPA_SMI_H */ 125