iPXE
ib_mi.h File Reference

Infiniband management interfaces. More...

#include <ipxe/list.h>
#include <ipxe/retry.h>
#include <ipxe/tables.h>
#include <ipxe/infiniband.h>

Go to the source code of this file.

Data Structures

struct  ib_mad_agent
 An Infiniband management agent. More...
struct  ib_mad_transaction_operations
 Infiniband management transaction operations. More...
struct  ib_mad_transaction
 An Infiniband management transaction. More...
struct  ib_mad_interface
 An Infiniband management interface. More...

Macros

#define IB_MAD_AGENTS   __table ( struct ib_mad_agent, "ib_mad_agents" )
 Infiniband management agents.
#define __ib_mad_agent   __table_entry ( IB_MAD_AGENTS, 01 )
 Declare an Infiniband management agent.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
static __always_inline void ib_madx_set_ownerdata (struct ib_mad_transaction *madx, void *priv)
 Set Infiniband management transaction owner-private data.
static __always_inline void * ib_madx_get_ownerdata (struct ib_mad_transaction *madx)
 Get Infiniband management transaction owner-private data.
int ib_mi_send (struct ib_device *ibdev, struct ib_mad_interface *mi, union ib_mad *mad, struct ib_address_vector *av)
 Transmit MAD.
struct ib_mad_transactionib_create_madx (struct ib_device *ibdev, struct ib_mad_interface *mi, union ib_mad *mad, struct ib_address_vector *av, struct ib_mad_transaction_operations *op)
 Create management transaction.
void ib_destroy_madx (struct ib_device *ibdev, struct ib_mad_interface *mi, struct ib_mad_transaction *madx)
int ib_create_mi (struct ib_device *ibdev, enum ib_queue_pair_type type, struct ib_mad_interface **new_mi)
 Create management interface.
void ib_destroy_mi (struct ib_device *ibdev, struct ib_mad_interface *mi)
 Destroy management interface.

Detailed Description

Infiniband management interfaces.

Definition in file ib_mi.h.

Macro Definition Documentation

◆ IB_MAD_AGENTS

#define IB_MAD_AGENTS   __table ( struct ib_mad_agent, "ib_mad_agents" )

Infiniband management agents.

Definition at line 43 of file ib_mi.h.

Referenced by ib_mi_handle().

◆ __ib_mad_agent

#define __ib_mad_agent   __table_entry ( IB_MAD_AGENTS, 01 )

Declare an Infiniband management agent.

Definition at line 46 of file ib_mi.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ ib_madx_set_ownerdata()

__always_inline void ib_madx_set_ownerdata ( struct ib_mad_transaction * madx,
void * priv )
inlinestatic

Set Infiniband management transaction owner-private data.

Parameters
madxManagement transaction
privPrivate data

Definition at line 106 of file ib_mi.h.

106 {
107 madx->owner_priv = priv;
108}
void * owner_priv
Owner private data.
Definition ib_mi.h:84
static struct tlan_private * priv
Definition tlan.c:225

References ib_mad_transaction::owner_priv, and priv.

Referenced by ib_cm_path_complete(), ib_create_path(), ib_mcast_join(), xsigo_discover(), and xsigo_xds_complete().

◆ ib_madx_get_ownerdata()

__always_inline void * ib_madx_get_ownerdata ( struct ib_mad_transaction * madx)
inlinestatic

Get Infiniband management transaction owner-private data.

Parameters
madxManagement transaction
Return values
privPrivate data

Definition at line 117 of file ib_mi.h.

117 {
118 return madx->owner_priv;
119}

References ib_mad_transaction::owner_priv.

Referenced by ib_cm_req_complete(), ib_mcast_complete(), ib_path_complete(), xsigo_xcm_complete(), and xsigo_xds_complete().

◆ ib_mi_send()

int ib_mi_send ( struct ib_device * ibdev,
struct ib_mad_interface * mi,
union ib_mad * mad,
struct ib_address_vector * av )
extern

Transmit MAD.

Parameters
ibdevInfiniband device
miManagement interface
madMAD
avDestination address vector
Return values
rcReturn status code

Definition at line 187 of file ib_mi.c.

