4764a6cce7ba5a1206555c34999070b8bcd24235
[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 #include <gpxe/infiniband.h>
16
17 struct ib_gma;
18
19 /** A GMA attribute handler */
20 struct ib_gma_handler {
21         /** Management class */
22         uint8_t mgmt_class;
23         /** Management class don't-care bits */
24         uint8_t mgmt_class_ignore;
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 gma       General management agent
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_gma *gma, union ib_mad *mad );
44 };
45
46 /** GMA attribute handlers */
47 #define IB_GMA_HANDLERS __table ( struct ib_gma_handler, "ib_gma_handlers" )
48
49 /** Declare a GMA attribute handler */
50 #define __ib_gma_handler __table_entry ( IB_GMA_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 struct ib_gma * ib_create_gma ( struct ib_device *ibdev,
68                                        enum ib_queue_pair_type type );
69 extern void ib_destroy_gma ( struct ib_gma *gma );
70
71 #endif /* _GPXE_IB_GMA_H */