blob: b1cf686da062dd720d2f37c9a9a72ee74de1b290 [file] [log] [blame]
#ifndef _GPXE_IB_MI_H
#define _GPXE_IB_MI_H
/** @file
*
* Infiniband management interfaces
*
*/
FILE_LICENCE ( GPL2_OR_LATER );
#include <gpxe/list.h>
#include <gpxe/retry.h>
#include <gpxe/tables.h>
#include <gpxe/infiniband.h>
struct ib_mad_interface;
struct ib_mad_transaction;
/** An Infiniband management agent */
struct ib_mad_agent {
/** Management class */
uint8_t mgmt_class;
/** Class version */
uint8_t class_version;
/** Attribute (in network byte order) */
uint16_t attr_id;
/** Handle MAD
*
* @v ibdev Infiniband device
* @v mi Management interface
* @v mad Received MAD
* @v av Source address vector
* @ret rc Return status code
*/
void ( * handle ) ( struct ib_device *ibdev,
struct ib_mad_interface *mi,
union ib_mad *mad,
struct ib_address_vector *av );
};
/** Infiniband management agents */
#define IB_MAD_AGENTS __table ( struct ib_mad_agent, "ib_mad_agents" )
/** Declare an Infiniband management agent */
#define __ib_mad_agent __table_entry ( IB_MAD_AGENTS, 01 )
/** Infiniband management transaction operations */
struct ib_mad_transaction_operations {
/** Handle transaction completion
*
* @v ibdev Infiniband device
* @v mi Management interface
* @v madx Management transaction
* @v rc Status code
* @v mad Received MAD (or NULL on error)
* @v av Source address vector (or NULL on error)
*
* The completion handler should in most cases call
* ib_destroy_madx() to free up the completed transaction.
*/
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 );
};
/** An Infiniband management transaction */
struct ib_mad_transaction {
/** Associated management interface */
struct ib_mad_interface *mi;
/** List of transactions */
struct list_head list;
/** Retry timer */
struct retry_timer timer;
/** Destination address vector */
struct ib_address_vector av;
/** MAD being sent */
union ib_mad mad;
/** Transaction operations */
struct ib_mad_transaction_operations *op;
/** Owner private data */
void *owner_priv;
};
/** An Infiniband management interface */
struct ib_mad_interface {
/** Infiniband device */
struct ib_device *ibdev;
/** Completion queue */
struct ib_completion_queue *cq;
/** Queue pair */
struct ib_queue_pair *qp;
/** List of management transactions */
struct list_head madx;
};
/**
* Set Infiniband management transaction owner-private data
*
* @v madx Management transaction
* @v priv Private data
*/
static inline __always_inline void
ib_madx_set_ownerdata ( struct ib_mad_transaction *madx, void *priv ) {
madx->owner_priv = priv;
}
/**
* Get Infiniband management transaction owner-private data
*
* @v madx Management transaction
* @ret priv Private data
*/
static inline __always_inline void *
ib_madx_get_ownerdata ( struct ib_mad_transaction *madx ) {
return madx->owner_priv;
}
extern int ib_mi_send ( struct ib_device *ibdev, struct ib_mad_interface *mi,
union ib_mad *mad, struct ib_address_vector *av );
extern 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 void ib_destroy_madx ( struct ib_device *ibdev,
struct ib_mad_interface *mi,
struct ib_mad_transaction *madx );
extern struct ib_mad_interface * ib_create_mi ( struct ib_device *ibdev,
enum ib_queue_pair_type type );
extern void ib_destroy_mi ( struct ib_device *ibdev,
struct ib_mad_interface *mi );
#endif /* _GPXE_IB_MI_H */