188 {
189 struct ib_mad_hdr *hdr = &mad->hdr;
190 struct io_buffer *iobuf;
191 int rc;
192
193 /* Set common fields */
194 hdr->base_version = IB_MGMT_BASE_VERSION;
195 if ( ( hdr->tid.high == 0 ) && ( hdr->tid.low == 0 ) ) {
196 hdr->tid.high = htonl ( IB_MI_TID_MAGIC );
197 hdr->tid.low = htonl ( ++next_tid );
198 }
199 DBGC ( mi, "MI %p TX TID %08x%08x (%02x,%02x,%02x,%04x) status "
200 "%04x\n", mi, ntohl ( hdr->tid.high ), ntohl ( hdr->tid.low ),
201 hdr->mgmt_class, hdr->class_version, hdr->method,
202 ntohs ( hdr->attr_id ), ntohs ( hdr->status ) );
203 DBGC2_HDA ( mi, 0, mad, sizeof ( *mad ) );
204
205 /* Construct directed route portion of response, if necessary */
206 if ( hdr->mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE ) {
207 struct ib_mad_smp *smp = &mad->smp;
208 unsigned int hop_pointer;
209 unsigned int hop_count;
210
211 smp->mad_hdr.status |= htons ( IB_SMP_STATUS_D_INBOUND );
212 hop_pointer = smp->mad_hdr.class_specific.smp.hop_pointer;
213 hop_count = smp->mad_hdr.class_specific.smp.hop_count;
215 if ( hop_pointer < ( sizeof ( smp->return_path.hops ) /
216 sizeof ( smp->return_path.hops[0] ) ) ) {
217 smp->return_path.hops[hop_pointer] = ibdev->port;
218 } else {
219 DBGC ( mi, "MI %p TX TID %08x%08x invalid hop pointer "
220 "%d\n", mi, ntohl ( hdr->tid.high ),
221 ntohl ( hdr->tid.low ), hop_pointer );
222 return -EINVAL;
223 }
224 }
225
226 /* Construct I/O buffer */
227 iobuf = alloc_iob ( sizeof ( *mad ) );
228 if ( ! iobuf ) {
229 DBGC ( mi, "MI %p could not allocate buffer for TID "
230 "%08x%08x\n",
231 mi, ntohl ( hdr->tid.high ), ntohl ( hdr->tid.low ) );
232 return -ENOMEM;
233 }
234 memcpy ( iob_put ( iobuf, sizeof ( *mad ) ), mad, sizeof ( *mad ) );
235
236 /* Send I/O buffer */
237 if ( ( rc = ib_post_send ( ibdev, mi->qp, av, iobuf ) ) != 0 ) {
238 DBGC ( mi, "MI %p TX TID %08x%08x failed: %s\n",
239 mi, ntohl ( hdr->tid.high ), ntohl ( hdr->tid.low ),
240 strerror ( rc ) );
241 free_iob ( iobuf );
242 return rc;
243 }
244
245 return 0;
246}
struct golan_inbox_hdr hdr
Message header.
Definition CIB_PRM.h:0
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
union ib_mad mad
Definition arbel.h:1
#define assert(condition)
Assert a condition at run-time.
Definition assert.h:50
#define DBGC2_HDA(...)
Definition compiler.h:523
#define DBGC(...)
Definition compiler.h:505
#define EINVAL
Invalid argument.
Definition errno.h:429
#define ENOMEM
Not enough space.
Definition errno.h:535
struct ib_smp_class_specific smp
Definition ib_mad.h:1
uint8_t hop_count
Definition ib_mad.h:1
#define IB_MGMT_BASE_VERSION
Definition ib_mad.h:553
uint8_t hop_pointer
Definition ib_mad.h:0
#define IB_SMP_STATUS_D_INBOUND
Subnet management direction bit.
Definition ib_mad.h:41
#define IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE
Definition ib_mad.h:557
static unsigned int next_tid
TID to use for next MAD.
Definition ib_mi.c:66
#define IB_MI_TID_MAGIC
TID magic signature.
Definition ib_mi.c:63
#define ntohl(value)
Definition byteswap.h:135
#define htonl(value)
Definition byteswap.h:134
#define htons(value)
Definition byteswap.h:136
#define ntohs(value)
Definition byteswap.h:137
void * memcpy(void *dest, const void *src, size_t len) __nonnull
int ib_post_send(struct ib_device *ibdev, struct ib_queue_pair *qp, struct ib_address_vector *dest, struct io_buffer *iobuf)
Post send work queue entry.
Definition infiniband.c:416
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition iobuf.c:153
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition iobuf.c:131
#define iob_put(iobuf, len)
Definition iobuf.h:125
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
unsigned int port
Port number.
Definition infiniband.h:419
A management datagram common header.
Definition ib_mad.h:539
struct ib_queue_pair * qp
Queue pair.
Definition ib_mi.h:94
A subnet management MAD.
Definition ib_mad.h:588
A persistent I/O buffer.
Definition iobuf.h:38

