| #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 */ |