[infiniband] Allow for sending MADs via GMA without retransmission
[people/sha0/gpxe.git] / src / include / gpxe / ib_gma.h
1 #ifndef _GPXE_IB_GMA_H
2 #define _GPXE_IB_GMA_H
3
4 /** @file
5  *
6  * Infiniband General Management Agent
7  *
8  */
9
10 FILE_LICENCE ( GPL2_OR_LATER );
11
12 #include <gpxe/list.h>
13 #include <gpxe/retry.h>
14 #include <gpxe/tables.h>
15
16 struct ib_device;
17 struct ib_completion_queue;
18 struct ib_queue_pair;
19 union ib_mad;
20
21 /** A MAD attribute handler */
22 struct ib_mad_handler {
23         /** Management class */
24         uint8_t mgmt_class;
25         /** Class version */
26         uint8_t class_version;
27         /** Method */
28         uint8_t method;
29         /** Response method, or zero */
30         uint8_t resp_method;
31         /** Attribute (in network byte order) */
32         uint16_t attr_id;
33         /** Handle attribute
34          *
35          * @v ibdev     Infiniband device
36          * @v mad       MAD
37          * @ret rc      Return status code
38          *
39          * The handler should modify the MAD as applicable.  If the
40          * handler returns with a non-zero value in the MAD's @c
41          * method field, it will be sent as a response.
42          */
43         int ( * handle ) ( struct ib_device *ibdev, union ib_mad *mad );
44 };
45
46 /** MAD attribute handlers */
47 #define IB_MAD_HANDLERS __table ( struct ib_mad_handler, "ib_mad_handlers" )
48
49 /** Declare a MAD attribute handler */
50 #define __ib_mad_handler __table_entry ( IB_MAD_HANDLERS, 01 )
51
52 /** An Infiniband General Management Agent */
53 struct ib_gma {
54         /** Infiniband device */
55         struct ib_device *ibdev;
56         /** Completion queue */
57         struct ib_completion_queue *cq;
58         /** Queue pair */
59         struct ib_queue_pair *qp;
60
61         /** List of outstanding MAD requests */
62         struct list_head requests;
63 };
64
65 extern int ib_gma_request ( struct ib_gma *gma, union ib_mad *mad,
66                             struct ib_address_vector *av, int retry );
67 extern int ib_create_gma ( struct ib_gma *gma, struct ib_device *ibdev,
68                            unsigned long qkey );
69 extern void ib_destroy_gma ( struct ib_gma *gma );
70
71 #endif /* _GPXE_IB_GMA_H */