[infiniband] Pass GMA as a parameter to GMA MAD handlers
[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 struct ib_gma;
21
22 /** A GMA attribute handler */
23 struct ib_gma_handler {
24         /** Management class */
25         uint8_t mgmt_class;
26         /** Class version */
27         uint8_t class_version;
28         /** Method */
29         uint8_t method;
30         /** Response method, or zero */
31         uint8_t resp_method;
32         /** Attribute (in network byte order) */
33         uint16_t attr_id;
34         /** Handle attribute
35          *
36          * @v gma       General management agent
37          * @v mad       MAD
38          * @ret rc      Return status code
39          *
40          * The handler should modify the MAD as applicable.  If the
41          * handler returns with a non-zero value in the MAD's @c
42          * method field, it will be sent as a response.
43          */
44         int ( * handle ) ( struct ib_gma *gma, union ib_mad *mad );
45 };
46
47 /** GMA attribute handlers */
48 #define IB_GMA_HANDLERS __table ( struct ib_gma_handler, "ib_gma_handlers" )
49
50 /** Declare a GMA attribute handler */
51 #define __ib_gma_handler __table_entry ( IB_GMA_HANDLERS, 01 )
52
53 /** An Infiniband General Management Agent */
54 struct ib_gma {
55         /** Infiniband device */
56         struct ib_device *ibdev;
57         /** Completion queue */
58         struct ib_completion_queue *cq;
59         /** Queue pair */
60         struct ib_queue_pair *qp;
61
62         /** List of outstanding MAD requests */
63         struct list_head requests;
64 };
65
66 extern int ib_gma_request ( struct ib_gma *gma, union ib_mad *mad,
67                             struct ib_address_vector *av, int retry );
68 extern int ib_create_gma ( struct ib_gma *gma, struct ib_device *ibdev,
69                            unsigned long qkey );
70 extern void ib_destroy_gma ( struct ib_gma *gma );
71
72 #endif /* _GPXE_IB_GMA_H */