References alloc_iob(), assert, DBGC, DBGC2_HDA, EINVAL, ENOMEM, free_iob(), hdr, hop_count, hop_pointer, htonl, htons, IB_MGMT_BASE_VERSION, IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE, IB_MI_TID_MAGIC, ib_post_send(), IB_SMP_STATUS_D_INBOUND, iob_put, mad, memcpy(), next_tid, ntohl, ntohs, ib_device::port, ib_mad_interface::qp, rc, smp, and strerror().

Referenced by ib_cm_send_drep(), ib_cm_send_rtu(), ib_mcast_leave(), ib_mi_timer_expired(), ib_sma_guid_info(), ib_sma_node_desc(), ib_sma_node_info(), ib_sma_pkey_table(), and ib_sma_port_info().

◆ ib_create_madx()

struct ib_mad_transaction * ib_create_madx ( struct ib_device * ibdev,
struct ib_mad_interface * mi,
union ib_mad * mad,
struct ib_address_vector * av,
struct ib_mad_transaction_operations * op )
extern

Create management transaction.

Parameters
ibdevInfiniband device
miManagement interface
madMAD to send
avDestination address, or NULL to use SM's GSI
opManagement transaction operations
Return values
madxManagement transaction, or NULL

Definition at line 287 of file ib_mi.c.

289 {
290 struct ib_mad_transaction *madx;
291
292 /* Allocate and initialise structure */
293 madx = zalloc ( sizeof ( *madx ) );
294 if ( ! madx )
295 return NULL;
296 timer_init ( &madx->timer, ib_mi_timer_expired, NULL );
297 madx->mi = mi;
298 madx->op = op;
299
300 /* Determine address vector */
301 if ( av ) {
302 memcpy ( &madx->av, av, sizeof ( madx->av ) );
303 } else {
304 madx->av.lid = ibdev->sm_lid;
305 madx->av.sl = ibdev->sm_sl;
306 madx->av.qpn = IB_QPN_GSI;
307 madx->av.qkey = IB_QKEY_GSI;
308 }
309
310 /* Copy MAD */
311 memcpy ( &madx->mad, mad, sizeof ( madx->mad ) );
312
313 /* Add to list and start timer to send initial MAD */
314 list_add ( &madx->list, &mi->madx );
315 start_timer_nodelay ( &madx->timer );
316
317 return madx;
318}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
static void ib_mi_timer_expired(struct retry_timer *timer, int expired)
Handle management transaction timer expiry.
Definition ib_mi.c:254
#define IB_QPN_GSI
General service interface QPN.
Definition infiniband.h:28
#define IB_QKEY_GSI
General service interface queue key.
Definition infiniband.h:31
#define list_add(new, head)
Add a new entry to the head of a list.
Definition list.h:70
void * zalloc(size_t size)
Allocate cleared memory.
Definition malloc.c:662
static uint16_t struct vmbus_xfer_pages_operations * op
Definition netvsc.h:327
static void start_timer_nodelay(struct retry_timer *timer)
Start timer with no delay.
Definition retry.h:100
unsigned int sl
Service level.
Definition infiniband.h:89
unsigned long qkey
Queue key.
Definition infiniband.h:80
unsigned int lid
Local ID.
Definition infiniband.h:82
unsigned long qpn
Queue Pair Number.
Definition infiniband.h:75
uint8_t sm_sl
Subnet manager SL.
Definition infiniband.h:448
uint16_t sm_lid
Subnet manager LID.
Definition infiniband.h:446
struct list_head madx
List of management transactions.
Definition ib_mi.h:96
An Infiniband management transaction.
Definition ib_mi.h:70
struct ib_mad_interface * mi
Associated management interface.
Definition ib_mi.h:72
struct ib_mad_transaction_operations * op
Transaction operations.
Definition ib_mi.h:82
union ib_mad mad
MAD being sent.
Definition ib_mi.h:80
struct list_head list
List of transactions.
Definition ib_mi.h:74
struct ib_address_vector av
Destination address vector.
Definition ib_mi.h:78
struct retry_timer timer
Retry timer.
Definition ib_mi.h:76

