fix cleanup flow for memfree devices
[etherboot.git] / src / drivers / net / mlx_ipoib / mt25218.h
1 #ifndef __mt25218_h__
2 #define __mt25218_h__
3
4 #include "MT25218_PRM.h"
5 #include "ib_mad.h"
6
7 #define TAVOR_DEVICE_ID         0x5a44
8 #define TAVOR_BRIDGE_DEVICE_ID 0x5a46
9 #define ARTAVOR_DEVICE_ID       0x6278
10
11 #define MEMFREE_RESET_OFFSET 0xF0010
12
13 #define INVALID_WQE_LKEY 0x00000100
14
15 /*
16  * memfree specific command
17  *      
18  */
19 #define MEMFREE_CMD_QUERY_ADAPTER       0x006
20 #define MEMFREE_CMD_WRITE_MGM           0x026
21 #define MEMFREE_CMD_MOD_STAT_CFG        0x034
22 #define MEMFREE_CMD_QUERY_FW            0x004
23 #define MEMFREE_CMD_ENABLE_LAM          0xff8
24 #define MEMFREE_CMD_MAP_FA                      0xfff
25 #define MEMFREE_CMD_UNMAP_FA            0xffe
26 #define MEMFREE_CMD_RUN_FW                      0xff6
27 #define MEMFREE_CMD_SET_ICM_SIZE        0xffd
28 #define MEMFREE_CMD_MAP_ICM_AUX         0xffc
29 #define MEMFREE_CMD_UNMAP_ICM_AUX               0xffb
30 #define MEMFREE_CMD_MAP_ICM                     0xffa
31 #define MEMFREE_CMD_UNMAP_ICM                   0xff9
32 #define MEMFREE_CMD_QUERY_DEV_LIM   0x003
33
34 /*
35  * Tavor specific event types
36  *      Only event types that are specific to Tavor
37  *  and are used by the driver are listed here
38  */
39 #define TAVOR_IF_EV_TYPE_OVERRUN        0x0F
40
41 /*
42  * EQ doorbel commands
43  */
44 #define EQ_DBELL_CMD_INC_CONS_IDX 1     /* increment Consumer_indx by one */
45 #define EQ_DBELL_CMD_ARM_EQ       2     /* Request notifcation for next event (Arm EQ) */
46 #define EQ_DBELL_CMD_DISARM_CQ    3     /* Disarm CQ (CQ number is specified in EQ_param) */
47 #define EQ_DBELL_CMD_SET_CONS_IDX 4     /* set Consumer_indx to value of EQ_param */
48 #define EQ_DBELL_CMD_ALWAYS_ARM   5     /* move EQ to Always Armed state */
49
50 /*
51  * CQ doorbel commands
52  */
53 #define CQ_DBELL_CMD_INC_CONS_IDX 1
54 #define CQ_DBELL_CMD_REQ_NOTIF_SOL_UNSOL 2
55 #define CQ_DBELL_CMD_REQ_NOTIF_SOL 3
56 #define CQ_DBELL_CMD_SET_CONS_IDX 4
57 #define CQ_DBELL_CMD_REQ_NOTIF_MULT 5
58
59 #define INPRM_BUF_SZ 4096
60 #define INPRM_BUF_ALIGN 4096
61 #define OUTPRM_BUF_SZ 4096
62 #define OUTPRM_BUF_ALIGN 4096
63
64 /*
65  *  sizes of parameter blocks used in certain
66  *      commands.
67  *  TODO: replace them with sizeof
68  *  operators of the appropriate structs
69  */
70 #define SW2HW_MPT_IBUF_SZ        MT_STRUCT_SIZE(arbelprm_mpt_st)
71 #define SW2HW_EQ_IBUF_SZ         MT_STRUCT_SIZE(arbelprm_eqc_st)
72 #define INIT_IB_IBUF_SZ          MT_STRUCT_SIZE(arbelprm_init_ib_st)
73 #define SW2HW_CQ_IBUF_SZ         MT_STRUCT_SIZE(arbelprm_completion_queue_context_st)
74 #define QPCTX_IBUF_SZ            MT_STRUCT_SIZE(arbelprm_queue_pair_ee_context_entry_st)
75
76 #define EQN 0
77 #define UAR_IDX 1
78
79 #define QPC_OFFSET 0
80 #define CQC_OFFSET (QPC_OFFSET + 0x100000)
81 #define EQPC_OFFSET (CQC_OFFSET + 0x100000)
82 #define EQC_OFFSET (EQPC_OFFSET + 0x100000)
83 #define MC_BASE_OFFSET (EQC_OFFSET + 0x100000)
84 #define MPT_BASE_OFFSET (MC_BASE_OFFSET + 0x100000)
85 #define MTT_BASE_OFFSET (MPT_BASE_OFFSET + 0x100000)
86
87 #define LOG2_QPS 7
88 #define LOG2_CQS 8
89 #define LOG2_EQS 6
90 #define LOG2_MC_ENTRY 6         /* 8 QPs per group */
91 #define LOG2_MC_GROUPS 3        /* 8 groups */
92 #define LOG2_MPT_ENTRIES 5
93
94 #define LOG2_EQ_SZ 5
95 #define LOG2_CQ_SZ 5
96
97 #define NUM_PORTS 2
98
99 #define EQE_OWNER_OFFSET 31
100 #define EQE_OWNER_VAL_HW 0x80
101
102 #define CQE_OWNER_OFFSET 31
103 #define CQE_OWNER_VAL_HW 0x80
104
105 #define POST_RCV_OFFSET 0x18
106 #define POST_SND_OFFSET 0x10
107 #define CQ_DBELL_OFFSET 0x20
108 #define EQ_DBELL_OFFSET 0x28
109
110 #define CQE_ERROR_OPCODE 0xfe
111
112 #define OWNER_HW 1
113 #define OWNER_SW 0
114
115 #define MAX_GATHER 1            /* max gather entries used in send */
116 #define MAX_SCATTER 2
117
118 #define LOG2_MADS_SND_CQ_SZ LOG2_CQ_SZ
119 #define LOG2_MADS_RCV_CQ_SZ LOG2_CQ_SZ
120 #define LOG2_IPOIB_SND_CQ_SZ LOG2_CQ_SZ
121 #define LOG2_IPOIB_RCV_CQ_SZ LOG2_CQ_SZ
122
123 #define NUM_MADS_SND_CQES (1<<LOG2_MADS_SND_CQ_SZ)
124 #define NUM_MADS_RCV_CQES (1<<LOG2_MADS_RCV_CQ_SZ)
125 #define NUM_IPOIB_SND_CQES (1<<LOG2_IPOIB_SND_CQ_SZ)
126 #define NUM_IPOIB_RCV_CQES (1<<LOG2_IPOIB_RCV_CQ_SZ)
127
128 /* work queues must be 2^n size with n=0.. */
129 #define NUM_MADS_RCV_WQES (1<<1)
130 #define NUM_IPOIB_RCV_WQES (1<<1)
131
132 #if NUM_MADS_RCV_WQES > NUM_IPOIB_RCV_WQES
133 #define MAX_RCV_WQES NUM_MADS_RCV_WQES
134 #else
135 #define MAX_RCV_WQES NUM_IPOIB_RCV_WQES
136 #endif
137
138 #define NUM_MADS_SND_WQES (1<<1)
139 #define NUM_IPOIB_SND_WQES (1<<1)
140
141 #if NUM_MADS_SND_WQES > NUM_IPOIB_SND_WQES
142 #define MAX_SND_WQES NUM_MADS_SND_WQES
143 #else
144 #define MAX_SND_WQES NUM_IPOIB_SND_WQES
145 #endif
146
147 /* uar context indexes */
148 enum {
149         MADS_RCV_CQ_ARM_DB_IDX,
150         MADS_SND_CQ_ARM_DB_IDX,
151         IPOIB_RCV_CQ_ARM_DB_IDX,
152         IPOIB_SND_CQ_ARM_DB_IDX,
153         MADS_SND_QP_DB_IDX,
154         IPOIB_SND_QP_DB_IDX,
155         GROUP_SEP_IDX,
156         START_UNMAPPED_DB_IDX,
157         /* --------------------------
158            unmapped doorbell records
159            -------------------------- */
160         END_UNMAPPED_DB_IDX = 505,
161         MADS_RCV_QP_DB_IDX = 506,
162         IPOIB_RCV_QP_DB_IDX = 507,
163         MADS_RCV_CQ_CI_DB_IDX = 508,
164         MADS_SND_CQ_CI_DB_IDX = 509,
165         IPOIB_RCV_CQ_CI_DB_IDX = 510,
166         IPOIB_SND_CQ_CI_DB_IDX = 511
167 };
168
169 /* uar resources types */
170 enum {
171         UAR_RES_INVALID = 0x0,  /* Invalid (not allocated) DoorBell record */
172         UAR_RES_CQ_SET_CI = 0x1,        /* CQ SET_CI DoorBell record */
173         UAR_RES_CQ_ARM = 0x2,   /* CQ ARM DoorBell record */
174         UAR_RES_SQ_DBELL = 0x3, /* Send Queue DoorBell record */
175         UAR_RES_RQ_DBELL = 0x4, /* Receive Queue DoorBell record */
176         UAR_RES_SRQ_DBELL = 0x5,        /* Shared Receive Queue DoorBell record */
177         UAR_RES_GROUP_SEP = 0x7 /* Group Separator record */
178 };
179
180 enum {
181         TS_RC,
182         TS_UC,
183         TS_RD,
184         TS_UD,
185         TS_MLX
186 };
187
188 enum {
189         PM_STATE_ARMED = 0,
190         PM_STATE_REARM = 1,
191         PM_STATE_MIGRATED = 3
192 };
193
194 enum {
195         DOORBEL_RES_SQ = 3,
196         DOORBEL_RES_RQ = 4,
197         DOORBEL_RES_SRQ = 5
198 };
199
200 struct ib_buffers_st {
201         __u8 send_mad_buf[NUM_MADS_SND_WQES][MAD_BUF_SZ];
202         __u8 rcv_mad_buf[NUM_MADS_RCV_WQES][MAD_BUF_SZ + GRH_SIZE];
203         __u8 ipoib_rcv_buf[NUM_IPOIB_RCV_WQES][IPOIB_RCV_BUF_SZ + GRH_SIZE];
204         __u8 ipoib_rcv_grh_buf[NUM_IPOIB_RCV_WQES][IPOIB_RCV_BUF_SZ];
205         __u8 send_ipoib_buf[NUM_IPOIB_SND_WQES][IPOIB_SND_BUF_SZ];
206 };
207
208 struct pcidev {
209         unsigned long bar[6];
210         __u32 dev_config_space[64];
211         struct pci_device *dev;
212         __u8 bus;
213         __u8 devfn;
214 };
215
216 struct dev_pci_struct {
217         struct pcidev dev;
218         struct pcidev br;
219         void *cr_space;
220         void *uar;
221 };
222
223 struct eq_st {
224         __u8 eqn;
225         __u32 cons_counter;
226         __u32 eq_size;
227         void *ci_base_base_addr;
228         struct eqe_t *eq_buf;
229 };
230
231 struct eqe_t {
232         __u8 raw[MT_STRUCT_SIZE(arbelprm_event_queue_entry_st)];
233 } __attribute__ ((packed));
234
235 enum qp_state_e {
236         QP_STATE_RST = 0,
237         QP_STATE_INIT = 1,
238         QP_STATE_RTR = 2,
239         QP_STATE_RTS = 3,
240         QP_STATE_SQEr = 4,
241         QP_STATE_SQD = 5,
242         QP_STATE_ERR = 6,
243         QP_STATE_SQDING = 7,
244         QP_STATE_SUSPEND = 9
245 };
246
247 struct memory_pointer_st {
248         __u32 byte_count;
249         __u32 lkey;
250         __u32 local_addr_h;
251         __u32 local_addr_l;
252 } __attribute__ ((packed));
253
254 /* receive wqe descriptor */
255 struct recv_wqe_st {
256         /* part referenced by hardware */
257         __u8 control[MT_STRUCT_SIZE(arbelprm_wqe_segment_ctrl_recv_st)];
258         struct memory_pointer_st mpointer[MAX_SCATTER];
259 } __attribute__ ((packed));
260
261 struct recv_wqe_cont_st {
262         struct recv_wqe_st wqe;
263
264         struct udqp_st *qp;     /* qp this wqe is used with */
265 } __attribute__ ((packed));
266
267 #define RECV_WQE_U_ALIGN 64
268 union recv_wqe_u {
269         __u8 align[RECV_WQE_U_ALIGN];   /* this ensures proper alignment */
270         struct recv_wqe_st wqe;
271         struct recv_wqe_cont_st wqe_cont;
272 } __attribute__ ((packed));
273
274 struct send_doorbell_st {
275         __u8 raw[MT_STRUCT_SIZE(arbelprm_send_doorbell_st)];
276 } __attribute__ ((packed));
277
278 struct next_control_seg_st {
279         __u8 next[MT_STRUCT_SIZE(arbelprm_wqe_segment_next_st)];
280         __u8 control[MT_STRUCT_SIZE(arbelprm_wqe_segment_ctrl_send_st)];
281 } __attribute__ ((packed));
282
283 struct ud_seg_st {
284         __u8 av[MT_STRUCT_SIZE(arbelprm_wqe_segment_ud_st)];
285 } __attribute__ ((packed));
286
287 struct ud_send_wqe_st {
288         struct next_control_seg_st next;        /* 16 bytes */
289         struct ud_seg_st udseg; /* 48 bytes */
290         struct memory_pointer_st mpointer[MAX_GATHER];  /* 16 * MAX_GATHER bytes */
291 } __attribute__ ((packed));
292
293 struct ude_send_wqe_cont_st {
294         struct ud_send_wqe_st wqe;
295
296         struct udqp_st *qp;     /* qp this wqe is used with */
297 } __attribute__ ((packed));
298
299 #define UD_SEND_WQE_U_ALIGN 128
300 union ud_send_wqe_u {
301         __u8 align[UD_SEND_WQE_U_ALIGN];
302         struct ude_send_wqe_cont_st wqe_cont;
303 } __attribute__ ((packed));
304
305 struct address_vector_st {
306         __u8 raw[MT_STRUCT_SIZE(arbelprm_ud_address_vector_st)];
307 } __attribute__ ((packed));
308
309 struct ud_av_st {
310         struct address_vector_st av;
311         __u32 dest_qp;          /* destination qpn */
312         __u32 qkey;
313         __u8 next_free;
314 } __attribute__ ((packed));
315
316 union ud_av_u {
317         struct ud_av_st ud_av;
318 } __attribute__ ((packed));
319
320 struct udav_st {
321         union ud_av_u av_array[NUM_AVS];
322         __u8 udav_next_free;
323 };
324
325 union cqe_st {
326         __u8 good_cqe[MT_STRUCT_SIZE(arbelprm_completion_queue_entry_st)];
327         __u8 error_cqe[MT_STRUCT_SIZE(arbelprm_completion_with_error_st)];
328 } __attribute__ ((packed));
329
330 struct qp_ee_ctx_t {
331         __u8 raw[MT_STRUCT_SIZE(arbelprm_queue_pair_ee_context_entry_st)];
332 } __attribute__ ((packed));
333
334 struct qp_ee_state_tarnisition_st {
335         __u32 opt_param_mask;
336         __u32 r1;
337         struct qp_ee_ctx_t ctx;
338         __u32 r2[62];
339 } __attribute__ ((packed));
340
341 struct cq_dbell_st {
342         __u8 raw[MT_STRUCT_SIZE(arbelprm_cq_cmd_doorbell_st)];
343 } __attribute__ ((packed));
344
345 struct mad_ifc_inprm_st {
346         union mad_u mad;
347 } __attribute__ ((packed));
348
349 struct wqe_buf_st {
350         struct ud_send_wqe_st *sndq;
351         struct recv_wqe_st *rcvq;
352 };
353
354 struct mad_buffer_st {
355         void *buf;              /* pointer to a 256 byte buffer */
356         __u8 owner;             /* sw or hw ownership BUF_OWNER_SW or BUF_OWNER_HW */
357 };
358
359 struct rcv_buf_st {
360         void *buf;
361         __u8 busy;
362 };
363
364 struct ib_eqe_st {
365         __u8 event_type;
366         __u32 cqn;
367 };
368
369 struct cq_st {
370         __u32 cqn;
371         union cqe_st *cq_buf;
372         __u32 cons_counter;     /* consuner counter */
373         __u8 num_cqes;
374         __u32 arm_db_ctx_idx;
375         void *arm_db_ctx_pointer;
376         __u32 ci_db_ctx_idx;
377         void *ci_db_ctx_pointer;
378 };
379
380 struct udqp_st {
381         /* cq used by this QP */
382         struct cq_st snd_cq;
383         struct cq_st rcv_cq;
384
385         /* QP related data */
386         __u32 qpn;              /* QP number */
387
388         __u32 qkey;
389
390         __u8 recv_wqe_cur_free;
391         __u8 recv_wqe_alloc_idx;
392         __u8 max_recv_wqes;
393         void *rcv_bufs[MAX_RCV_WQES];
394         union recv_wqe_u *rcv_wq;       /* receive work queue */
395         struct recv_wqe_st *last_posted_rcv_wqe;
396
397         __u8 snd_wqe_cur_free;
398         __u8 snd_wqe_alloc_idx;
399         __u8 max_snd_wqes;
400         void *snd_bufs[MAX_SND_WQES];
401         __u16 send_buf_sz;
402         __u16 rcv_buf_sz;
403         union ud_send_wqe_u *snd_wq;    /* send work queue */
404         struct ud_send_wqe_st *last_posted_snd_wqe;
405         /* pointers to uar context entries */
406         void *send_uar_context;
407         __u16 post_send_counter;
408         void *rcv_uar_context;
409         __u16 post_rcv_counter;
410         __u32 snd_db_record_index;
411         __u32 rcv_db_record_index;
412 };
413
414 struct device_ib_data_st {
415         __u32 mkey;
416         __u32 pd;
417         __u8 port;
418         __u32 qkey;
419         struct eq_st eq;
420         struct udav_st udav;
421         struct udqp_st mads_qp;
422         struct udqp_st ipoib_qp;
423         void *clr_int_addr;
424         __u32 clr_int_data;
425         __u32 uar_idx;
426         void *uar_context_base;
427         void *error_buf_addr;
428         __u32 error_buf_size;
429 };
430
431 struct query_fw_st {
432         __u16 fw_rev_major;
433         __u16 fw_rev_minor;
434         __u16 fw_rev_subminor;
435         __u32 error_buf_start_h;
436         __u32 error_buf_start_l;
437         __u32 error_buf_size;
438         __u32 fw_pages;
439         struct addr_64_st eq_ci_table;
440         struct addr_64_st clear_int_addr;
441 };
442
443 struct query_adapter_st {
444         __u8 intapin;
445 };
446
447 struct vpm_entry_st {
448         __u32 va_h;
449         __u32 va_l;
450         __u32 pa_h;
451         __u32 pa_l;
452         __u8 log2_size;
453 };
454
455 #define MAX_VPM_PER_CALL 1
456
457 struct map_icm_st {
458         __u32 num_vpm;
459         struct vpm_entry_st vpm_arr[MAX_VPM_PER_CALL];
460 };
461
462 struct init_hca_st {
463         __u32 qpc_base_addr_h;
464         __u32 qpc_base_addr_l;
465         __u8 log_num_of_qp;
466
467         __u32 eec_base_addr_h;
468         __u32 eec_base_addr_l;
469         __u8 log_num_of_ee;
470
471         __u32 srqc_base_addr_h;
472         __u32 srqc_base_addr_l;
473         __u8 log_num_of_srq;
474
475         __u32 cqc_base_addr_h;
476         __u32 cqc_base_addr_l;
477         __u8 log_num_of_cq;
478
479         __u32 eqpc_base_addr_h;
480         __u32 eqpc_base_addr_l;
481
482         __u32 eeec_base_addr_h;
483         __u32 eeec_base_addr_l;
484
485         __u32 eqc_base_addr_h;
486         __u32 eqc_base_addr_l;
487         __u8 log_num_of_eq;
488
489         __u32 rdb_base_addr_h;
490         __u32 rdb_base_addr_l;
491
492         __u32 mc_base_addr_h;
493         __u32 mc_base_addr_l;
494         __u16 log_mc_table_entry_sz;
495         __u32 mc_table_hash_sz;
496         __u8 log_mc_table_sz;
497
498         __u32 mpt_base_addr_h;
499         __u32 mpt_base_addr_l;
500         __u8 log_mpt_sz;
501         __u32 mtt_base_addr_h;
502         __u32 mtt_base_addr_l;
503         __u8 log_max_uars;
504 };
505
506 struct dev_lim_st {
507         __u8 log2_rsvd_qps;
508         __u16 qpc_entry_sz;
509
510         __u8 log2_rsvd_srqs;
511         __u16 srq_entry_sz;
512
513         __u8 log2_rsvd_ees;
514         __u16 eec_entry_sz;
515
516         __u8 log2_rsvd_cqs;
517         __u16 cqc_entry_sz;
518
519         __u8 log2_rsvd_mtts;
520         __u16 mtt_entry_sz;
521
522         __u8 log2_rsvd_mrws;
523         __u16 mpt_entry_sz;
524
525         __u8 log2_rsvd_rdbs;
526
527         __u16 eqc_entry_sz;
528
529         __u32 max_icm_size_l;
530         __u32 max_icm_size_h;
531
532         __u8 uar_sz;
533         __u8 num_rsvd_uars;
534 };
535
536 static int create_udqp(struct udqp_st *qp);
537 static int destroy_udqp(struct udqp_st *qp);
538 static void *get_send_wqe_buf(void *wqe, __u8 index);
539 static void *get_rcv_wqe_buf(void *wqe, __u8 index);
540
541 static struct recv_wqe_st *alloc_rcv_wqe(struct udqp_st *qp);
542 static int free_wqe(void *wqe);
543 static int poll_cq(void *cqh, union cqe_st *cqe_p, __u8 * num_cqes);
544 static int poll_eq(struct ib_eqe_st *ib_eqe_p, __u8 * num_eqes);
545 static int post_rcv_buf(struct udqp_st *qp, struct recv_wqe_st *rcv_wqe);
546 static __u32 dev_get_qpn(void *qph);
547
548 #endif                          /* __mt25218_h__ */