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