References ib_mad_transaction::av, ib_mi_timer_expired(), IB_QKEY_GSI, IB_QPN_GSI, ib_address_vector::lid, ib_mad_transaction::list, list_add, ib_mad_transaction::mad, mad, ib_mad_interface::madx, memcpy(), ib_mad_transaction::mi, NULL, ib_mad_transaction::op, op, ib_address_vector::qkey, ib_address_vector::qpn, ib_address_vector::sl, ib_device::sm_lid, ib_device::sm_sl, start_timer_nodelay(), ib_mad_transaction::timer, and zalloc().

Referenced by ib_cm_path_complete(), ib_create_path(), ib_create_service_madx(), ib_mcast_join(), and xsigo_xds_complete().

◆ ib_destroy_madx()

void ib_destroy_madx ( struct ib_device * ibdev,
struct ib_mad_interface * mi,
struct ib_mad_transaction * madx )
extern

References type.

◆ ib_create_mi()

int ib_create_mi ( struct ib_device * ibdev,
enum ib_queue_pair_type type,
struct ib_mad_interface ** new_mi )
extern

Create management interface.

Parameters
ibdevInfiniband device
typeQueue pair type
new_miNew management interface to fill in
Return values
rcReturn status code

Definition at line 347 of file ib_mi.c.

348 {
349 struct ib_mad_interface *mi;
350 const char *name;
351 int rc;
352
353 /* Allocate and initialise fields */
354 mi = zalloc ( sizeof ( *mi ) );
355 if ( ! mi ) {
356 rc = -ENOMEM;
357 goto err_alloc;
358 }
359 mi->ibdev = ibdev;
360 INIT_LIST_HEAD ( &mi->madx );
361
362 /* Create completion queue */
364 &mi->cq ) ) != 0 ) {
365 DBGC ( mi, "MI %p could not create completion queue: %s\n",
366 mi, strerror ( rc ) );
367 goto err_create_cq;
368 }
369
370 /* Create queue pair */
371 name = ( ( type == IB_QPT_SMI ) ? "SMI" : "GSI" );
374 &ib_mi_queue_pair_ops, name, &mi->qp ) )!=0){
375 DBGC ( mi, "MI %p could not create queue pair: %s\n",
376 mi, strerror ( rc ) );
377 goto err_create_qp;
378 }
379 ib_qp_set_ownerdata ( mi->qp, mi );
380 DBGC ( mi, "MI %p (%s) running on QPN %#lx\n",
381 mi, mi->qp->name, mi->qp->qpn );
382
383 /* Set queue key */
384 mi->qp->qkey = ( ( type == IB_QPT_SMI ) ? IB_QKEY_SMI : IB_QKEY_GSI );
385 if ( ( rc = ib_modify_qp ( ibdev, mi->qp ) ) != 0 ) {
386 DBGC ( mi, "MI %p could not set queue key: %s\n",
387 mi, strerror ( rc ) );
388 goto err_modify_qp;
389 }
390
391 /* Fill receive ring */
392 ib_refill_recv ( ibdev, mi->qp );
393 *new_mi = mi;
394 return 0;
395
396 err_modify_qp:
397 ib_destroy_qp ( ibdev, mi->qp );
398 err_create_qp:
399 ib_destroy_cq ( ibdev, mi->cq );
400 err_create_cq:
401 free ( mi );
402 err_alloc:
403 return rc;
404}
const char * name
Definition ath9k_hw.c:1986
uint32_t type
Operating system type.
Definition ena.h:1
#define IB_MI_NUM_SEND_WQES
Management interface number of send WQEs.
Definition ib_mi.c:48
static struct ib_completion_queue_operations ib_mi_completion_ops
Management interface completion operations.
Definition ib_mi.c:169
#define IB_MI_NUM_RECV_WQES
Management interface number of receive WQEs.
Definition ib_mi.c:54
#define IB_MI_NUM_CQES
Management interface number of completion queue entries.
Definition ib_mi.c:60
static struct ib_queue_pair_operations ib_mi_queue_pair_ops
Management interface queue pair operations.
Definition ib_mi.c:174
void ib_refill_recv(struct ib_device *ibdev, struct ib_queue_pair *qp)
Refill receive work queue.
Definition infiniband.c:556
void ib_destroy_cq(struct ib_device *ibdev, struct ib_completion_queue *cq)
Destroy completion queue.
Definition infiniband.c:145
int ib_create_cq(struct ib_device *ibdev, unsigned int num_cqes, struct ib_completion_queue_operations *op, struct ib_completion_queue **new_cq)
Create completion queue.
Definition infiniband.c:98
int ib_modify_qp(struct ib_device *ibdev, struct ib_queue_pair *qp)
Modify queue pair.
Definition infiniband.c:294
void ib_destroy_qp(struct ib_device *ibdev, struct ib_queue_pair *qp)
Destroy queue pair.
Definition infiniband.c:314
int ib_create_qp(struct ib_device *ibdev, enum ib_queue_pair_type type, unsigned int num_send_wqes, struct ib_completion_queue *send_cq, unsigned int num_recv_wqes, struct ib_completion_queue *recv_cq, struct ib_queue_pair_operations *op, const char *name, struct ib_queue_pair **new_qp)
Create queue pair.
Definition infiniband.c:199
static __always_inline void ib_qp_set_ownerdata(struct ib_queue_pair *qp, void *priv)
Set Infiniband queue pair owner-private data.
Definition infiniband.h:654
@ IB_QPT_SMI
Definition infiniband.h:140
#define IB_QKEY_SMI
Subnet management interface queue key.
Definition infiniband.h:25
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition list.h:46
static void(* free)(struct refcnt *refcnt))
Definition refcnt.h:55
An Infiniband management interface.
Definition ib_mi.h:88
struct ib_device * ibdev
Infiniband device.
Definition ib_mi.h:90
struct ib_completion_queue * cq
Completion queue.
Definition ib_mi.h:92
unsigned long qpn
Queue pair number.
Definition infiniband.h:166
const char * name
Queue pair name.
Definition infiniband.h:164
unsigned long qkey
Queue key.
Definition infiniband.h:177

