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