[MLX4] added a possibility to register event handler with MLX4_BUS driver. [MLNX...
[mirror/winof/.git] / hw / mlx4 / kernel / bus / inc / bus_intf.h
1 #pragma once
2
3 #define MLX4_BUS_IB_INTERFACE_VERSION           2
4
5 #include <ib_verbs.h>
6 //
7 // Interface for work with MLX4 IB driver
8 //
9
10 struct mlx4_interface;
11 struct mlx4_dev;
12 struct mlx4_cq_context;
13 enum mlx4_qp_state;
14 struct mlx4_qp_context;
15 enum mlx4_qp_optpar;
16 struct mlx4_eq;
17
18
19 typedef int (*MLX4_REGISTER_INTERFACE)(struct mlx4_interface *intf);
20 typedef VOID (*MLX4_UNREGISTER_INTERFACE)(struct mlx4_interface *intf);
21
22
23 int mlx4_pd_alloc(struct mlx4_dev *dev, u32 *pdn);
24 void mlx4_pd_free(struct mlx4_dev *dev, u32 pdn);
25
26 typedef int  (*MLX4_PD_ALLOC) (struct mlx4_dev *dev, u32 *pdn);
27 typedef void (*MLX4_PD_FREE)(struct mlx4_dev *dev, u32 pdn);
28
29 typedef int  (*MLX4_UAR_ALLOC)(struct mlx4_dev *dev, struct mlx4_uar *uar);
30 typedef void (*MLX4_UAR_FREE)(struct mlx4_dev *dev, struct mlx4_uar *uar);
31
32 typedef int  (*MLX4_MR_ALLOC)(struct mlx4_dev *dev, u32 pd, u64 iova, u64 size, u32 access,
33                  int npages, int page_shift, struct mlx4_mr *mr);
34 typedef void (*MLX4_MR_FREE)(struct mlx4_dev *dev, struct mlx4_mr *mr);
35 typedef int  (*MLX4_MR_ENABLE)(struct mlx4_dev *dev, struct mlx4_mr *mr);
36
37 typedef int  (*MLX4_QP_GET_REGION) (struct mlx4_dev *dev, enum qp_region region, int *base_qpn, int *cnt);
38
39 typedef int  (*MLX4_ALLOC_HWQ_RES)(struct mlx4_dev *dev, struct mlx4_hwq_resources *wqres,
40               int size, int max_direct);
41
42 typedef void (*MLX4_FREE_HWQ_RES)(struct mlx4_dev *dev, struct mlx4_hwq_resources *wqres,
43               int size);
44
45 typedef int (*MLX4_CQ_ALLOC) (struct mlx4_dev *dev, int nent, struct mlx4_mtt *mtt,
46               struct mlx4_uar *uar, u64 db_rec, struct mlx4_cq *cq, unsigned vector, int collapsed);
47
48 typedef void (*MLX4_CQ_FREE) (struct mlx4_dev *dev, struct mlx4_cq *cq);
49
50 typedef int (*MLX4_CQ_MODIFY) (struct mlx4_dev *dev, struct mlx4_cq *cq,
51               struct mlx4_cq_context *context, int modify);
52
53 typedef void (*MLX4_CQ_ARM)(struct mlx4_cq *cq, u32 cmd,
54                                void __iomem *uar_page,
55                                spinlock_t *doorbell_lock);
56
57 typedef int (*MLX4_REGISTER_MAC)(struct mlx4_dev *dev, u8 port, u64 mac, int *index);
58
59 typedef void (*MLX4_UNREGISTER_MAC) (struct mlx4_dev *dev, u8 port, int index);
60
61 typedef int (*MLX4_SRQ_ALLOC) (struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcd, 
62            struct mlx4_mtt *mtt, u64 db_rec, struct mlx4_srq *srq);
63
64 typedef void (*MLX4_SRQ_FREE)(struct mlx4_dev *dev, struct mlx4_srq *srq);
65
66 typedef void (*MLX4_SRQ_INVALIDATE)(struct mlx4_dev *dev, struct mlx4_srq *srq);
67
68 typedef void (*MLX4_SRQ_REMOVE)(struct mlx4_dev *dev, struct mlx4_srq *srq);
69
70 typedef int (*MLX4_QP_ALLOC)(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp);
71
72 typedef void (*MLX4_QP_FREE)(struct mlx4_dev *dev, struct mlx4_qp *qp);
73
74
75 typedef int (*MLX4_QP_RESERVE_RANGE)(struct mlx4_dev *dev, int cnt, int align, u32 *base);
76
77 typedef void (*MLX4_QP_RELEASE_RANGE)(struct mlx4_dev *dev, int base_qpn, int cnt);
78
79
80 typedef void (*MLX4_QP_REMOVE)(struct mlx4_dev *dev, struct mlx4_qp *qp);
81
82 typedef int (*MLX4_QP_MODIFY)(struct mlx4_dev *dev, struct mlx4_mtt *mtt,
83            enum mlx4_qp_state cur_state, enum mlx4_qp_state new_state,
84            struct mlx4_qp_context *context, enum mlx4_qp_optpar optpar,
85            int sqd_event, struct mlx4_qp *qp);
86
87 typedef int (*MLX4_QP_TO_READY)(struct mlx4_dev *dev, struct mlx4_mtt *mtt,
88              struct mlx4_qp_context *context,
89              struct mlx4_qp *qp, enum mlx4_qp_state *qp_state);
90
91 typedef struct mlx4_cmd_mailbox *(*MLX4_ALLOC_CMD_MAILBOX)(struct mlx4_dev *dev);
92
93 typedef void (*MLX4_FREE_CMD_MAILBOX)(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox);
94
95 typedef int (*MLX4_CMD)(struct mlx4_dev *dev, u64 in_param, u64 *out_param, int out_is_imm,
96             u32 in_modifier, u8 op_modifier, u16 op, unsigned long timeout);
97
98 typedef int (*MLX4_INIT_PORT)(struct mlx4_dev *dev, int port);
99 typedef int (*MLX4_CLOSE_PORT)(struct mlx4_dev *dev, int port);
100
101
102 typedef
103 BOOLEAN
104 (*PISR_FUNC)(   
105         IN PVOID  IsrContext
106         );
107
108
109 typedef int (*MLX4_ADD_EQ) (struct mlx4_dev *dev, int nent,
110                           u8 intr, PISR_FUNC func, PVOID func_context ,
111                           u8* p_eq_num, struct mlx4_eq ** p_eq);
112
113 typedef void (*MLX4_REMOVE_EQ) (struct mlx4_dev *dev, u8 eq_num);
114
115 typedef int (*MLX4_REGISTER_EVENT_HANDLER) (struct ib_event_handler *event_handler);
116 typedef int (*MLX4_UNREGISTER_EVENT_HANDLER)(struct ib_event_handler *event_handler);
117
118
119 struct mlx4_interface_ex {
120         MLX4_PD_ALLOC       mlx4_pd_alloc;
121         MLX4_PD_FREE        mlx4_pd_free;
122
123         MLX4_UAR_ALLOC      mlx4_uar_alloc;
124         MLX4_UAR_FREE       mlx4_uar_free;
125
126         MLX4_MR_ALLOC       mlx4_mr_alloc;
127         MLX4_MR_FREE        mlx4_mr_free;
128         MLX4_MR_ENABLE      mlx4_mr_enable;
129         MLX4_QP_GET_REGION  mlx4_qp_get_region;
130         MLX4_ALLOC_HWQ_RES  mlx4_alloc_hwq_res;
131         MLX4_FREE_HWQ_RES   mlx4_free_hwq_res;
132
133         MLX4_CQ_ALLOC       mlx4_cq_alloc;
134         MLX4_CQ_FREE        mlx4_cq_free;
135         MLX4_CQ_MODIFY      mlx4_cq_modify;
136
137 //  Not part of the interface since it is an inlie function
138 //      MLX4_CQ_ARM         mlx4_cq_arm;
139
140         MLX4_REGISTER_MAC   mlx4_register_mac;
141         MLX4_UNREGISTER_MAC mlx4_unregister_mac;
142
143         MLX4_SRQ_ALLOC      mlx4_srq_alloc;
144         MLX4_SRQ_FREE       mlx4_srq_free;
145         MLX4_SRQ_INVALIDATE mlx4_srq_invalidate;
146         MLX4_SRQ_REMOVE     mlx4_srq_remove;
147
148         MLX4_QP_ALLOC       mlx4_qp_alloc;
149         MLX4_QP_FREE        mlx4_qp_free;
150         MLX4_QP_REMOVE      mlx4_qp_remove;
151         MLX4_QP_MODIFY      mlx4_qp_modify;
152         MLX4_QP_TO_READY    mlx4_qp_to_ready;
153         MLX4_QP_RESERVE_RANGE mlx4_qp_reserve_range;
154         MLX4_QP_RELEASE_RANGE mlx4_qp_release_range;
155
156         MLX4_ALLOC_CMD_MAILBOX mlx4_alloc_cmd_mailbox;
157         MLX4_FREE_CMD_MAILBOX  mlx4_free_cmd_mailbox;
158         MLX4_CMD               mlx4_cmd;
159
160         MLX4_INIT_PORT         mlx4_INIT_PORT;
161         MLX4_CLOSE_PORT        mlx4_CLOSE_PORT;
162
163         MLX4_ADD_EQ            mlx4_add_eq;
164         MLX4_REMOVE_EQ         mlx4_remove_eq;
165
166         MLX4_REGISTER_EVENT_HANDLER mlx4_register_ev_cb;
167         MLX4_UNREGISTER_EVENT_HANDLER mlx4_unregister_ev_cb;
168         
169 };
170
171
172 typedef struct _MLX4_BUS_IB_INTERFACE{
173         INTERFACE i;
174         struct ib_device                *       p_ibdev;
175         struct pci_dev                  *       pdev;
176         struct mlx4_dev                 *       pmlx4_dev;
177         struct mlx4_interface_ex        mlx4_interface;
178         int                                                     is_livefish;
179         MLX4_REGISTER_INTERFACE     register_interface;
180         MLX4_UNREGISTER_INTERFACE   unregister_interface;
181         u8                                                      port_id;
182         struct VipBusIfc                        *pVipBusIfc;
183         
184 } MLX4_BUS_IB_INTERFACE, *PMLX4_BUS_IB_INTERFACE;
185
186
187