^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (c) 2014 Intel Corporation. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #ifndef OPA_SMI_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #define OPA_SMI_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <rdma/ib_mad.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <rdma/ib_smi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define OPA_SMP_LID_DATA_SIZE 2016
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define OPA_SMP_DR_DATA_SIZE 1872
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define OPA_SMP_MAX_PATH_HOPS 64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define OPA_MAX_VLS 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define OPA_MAX_SLS 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define OPA_MAX_SCS 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define OPA_LID_PERMISSIVE cpu_to_be32(0xFFFFFFFF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) struct opa_smp {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) u8 base_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) u8 mgmt_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) u8 class_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) u8 method;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) __be16 status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) u8 hop_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) u8 hop_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) __be64 tid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) __be16 attr_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) __be16 resv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) __be32 attr_mod;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) __be64 mkey;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) uint8_t data[OPA_SMP_LID_DATA_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) } lid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) __be32 dr_slid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) __be32 dr_dlid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) u8 initial_path[OPA_SMP_MAX_PATH_HOPS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) u8 return_path[OPA_SMP_MAX_PATH_HOPS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) u8 reserved[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) u8 data[OPA_SMP_DR_DATA_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) } dr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) } route;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) /* Subnet management attributes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) /* ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define OPA_ATTRIB_ID_NODE_DESCRIPTION cpu_to_be16(0x0010)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define OPA_ATTRIB_ID_NODE_INFO cpu_to_be16(0x0011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define OPA_ATTRIB_ID_PORT_INFO cpu_to_be16(0x0015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define OPA_ATTRIB_ID_PARTITION_TABLE cpu_to_be16(0x0016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define OPA_ATTRIB_ID_SL_TO_SC_MAP cpu_to_be16(0x0017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define OPA_ATTRIB_ID_VL_ARBITRATION cpu_to_be16(0x0018)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define OPA_ATTRIB_ID_SM_INFO cpu_to_be16(0x0020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define OPA_ATTRIB_ID_CABLE_INFO cpu_to_be16(0x0032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define OPA_ATTRIB_ID_AGGREGATE cpu_to_be16(0x0080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define OPA_ATTRIB_ID_SC_TO_SL_MAP cpu_to_be16(0x0082)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define OPA_ATTRIB_ID_SC_TO_VLR_MAP cpu_to_be16(0x0083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define OPA_ATTRIB_ID_SC_TO_VLT_MAP cpu_to_be16(0x0084)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define OPA_ATTRIB_ID_SC_TO_VLNT_MAP cpu_to_be16(0x0085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) /* ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define OPA_ATTRIB_ID_PORT_STATE_INFO cpu_to_be16(0x0087)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) /* ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define OPA_ATTRIB_ID_BUFFER_CONTROL_TABLE cpu_to_be16(0x008A)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) /* ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) struct opa_node_description {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) u8 data[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) struct opa_node_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) u8 base_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) u8 class_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) u8 node_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) u8 num_ports;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) __be32 reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) __be64 system_image_guid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) __be64 node_guid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) __be64 port_guid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) __be16 partition_cap;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) __be16 device_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) __be32 revision;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) u8 local_port_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) u8 vendor_id[3]; /* network byte order */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define OPA_PARTITION_TABLE_BLK_SIZE 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) static inline u8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) opa_get_smp_direction(struct opa_smp *smp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) return ib_get_smp_direction((struct ib_smp *)smp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) static inline u8 *opa_get_smp_data(struct opa_smp *smp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) if (smp->mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) return smp->route.dr.data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) return smp->route.lid.data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) static inline size_t opa_get_smp_data_size(struct opa_smp *smp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) if (smp->mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) return sizeof(smp->route.dr.data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) return sizeof(smp->route.lid.data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) static inline size_t opa_get_smp_header_size(struct opa_smp *smp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) if (smp->mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) return sizeof(*smp) - sizeof(smp->route.dr.data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) return sizeof(*smp) - sizeof(smp->route.lid.data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #endif /* OPA_SMI_H */