cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ib_mad.h (25064B)


      1/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
      2/*
      3 * Copyright (c) 2004 Mellanox Technologies Ltd.  All rights reserved.
      4 * Copyright (c) 2004 Infinicon Corporation.  All rights reserved.
      5 * Copyright (c) 2004 Intel Corporation.  All rights reserved.
      6 * Copyright (c) 2004 Topspin Corporation.  All rights reserved.
      7 * Copyright (c) 2004-2006 Voltaire Corporation.  All rights reserved.
      8 */
      9
     10#ifndef IB_MAD_H
     11#define IB_MAD_H
     12
     13#include <linux/list.h>
     14
     15#include <rdma/ib_verbs.h>
     16#include <uapi/rdma/ib_user_mad.h>
     17
     18/* Management base versions */
     19#define IB_MGMT_BASE_VERSION			1
     20#define OPA_MGMT_BASE_VERSION			0x80
     21
     22#define OPA_SM_CLASS_VERSION			0x80
     23
     24/* Management classes */
     25#define IB_MGMT_CLASS_SUBN_LID_ROUTED		0x01
     26#define IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE	0x81
     27#define IB_MGMT_CLASS_SUBN_ADM			0x03
     28#define IB_MGMT_CLASS_PERF_MGMT			0x04
     29#define IB_MGMT_CLASS_BM			0x05
     30#define IB_MGMT_CLASS_DEVICE_MGMT		0x06
     31#define IB_MGMT_CLASS_CM			0x07
     32#define IB_MGMT_CLASS_SNMP			0x08
     33#define IB_MGMT_CLASS_DEVICE_ADM		0x10
     34#define IB_MGMT_CLASS_BOOT_MGMT			0x11
     35#define IB_MGMT_CLASS_BIS			0x12
     36#define IB_MGMT_CLASS_CONG_MGMT			0x21
     37#define IB_MGMT_CLASS_VENDOR_RANGE2_START	0x30
     38#define IB_MGMT_CLASS_VENDOR_RANGE2_END		0x4F
     39
     40#define	IB_OPENIB_OUI				(0x001405)
     41
     42/* Management methods */
     43#define IB_MGMT_METHOD_GET			0x01
     44#define IB_MGMT_METHOD_SET			0x02
     45#define IB_MGMT_METHOD_GET_RESP			0x81
     46#define IB_MGMT_METHOD_SEND			0x03
     47#define IB_MGMT_METHOD_TRAP			0x05
     48#define IB_MGMT_METHOD_REPORT			0x06
     49#define IB_MGMT_METHOD_REPORT_RESP		0x86
     50#define IB_MGMT_METHOD_TRAP_REPRESS		0x07
     51
     52#define IB_MGMT_METHOD_RESP			0x80
     53#define IB_BM_ATTR_MOD_RESP			cpu_to_be32(1)
     54
     55#define IB_MGMT_MAX_METHODS			128
     56
     57/* MAD Status field bit masks */
     58#define IB_MGMT_MAD_STATUS_SUCCESS			0x0000
     59#define IB_MGMT_MAD_STATUS_BUSY				0x0001
     60#define IB_MGMT_MAD_STATUS_REDIRECT_REQD		0x0002
     61#define IB_MGMT_MAD_STATUS_BAD_VERSION			0x0004
     62#define IB_MGMT_MAD_STATUS_UNSUPPORTED_METHOD		0x0008
     63#define IB_MGMT_MAD_STATUS_UNSUPPORTED_METHOD_ATTRIB	0x000c
     64#define IB_MGMT_MAD_STATUS_INVALID_ATTRIB_VALUE		0x001c
     65
     66/* RMPP information */
     67#define IB_MGMT_RMPP_VERSION			1
     68
     69#define IB_MGMT_RMPP_TYPE_DATA			1
     70#define IB_MGMT_RMPP_TYPE_ACK			2
     71#define IB_MGMT_RMPP_TYPE_STOP			3
     72#define IB_MGMT_RMPP_TYPE_ABORT			4
     73
     74#define IB_MGMT_RMPP_FLAG_ACTIVE		1
     75#define IB_MGMT_RMPP_FLAG_FIRST			(1<<1)
     76#define IB_MGMT_RMPP_FLAG_LAST			(1<<2)
     77
     78#define IB_MGMT_RMPP_NO_RESPTIME		0x1F
     79
     80#define	IB_MGMT_RMPP_STATUS_SUCCESS		0
     81#define	IB_MGMT_RMPP_STATUS_RESX		1
     82#define	IB_MGMT_RMPP_STATUS_ABORT_MIN		118
     83#define	IB_MGMT_RMPP_STATUS_T2L			118
     84#define	IB_MGMT_RMPP_STATUS_BAD_LEN		119
     85#define	IB_MGMT_RMPP_STATUS_BAD_SEG		120
     86#define	IB_MGMT_RMPP_STATUS_BADT		121
     87#define	IB_MGMT_RMPP_STATUS_W2S			122
     88#define	IB_MGMT_RMPP_STATUS_S2B			123
     89#define	IB_MGMT_RMPP_STATUS_BAD_STATUS		124
     90#define	IB_MGMT_RMPP_STATUS_UNV			125
     91#define	IB_MGMT_RMPP_STATUS_TMR			126
     92#define	IB_MGMT_RMPP_STATUS_UNSPEC		127
     93#define	IB_MGMT_RMPP_STATUS_ABORT_MAX		127
     94
     95#define IB_QP0		0
     96#define IB_QP1		cpu_to_be32(1)
     97#define IB_QP1_QKEY	0x80010000
     98#define IB_QP_SET_QKEY	0x80000000
     99
    100#define IB_DEFAULT_PKEY_PARTIAL 0x7FFF
    101#define IB_DEFAULT_PKEY_FULL	0xFFFF
    102
    103/*
    104 * Generic trap/notice types
    105 */
    106#define IB_NOTICE_TYPE_FATAL	0x80
    107#define IB_NOTICE_TYPE_URGENT	0x81
    108#define IB_NOTICE_TYPE_SECURITY	0x82
    109#define IB_NOTICE_TYPE_SM	0x83
    110#define IB_NOTICE_TYPE_INFO	0x84
    111
    112/*
    113 * Generic trap/notice producers
    114 */
    115#define IB_NOTICE_PROD_CA		cpu_to_be16(1)
    116#define IB_NOTICE_PROD_SWITCH		cpu_to_be16(2)
    117#define IB_NOTICE_PROD_ROUTER		cpu_to_be16(3)
    118#define IB_NOTICE_PROD_CLASS_MGR	cpu_to_be16(4)
    119
    120enum {
    121	IB_MGMT_MAD_HDR = 24,
    122	IB_MGMT_MAD_DATA = 232,
    123	IB_MGMT_RMPP_HDR = 36,
    124	IB_MGMT_RMPP_DATA = 220,
    125	IB_MGMT_VENDOR_HDR = 40,
    126	IB_MGMT_VENDOR_DATA = 216,
    127	IB_MGMT_SA_HDR = 56,
    128	IB_MGMT_SA_DATA = 200,
    129	IB_MGMT_DEVICE_HDR = 64,
    130	IB_MGMT_DEVICE_DATA = 192,
    131	IB_MGMT_MAD_SIZE = IB_MGMT_MAD_HDR + IB_MGMT_MAD_DATA,
    132	OPA_MGMT_MAD_DATA = 2024,
    133	OPA_MGMT_RMPP_DATA = 2012,
    134	OPA_MGMT_MAD_SIZE = IB_MGMT_MAD_HDR + OPA_MGMT_MAD_DATA,
    135};
    136
    137struct ib_mad_hdr {
    138	u8	base_version;
    139	u8	mgmt_class;
    140	u8	class_version;
    141	u8	method;
    142	__be16	status;
    143	__be16	class_specific;
    144	__be64	tid;
    145	__be16	attr_id;
    146	__be16	resv;
    147	__be32	attr_mod;
    148};
    149
    150struct ib_rmpp_hdr {
    151	u8	rmpp_version;
    152	u8	rmpp_type;
    153	u8	rmpp_rtime_flags;
    154	u8	rmpp_status;
    155	__be32	seg_num;
    156	__be32	paylen_newwin;
    157};
    158
    159typedef u64 __bitwise ib_sa_comp_mask;
    160
    161#define IB_SA_COMP_MASK(n) ((__force ib_sa_comp_mask) cpu_to_be64(1ull << (n)))
    162
    163/*
    164 * ib_sa_hdr and ib_sa_mad structures must be packed because they have
    165 * 64-bit fields that are only 32-bit aligned. 64-bit architectures will
    166 * lay them out wrong otherwise.  (And unfortunately they are sent on
    167 * the wire so we can't change the layout)
    168 */
    169struct ib_sa_hdr {
    170	__be64			sm_key;
    171	__be16			attr_offset;
    172	__be16			reserved;
    173	ib_sa_comp_mask		comp_mask;
    174} __packed;
    175
    176struct ib_mad {
    177	struct ib_mad_hdr	mad_hdr;
    178	u8			data[IB_MGMT_MAD_DATA];
    179};
    180
    181struct opa_mad {
    182	struct ib_mad_hdr	mad_hdr;
    183	u8			data[OPA_MGMT_MAD_DATA];
    184};
    185
    186struct ib_rmpp_mad {
    187	struct ib_mad_hdr	mad_hdr;
    188	struct ib_rmpp_hdr	rmpp_hdr;
    189	u8			data[IB_MGMT_RMPP_DATA];
    190};
    191
    192struct opa_rmpp_mad {
    193	struct ib_mad_hdr	mad_hdr;
    194	struct ib_rmpp_hdr	rmpp_hdr;
    195	u8			data[OPA_MGMT_RMPP_DATA];
    196};
    197
    198struct ib_sa_mad {
    199	struct ib_mad_hdr	mad_hdr;
    200	struct ib_rmpp_hdr	rmpp_hdr;
    201	struct ib_sa_hdr	sa_hdr;
    202	u8			data[IB_MGMT_SA_DATA];
    203} __packed;
    204
    205struct ib_vendor_mad {
    206	struct ib_mad_hdr	mad_hdr;
    207	struct ib_rmpp_hdr	rmpp_hdr;
    208	u8			reserved;
    209	u8			oui[3];
    210	u8			data[IB_MGMT_VENDOR_DATA];
    211};
    212
    213#define IB_MGMT_CLASSPORTINFO_ATTR_ID	cpu_to_be16(0x0001)
    214
    215#define IB_CLASS_PORT_INFO_RESP_TIME_MASK	0x1F
    216#define IB_CLASS_PORT_INFO_RESP_TIME_FIELD_SIZE 5
    217
    218struct ib_class_port_info {
    219	u8			base_version;
    220	u8			class_version;
    221	__be16			capability_mask;
    222	  /* 27 bits for cap_mask2, 5 bits for resp_time */
    223	__be32			cap_mask2_resp_time;
    224	u8			redirect_gid[16];
    225	__be32			redirect_tcslfl;
    226	__be16			redirect_lid;
    227	__be16			redirect_pkey;
    228	__be32			redirect_qp;
    229	__be32			redirect_qkey;
    230	u8			trap_gid[16];
    231	__be32			trap_tcslfl;
    232	__be16			trap_lid;
    233	__be16			trap_pkey;
    234	__be32			trap_hlqp;
    235	__be32			trap_qkey;
    236};
    237
    238/* PortInfo CapabilityMask */
    239enum ib_port_capability_mask_bits {
    240	IB_PORT_SM = 1 << 1,
    241	IB_PORT_NOTICE_SUP = 1 << 2,
    242	IB_PORT_TRAP_SUP = 1 << 3,
    243	IB_PORT_OPT_IPD_SUP = 1 << 4,
    244	IB_PORT_AUTO_MIGR_SUP = 1 << 5,
    245	IB_PORT_SL_MAP_SUP = 1 << 6,
    246	IB_PORT_MKEY_NVRAM = 1 << 7,
    247	IB_PORT_PKEY_NVRAM = 1 << 8,
    248	IB_PORT_LED_INFO_SUP = 1 << 9,
    249	IB_PORT_SM_DISABLED = 1 << 10,
    250	IB_PORT_SYS_IMAGE_GUID_SUP = 1 << 11,
    251	IB_PORT_PKEY_SW_EXT_PORT_TRAP_SUP = 1 << 12,
    252	IB_PORT_EXTENDED_SPEEDS_SUP = 1 << 14,
    253	IB_PORT_CAP_MASK2_SUP = 1 << 15,
    254	IB_PORT_CM_SUP = 1 << 16,
    255	IB_PORT_SNMP_TUNNEL_SUP = 1 << 17,
    256	IB_PORT_REINIT_SUP = 1 << 18,
    257	IB_PORT_DEVICE_MGMT_SUP = 1 << 19,
    258	IB_PORT_VENDOR_CLASS_SUP = 1 << 20,
    259	IB_PORT_DR_NOTICE_SUP = 1 << 21,
    260	IB_PORT_CAP_MASK_NOTICE_SUP = 1 << 22,
    261	IB_PORT_BOOT_MGMT_SUP = 1 << 23,
    262	IB_PORT_LINK_LATENCY_SUP = 1 << 24,
    263	IB_PORT_CLIENT_REG_SUP = 1 << 25,
    264	IB_PORT_OTHER_LOCAL_CHANGES_SUP = 1 << 26,
    265	IB_PORT_LINK_SPEED_WIDTH_TABLE_SUP = 1 << 27,
    266	IB_PORT_VENDOR_SPECIFIC_MADS_TABLE_SUP = 1 << 28,
    267	IB_PORT_MCAST_PKEY_TRAP_SUPPRESSION_SUP = 1 << 29,
    268	IB_PORT_MCAST_FDB_TOP_SUP = 1 << 30,
    269	IB_PORT_HIERARCHY_INFO_SUP = 1ULL << 31,
    270};
    271
    272enum ib_port_capability_mask2_bits {
    273	IB_PORT_SET_NODE_DESC_SUP		= 1 << 0,
    274	IB_PORT_EX_PORT_INFO_EX_SUP		= 1 << 1,
    275	IB_PORT_VIRT_SUP			= 1 << 2,
    276	IB_PORT_SWITCH_PORT_STATE_TABLE_SUP	= 1 << 3,
    277	IB_PORT_LINK_WIDTH_2X_SUP		= 1 << 4,
    278	IB_PORT_LINK_SPEED_HDR_SUP		= 1 << 5,
    279	IB_PORT_LINK_SPEED_NDR_SUP		= 1 << 10,
    280};
    281
    282#define OPA_CLASS_PORT_INFO_PR_SUPPORT BIT(26)
    283
    284struct opa_class_port_info {
    285	u8 base_version;
    286	u8 class_version;
    287	__be16 cap_mask;
    288	__be32 cap_mask2_resp_time;
    289
    290	u8 redirect_gid[16];
    291	__be32 redirect_tc_fl;
    292	__be32 redirect_lid;
    293	__be32 redirect_sl_qp;
    294	__be32 redirect_qkey;
    295
    296	u8 trap_gid[16];
    297	__be32 trap_tc_fl;
    298	__be32 trap_lid;
    299	__be32 trap_hl_qp;
    300	__be32 trap_qkey;
    301
    302	__be16 trap_pkey;
    303	__be16 redirect_pkey;
    304
    305	u8 trap_sl_rsvd;
    306	u8 reserved[3];
    307} __packed;
    308
    309/**
    310 * ib_get_cpi_resp_time - Returns the resp_time value from
    311 * cap_mask2_resp_time in ib_class_port_info.
    312 * @cpi: A struct ib_class_port_info mad.
    313 */
    314static inline u8 ib_get_cpi_resp_time(struct ib_class_port_info *cpi)
    315{
    316	return (u8)(be32_to_cpu(cpi->cap_mask2_resp_time) &
    317		    IB_CLASS_PORT_INFO_RESP_TIME_MASK);
    318}
    319
    320/**
    321 * ib_set_cpi_resptime - Sets the response time in an
    322 * ib_class_port_info mad.
    323 * @cpi: A struct ib_class_port_info.
    324 * @rtime: The response time to set.
    325 */
    326static inline void ib_set_cpi_resp_time(struct ib_class_port_info *cpi,
    327					u8 rtime)
    328{
    329	cpi->cap_mask2_resp_time =
    330		(cpi->cap_mask2_resp_time &
    331		 cpu_to_be32(~IB_CLASS_PORT_INFO_RESP_TIME_MASK)) |
    332		cpu_to_be32(rtime & IB_CLASS_PORT_INFO_RESP_TIME_MASK);
    333}
    334
    335/**
    336 * ib_get_cpi_capmask2 - Returns the capmask2 value from
    337 * cap_mask2_resp_time in ib_class_port_info.
    338 * @cpi: A struct ib_class_port_info mad.
    339 */
    340static inline u32 ib_get_cpi_capmask2(struct ib_class_port_info *cpi)
    341{
    342	return (be32_to_cpu(cpi->cap_mask2_resp_time) >>
    343		IB_CLASS_PORT_INFO_RESP_TIME_FIELD_SIZE);
    344}
    345
    346/**
    347 * ib_set_cpi_capmask2 - Sets the capmask2 in an
    348 * ib_class_port_info mad.
    349 * @cpi: A struct ib_class_port_info.
    350 * @capmask2: The capmask2 to set.
    351 */
    352static inline void ib_set_cpi_capmask2(struct ib_class_port_info *cpi,
    353				       u32 capmask2)
    354{
    355	cpi->cap_mask2_resp_time =
    356		(cpi->cap_mask2_resp_time &
    357		 cpu_to_be32(IB_CLASS_PORT_INFO_RESP_TIME_MASK)) |
    358		cpu_to_be32(capmask2 <<
    359			    IB_CLASS_PORT_INFO_RESP_TIME_FIELD_SIZE);
    360}
    361
    362/**
    363 * opa_get_cpi_capmask2 - Returns the capmask2 value from
    364 * cap_mask2_resp_time in ib_class_port_info.
    365 * @cpi: A struct opa_class_port_info mad.
    366 */
    367static inline u32 opa_get_cpi_capmask2(struct opa_class_port_info *cpi)
    368{
    369	return (be32_to_cpu(cpi->cap_mask2_resp_time) >>
    370		IB_CLASS_PORT_INFO_RESP_TIME_FIELD_SIZE);
    371}
    372
    373struct ib_mad_notice_attr {
    374	u8 generic_type;
    375	u8 prod_type_msb;
    376	__be16 prod_type_lsb;
    377	__be16 trap_num;
    378	__be16 issuer_lid;
    379	__be16 toggle_count;
    380
    381	union {
    382		struct {
    383			u8	details[54];
    384		} raw_data;
    385
    386		struct {
    387			__be16	reserved;
    388			__be16	lid;		/* where violation happened */
    389			u8	port_num;	/* where violation happened */
    390		} __packed ntc_129_131;
    391
    392		struct {
    393			__be16	reserved;
    394			__be16	lid;		/* LID where change occurred */
    395			u8	reserved2;
    396			u8	local_changes;	/* low bit - local changes */
    397			__be32	new_cap_mask;	/* new capability mask */
    398			u8	reserved3;
    399			u8	change_flags;	/* low 3 bits only */
    400		} __packed ntc_144;
    401
    402		struct {
    403			__be16	reserved;
    404			__be16	lid;		/* lid where sys guid changed */
    405			__be16	reserved2;
    406			__be64	new_sys_guid;
    407		} __packed ntc_145;
    408
    409		struct {
    410			__be16	reserved;
    411			__be16	lid;
    412			__be16	dr_slid;
    413			u8	method;
    414			u8	reserved2;
    415			__be16	attr_id;
    416			__be32	attr_mod;
    417			__be64	mkey;
    418			u8	reserved3;
    419			u8	dr_trunc_hop;
    420			u8	dr_rtn_path[30];
    421		} __packed ntc_256;
    422
    423		struct {
    424			__be16		reserved;
    425			__be16		lid1;
    426			__be16		lid2;
    427			__be32		key;
    428			__be32		sl_qp1;	/* SL: high 4 bits */
    429			__be32		qp2;	/* high 8 bits reserved */
    430			union ib_gid	gid1;
    431			union ib_gid	gid2;
    432		} __packed ntc_257_258;
    433
    434	} details;
    435};
    436
    437/**
    438 * ib_mad_send_buf - MAD data buffer and work request for sends.
    439 * @next: A pointer used to chain together MADs for posting.
    440 * @mad: References an allocated MAD data buffer for MADs that do not have
    441 *   RMPP active.  For MADs using RMPP, references the common and management
    442 *   class specific headers.
    443 * @mad_agent: MAD agent that allocated the buffer.
    444 * @ah: The address handle to use when sending the MAD.
    445 * @context: User-controlled context fields.
    446 * @hdr_len: Indicates the size of the data header of the MAD.  This length
    447 *   includes the common MAD, RMPP, and class specific headers.
    448 * @data_len: Indicates the total size of user-transferred data.
    449 * @seg_count: The number of RMPP segments allocated for this send.
    450 * @seg_size: Size of the data in each RMPP segment.  This does not include
    451 *   class specific headers.
    452 * @seg_rmpp_size: Size of each RMPP segment including the class specific
    453 *   headers.
    454 * @timeout_ms: Time to wait for a response.
    455 * @retries: Number of times to retry a request for a response.  For MADs
    456 *   using RMPP, this applies per window.  On completion, returns the number
    457 *   of retries needed to complete the transfer.
    458 *
    459 * Users are responsible for initializing the MAD buffer itself, with the
    460 * exception of any RMPP header.  Additional segment buffer space allocated
    461 * beyond data_len is padding.
    462 */
    463struct ib_mad_send_buf {
    464	struct ib_mad_send_buf	*next;
    465	void			*mad;
    466	struct ib_mad_agent	*mad_agent;
    467	struct ib_ah		*ah;
    468	void			*context[2];
    469	int			hdr_len;
    470	int			data_len;
    471	int			seg_count;
    472	int			seg_size;
    473	int			seg_rmpp_size;
    474	int			timeout_ms;
    475	int			retries;
    476};
    477
    478/**
    479 * ib_response_mad - Returns if the specified MAD has been generated in
    480 *   response to a sent request or trap.
    481 */
    482int ib_response_mad(const struct ib_mad_hdr *hdr);
    483
    484/**
    485 * ib_get_rmpp_resptime - Returns the RMPP response time.
    486 * @rmpp_hdr: An RMPP header.
    487 */
    488static inline u8 ib_get_rmpp_resptime(struct ib_rmpp_hdr *rmpp_hdr)
    489{
    490	return rmpp_hdr->rmpp_rtime_flags >> 3;
    491}
    492
    493/**
    494 * ib_get_rmpp_flags - Returns the RMPP flags.
    495 * @rmpp_hdr: An RMPP header.
    496 */
    497static inline u8 ib_get_rmpp_flags(struct ib_rmpp_hdr *rmpp_hdr)
    498{
    499	return rmpp_hdr->rmpp_rtime_flags & 0x7;
    500}
    501
    502/**
    503 * ib_set_rmpp_resptime - Sets the response time in an RMPP header.
    504 * @rmpp_hdr: An RMPP header.
    505 * @rtime: The response time to set.
    506 */
    507static inline void ib_set_rmpp_resptime(struct ib_rmpp_hdr *rmpp_hdr, u8 rtime)
    508{
    509	rmpp_hdr->rmpp_rtime_flags = ib_get_rmpp_flags(rmpp_hdr) | (rtime << 3);
    510}
    511
    512/**
    513 * ib_set_rmpp_flags - Sets the flags in an RMPP header.
    514 * @rmpp_hdr: An RMPP header.
    515 * @flags: The flags to set.
    516 */
    517static inline void ib_set_rmpp_flags(struct ib_rmpp_hdr *rmpp_hdr, u8 flags)
    518{
    519	rmpp_hdr->rmpp_rtime_flags = (rmpp_hdr->rmpp_rtime_flags & 0xF8) |
    520				     (flags & 0x7);
    521}
    522
    523struct ib_mad_agent;
    524struct ib_mad_send_wc;
    525struct ib_mad_recv_wc;
    526
    527/**
    528 * ib_mad_send_handler - callback handler for a sent MAD.
    529 * @mad_agent: MAD agent that sent the MAD.
    530 * @mad_send_wc: Send work completion information on the sent MAD.
    531 */
    532typedef void (*ib_mad_send_handler)(struct ib_mad_agent *mad_agent,
    533				    struct ib_mad_send_wc *mad_send_wc);
    534
    535/**
    536 * ib_mad_recv_handler - callback handler for a received MAD.
    537 * @mad_agent: MAD agent requesting the received MAD.
    538 * @send_buf: Send buffer if found, else NULL
    539 * @mad_recv_wc: Received work completion information on the received MAD.
    540 *
    541 * MADs received in response to a send request operation will be handed to
    542 * the user before the send operation completes.  All data buffers given
    543 * to registered agents through this routine are owned by the receiving
    544 * client.
    545 */
    546typedef void (*ib_mad_recv_handler)(struct ib_mad_agent *mad_agent,
    547				    struct ib_mad_send_buf *send_buf,
    548				    struct ib_mad_recv_wc *mad_recv_wc);
    549
    550/**
    551 * ib_mad_agent - Used to track MAD registration with the access layer.
    552 * @device: Reference to device registration is on.
    553 * @qp: Reference to QP used for sending and receiving MADs.
    554 * @mr: Memory region for system memory usable for DMA.
    555 * @recv_handler: Callback handler for a received MAD.
    556 * @send_handler: Callback handler for a sent MAD.
    557 * @context: User-specified context associated with this registration.
    558 * @hi_tid: Access layer assigned transaction ID for this client.
    559 *   Unsolicited MADs sent by this client will have the upper 32-bits
    560 *   of their TID set to this value.
    561 * @flags: registration flags
    562 * @port_num: Port number on which QP is registered
    563 * @rmpp_version: If set, indicates the RMPP version used by this agent.
    564 */
    565enum {
    566	IB_MAD_USER_RMPP = IB_USER_MAD_USER_RMPP,
    567};
    568struct ib_mad_agent {
    569	struct ib_device	*device;
    570	struct ib_qp		*qp;
    571	ib_mad_recv_handler	recv_handler;
    572	ib_mad_send_handler	send_handler;
    573	void			*context;
    574	u32			hi_tid;
    575	u32			flags;
    576	void			*security;
    577	struct list_head	mad_agent_sec_list;
    578	u8			port_num;
    579	u8			rmpp_version;
    580	bool			smp_allowed;
    581};
    582
    583/**
    584 * ib_mad_send_wc - MAD send completion information.
    585 * @send_buf: Send MAD data buffer associated with the send MAD request.
    586 * @status: Completion status.
    587 * @vendor_err: Optional vendor error information returned with a failed
    588 *   request.
    589 */
    590struct ib_mad_send_wc {
    591	struct ib_mad_send_buf	*send_buf;
    592	enum ib_wc_status	status;
    593	u32			vendor_err;
    594};
    595
    596/**
    597 * ib_mad_recv_buf - received MAD buffer information.
    598 * @list: Reference to next data buffer for a received RMPP MAD.
    599 * @grh: References a data buffer containing the global route header.
    600 *   The data refereced by this buffer is only valid if the GRH is
    601 *   valid.
    602 * @mad: References the start of the received MAD.
    603 */
    604struct ib_mad_recv_buf {
    605	struct list_head	list;
    606	struct ib_grh		*grh;
    607	union {
    608		struct ib_mad	*mad;
    609		struct opa_mad	*opa_mad;
    610	};
    611};
    612
    613/**
    614 * ib_mad_recv_wc - received MAD information.
    615 * @wc: Completion information for the received data.
    616 * @recv_buf: Specifies the location of the received data buffer(s).
    617 * @rmpp_list: Specifies a list of RMPP reassembled received MAD buffers.
    618 * @mad_len: The length of the received MAD, without duplicated headers.
    619 * @mad_seg_size: The size of individual MAD segments
    620 *
    621 * For received response, the wr_id contains a pointer to the ib_mad_send_buf
    622 *   for the corresponding send request.
    623 */
    624struct ib_mad_recv_wc {
    625	struct ib_wc		*wc;
    626	struct ib_mad_recv_buf	recv_buf;
    627	struct list_head	rmpp_list;
    628	int			mad_len;
    629	size_t			mad_seg_size;
    630};
    631
    632/**
    633 * ib_mad_reg_req - MAD registration request
    634 * @mgmt_class: Indicates which management class of MADs should be receive
    635 *   by the caller.  This field is only required if the user wishes to
    636 *   receive unsolicited MADs, otherwise it should be 0.
    637 * @mgmt_class_version: Indicates which version of MADs for the given
    638 *   management class to receive.
    639 * @oui: Indicates IEEE OUI when mgmt_class is a vendor class
    640 *   in the range from 0x30 to 0x4f. Otherwise not used.
    641 * @method_mask: The caller will receive unsolicited MADs for any method
    642 *   where @method_mask = 1.
    643 *
    644 */
    645struct ib_mad_reg_req {
    646	u8	mgmt_class;
    647	u8	mgmt_class_version;
    648	u8	oui[3];
    649	DECLARE_BITMAP(method_mask, IB_MGMT_MAX_METHODS);
    650};
    651
    652/**
    653 * ib_register_mad_agent - Register to send/receive MADs.
    654 * @device: The device to register with.
    655 * @port_num: The port on the specified device to use.
    656 * @qp_type: Specifies which QP to access.  Must be either
    657 *   IB_QPT_SMI or IB_QPT_GSI.
    658 * @mad_reg_req: Specifies which unsolicited MADs should be received
    659 *   by the caller.  This parameter may be NULL if the caller only
    660 *   wishes to receive solicited responses.
    661 * @rmpp_version: If set, indicates that the client will send
    662 *   and receive MADs that contain the RMPP header for the given version.
    663 *   If set to 0, indicates that RMPP is not used by this client.
    664 * @send_handler: The completion callback routine invoked after a send
    665 *   request has completed.
    666 * @recv_handler: The completion callback routine invoked for a received
    667 *   MAD.
    668 * @context: User specified context associated with the registration.
    669 * @registration_flags: Registration flags to set for this agent
    670 */
    671struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
    672					   u32 port_num,
    673					   enum ib_qp_type qp_type,
    674					   struct ib_mad_reg_req *mad_reg_req,
    675					   u8 rmpp_version,
    676					   ib_mad_send_handler send_handler,
    677					   ib_mad_recv_handler recv_handler,
    678					   void *context,
    679					   u32 registration_flags);
    680/**
    681 * ib_unregister_mad_agent - Unregisters a client from using MAD services.
    682 * @mad_agent: Corresponding MAD registration request to deregister.
    683 *
    684 * After invoking this routine, MAD services are no longer usable by the
    685 * client on the associated QP.
    686 */
    687void ib_unregister_mad_agent(struct ib_mad_agent *mad_agent);
    688
    689/**
    690 * ib_post_send_mad - Posts MAD(s) to the send queue of the QP associated
    691 *   with the registered client.
    692 * @send_buf: Specifies the information needed to send the MAD(s).
    693 * @bad_send_buf: Specifies the MAD on which an error was encountered.  This
    694 *   parameter is optional if only a single MAD is posted.
    695 *
    696 * Sent MADs are not guaranteed to complete in the order that they were posted.
    697 *
    698 * If the MAD requires RMPP, the data buffer should contain a single copy
    699 * of the common MAD, RMPP, and class specific headers, followed by the class
    700 * defined data.  If the class defined data would not divide evenly into
    701 * RMPP segments, then space must be allocated at the end of the referenced
    702 * buffer for any required padding.  To indicate the amount of class defined
    703 * data being transferred, the paylen_newwin field in the RMPP header should
    704 * be set to the size of the class specific header plus the amount of class
    705 * defined data being transferred.  The paylen_newwin field should be
    706 * specified in network-byte order.
    707 */
    708int ib_post_send_mad(struct ib_mad_send_buf *send_buf,
    709		     struct ib_mad_send_buf **bad_send_buf);
    710
    711
    712/**
    713 * ib_free_recv_mad - Returns data buffers used to receive a MAD.
    714 * @mad_recv_wc: Work completion information for a received MAD.
    715 *
    716 * Clients receiving MADs through their ib_mad_recv_handler must call this
    717 * routine to return the work completion buffers to the access layer.
    718 */
    719void ib_free_recv_mad(struct ib_mad_recv_wc *mad_recv_wc);
    720
    721/**
    722 * ib_modify_mad - Modifies an outstanding send MAD operation.
    723 * @send_buf: Indicates the MAD to modify.
    724 * @timeout_ms: New timeout value for sent MAD.
    725 *
    726 * This call will reset the timeout value for a sent MAD to the specified
    727 * value.
    728 */
    729int ib_modify_mad(struct ib_mad_send_buf *send_buf, u32 timeout_ms);
    730
    731/**
    732 * ib_cancel_mad - Cancels an outstanding send MAD operation.
    733 * @send_buf: Indicates the MAD to cancel.
    734 *
    735 * MADs will be returned to the user through the corresponding
    736 * ib_mad_send_handler.
    737 */
    738static inline void ib_cancel_mad(struct ib_mad_send_buf *send_buf)
    739{
    740	ib_modify_mad(send_buf, 0);
    741}
    742
    743/**
    744 * ib_create_send_mad - Allocate and initialize a data buffer and work request
    745 *   for sending a MAD.
    746 * @mad_agent: Specifies the registered MAD service to associate with the MAD.
    747 * @remote_qpn: Specifies the QPN of the receiving node.
    748 * @pkey_index: Specifies which PKey the MAD will be sent using.  This field
    749 *   is valid only if the remote_qpn is QP 1.
    750 * @rmpp_active: Indicates if the send will enable RMPP.
    751 * @hdr_len: Indicates the size of the data header of the MAD.  This length
    752 *   should include the common MAD header, RMPP header, plus any class
    753 *   specific header.
    754 * @data_len: Indicates the size of any user-transferred data.  The call will
    755 *   automatically adjust the allocated buffer size to account for any
    756 *   additional padding that may be necessary.
    757 * @gfp_mask: GFP mask used for the memory allocation.
    758 * @base_version: Base Version of this MAD
    759 *
    760 * This routine allocates a MAD for sending.  The returned MAD send buffer
    761 * will reference a data buffer usable for sending a MAD, along
    762 * with an initialized work request structure.  Users may modify the returned
    763 * MAD data buffer before posting the send.
    764 *
    765 * The returned MAD header, class specific headers, and any padding will be
    766 * cleared.  Users are responsible for initializing the common MAD header,
    767 * any class specific header, and MAD data area.
    768 * If @rmpp_active is set, the RMPP header will be initialized for sending.
    769 */
    770struct ib_mad_send_buf *ib_create_send_mad(struct ib_mad_agent *mad_agent,
    771					   u32 remote_qpn, u16 pkey_index,
    772					   int rmpp_active,
    773					   int hdr_len, int data_len,
    774					   gfp_t gfp_mask,
    775					   u8 base_version);
    776
    777/**
    778 * ib_is_mad_class_rmpp - returns whether given management class
    779 * supports RMPP.
    780 * @mgmt_class: management class
    781 *
    782 * This routine returns whether the management class supports RMPP.
    783 */
    784int ib_is_mad_class_rmpp(u8 mgmt_class);
    785
    786/**
    787 * ib_get_mad_data_offset - returns the data offset for a given
    788 * management class.
    789 * @mgmt_class: management class
    790 *
    791 * This routine returns the data offset in the MAD for the management
    792 * class requested.
    793 */
    794int ib_get_mad_data_offset(u8 mgmt_class);
    795
    796/**
    797 * ib_get_rmpp_segment - returns the data buffer for a given RMPP segment.
    798 * @send_buf: Previously allocated send data buffer.
    799 * @seg_num: number of segment to return
    800 *
    801 * This routine returns a pointer to the data buffer of an RMPP MAD.
    802 * Users must provide synchronization to @send_buf around this call.
    803 */
    804void *ib_get_rmpp_segment(struct ib_mad_send_buf *send_buf, int seg_num);
    805
    806/**
    807 * ib_free_send_mad - Returns data buffers used to send a MAD.
    808 * @send_buf: Previously allocated send data buffer.
    809 */
    810void ib_free_send_mad(struct ib_mad_send_buf *send_buf);
    811
    812/**
    813 * ib_mad_kernel_rmpp_agent - Returns if the agent is performing RMPP.
    814 * @agent: the agent in question
    815 * @return: true if agent is performing rmpp, false otherwise.
    816 */
    817int ib_mad_kernel_rmpp_agent(const struct ib_mad_agent *agent);
    818
    819#endif /* IB_MAD_H */