References ib_mad_interface::cq, DBGC, ENOMEM, free, ib_create_cq(), ib_create_qp(), ib_destroy_cq(), ib_destroy_qp(), ib_mi_completion_ops, IB_MI_NUM_CQES, IB_MI_NUM_RECV_WQES, IB_MI_NUM_SEND_WQES, ib_mi_queue_pair_ops, ib_modify_qp(), IB_QKEY_GSI, IB_QKEY_SMI, ib_qp_set_ownerdata(), IB_QPT_SMI, ib_refill_recv(), ib_mad_interface::ibdev, INIT_LIST_HEAD, ib_mad_interface::madx, ib_queue_pair::name, name, ib_queue_pair::qkey, ib_mad_interface::qp, ib_queue_pair::qpn, rc, strerror(), type, and zalloc().

Referenced by ib_open().

◆ ib_destroy_mi()

void ib_destroy_mi ( struct ib_device * ibdev,
struct ib_mad_interface * mi )
extern

Destroy management interface.

Parameters
miManagement interface

Definition at line 411 of file ib_mi.c.

411 {
412 struct ib_mad_transaction *madx;
413 struct ib_mad_transaction *tmp;
414
415 /* Flush any outstanding requests */
416 list_for_each_entry_safe ( madx, tmp, &mi->madx, list ) {
417 DBGC ( mi, "MI %p destroyed while TID %08x%08x in progress\n",
418 mi, ntohl ( madx->mad.hdr.tid.high ),
419 ntohl ( madx->mad.hdr.tid.low ) );
420 madx->op->complete ( ibdev, mi, madx, -ECANCELED, NULL, NULL );
421 }
422
423 ib_destroy_qp ( ibdev, mi->qp );
424 ib_destroy_cq ( ibdev, mi->cq );
425 free ( mi );
426}
#define ECANCELED
Operation canceled.
Definition errno.h:344
unsigned long tmp
Definition linux_pci.h:65
#define list_for_each_entry_safe(pos, tmp, head, member)
Iterate over entries in a list, safe against deletion of the current entry.
Definition list.h:459
struct ib_mad_tid tid
Definition ib_mad.h:546
uint32_t high
Definition ib_mad.h:531
uint32_t low
Definition ib_mad.h:532
void(* complete)(struct ib_device *ibdev, struct ib_mad_interface *mi, struct ib_mad_transaction *madx, int rc, union ib_mad *mad, struct ib_address_vector *av)
Handle transaction completion.
Definition ib_mi.h:62
struct ib_mad_hdr hdr
Definition ib_mad.h:612

References ib_mad_transaction_operations::complete, ib_mad_interface::cq, DBGC, ECANCELED, free, ib_mad::hdr, ib_mad_tid::high, ib_destroy_cq(), ib_destroy_qp(), ib_mad_transaction::list, list_for_each_entry_safe, ib_mad_tid::low, ib_mad_transaction::mad, ib_mad_interface::madx, ib_mad_transaction::mi, ntohl, NULL, ib_mad_transaction::op, ib_mad_interface::qp, ib_mad_hdr::tid, and tmp.

Referenced by ib_close(), and ib_open().