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