blob: b1cf686da062dd720d2f37c9a9a72ee74de1b290 [file] [log] [blame]
Greg Hartman76d05dc2016-11-23 15:51:27 -08001#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 */