1#ifndef _GPXE_IB_MI_H 2#define _GPXE_IB_MI_H 3 4/** @file 5 * 6 * Infiniband management interfaces 7 * 8 */ 9 10FILE_LICENCE ( GPL2_OR_LATER ); 11 12#include <gpxe/list.h> 13#include <gpxe/retry.h> 14#include <gpxe/tables.h> 15#include <gpxe/infiniband.h> 16 17struct ib_mad_interface; 18struct ib_mad_transaction; 19 20/** An Infiniband management agent */ 21struct ib_mad_agent { 22 /** Management class */ 23 uint8_t mgmt_class; 24 /** Class version */ 25 uint8_t class_version; 26 /** Attribute (in network byte order) */ 27 uint16_t attr_id; 28 /** Handle MAD 29 * 30 * @v ibdev Infiniband device 31 * @v mi Management interface 32 * @v mad Received MAD 33 * @v av Source address vector 34 * @ret rc Return status code 35 */ 36 void ( * handle ) ( struct ib_device *ibdev, 37 struct ib_mad_interface *mi, 38 union ib_mad *mad, 39 struct ib_address_vector *av ); 40}; 41 42/** Infiniband management agents */ 43#define IB_MAD_AGENTS __table ( struct ib_mad_agent, "ib_mad_agents" ) 44 45/** Declare an Infiniband management agent */ 46#define __ib_mad_agent __table_entry ( IB_MAD_AGENTS, 01 ) 47 48/** Infiniband management transaction operations */ 49struct ib_mad_transaction_operations { 50 /** Handle transaction completion 51 * 52 * @v ibdev Infiniband device 53 * @v mi Management interface 54 * @v madx Management transaction 55 * @v rc Status code 56 * @v mad Received MAD (or NULL on error) 57 * @v av Source address vector (or NULL on error) 58 * 59 * The completion handler should in most cases call 60 * ib_destroy_madx() to free up the completed transaction. 61 */ 62 void ( * complete ) ( struct ib_device *ibdev, 63 struct ib_mad_interface *mi, 64 struct ib_mad_transaction *madx, 65 int rc, union ib_mad *mad, 66 struct ib_address_vector *av ); 67}; 68 69/** An Infiniband management transaction */ 70struct ib_mad_transaction { 71 /** Associated management interface */ 72 struct ib_mad_interface *mi; 73 /** List of transactions */ 74 struct list_head list; 75 /** Retry timer */ 76 struct retry_timer timer; 77 /** Destination address vector */ 78 struct ib_address_vector av; 79 /** MAD being sent */ 80 union ib_mad mad; 81 /** Transaction operations */ 82 struct ib_mad_transaction_operations *op; 83 /** Owner private data */ 84 void *owner_priv; 85}; 86 87/** An Infiniband management interface */ 88struct ib_mad_interface { 89 /** Infiniband device */ 90 struct ib_device *ibdev; 91 /** Completion queue */ 92 struct ib_completion_queue *cq; 93 /** Queue pair */ 94 struct ib_queue_pair *qp; 95 /** List of management transactions */ 96 struct list_head madx; 97}; 98 99/** 100 * Set Infiniband management transaction owner-private data 101 * 102 * @v madx Management transaction 103 * @v priv Private data 104 */ 105static inline __always_inline void 106ib_madx_set_ownerdata ( struct ib_mad_transaction *madx, void *priv ) { 107 madx->owner_priv = priv; 108} 109 110/** 111 * Get Infiniband management transaction owner-private data 112 * 113 * @v madx Management transaction 114 * @ret priv Private data 115 */ 116static inline __always_inline void * 117ib_madx_get_ownerdata ( struct ib_mad_transaction *madx ) { 118 return madx->owner_priv; 119} 120 121extern int ib_mi_send ( struct ib_device *ibdev, struct ib_mad_interface *mi, 122 union ib_mad *mad, struct ib_address_vector *av ); 123extern struct ib_mad_transaction * 124ib_create_madx ( struct ib_device *ibdev, struct ib_mad_interface *mi, 125 union ib_mad *mad, struct ib_address_vector *av, 126 struct ib_mad_transaction_operations *op ); 127extern void ib_destroy_madx ( struct ib_device *ibdev, 128 struct ib_mad_interface *mi, 129 struct ib_mad_transaction *madx ); 130extern struct ib_mad_interface * ib_create_mi ( struct ib_device *ibdev, 131 enum ib_queue_pair_type type ); 132extern void ib_destroy_mi ( struct ib_device *ibdev, 133 struct ib_mad_interface *mi ); 134 135#endif /* _GPXE_IB_MI_H */ 136