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