[image] Allow for zero embedded images
[people/asdlkf/gpxe.git] / src / drivers / net / mlx_ipoib / mt23108.h
1 #ifndef __mt23108_h__
2 #define __mt23108_h__
3
4 #include "MT23108_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 TAVOR_RESET_OFFSET 0xF0010
12
13 /*
14  * Tavor specific command
15  *      Only coomands that are specific to Tavor
16  *  and used by the driver are listed here
17  */
18 #define TAVOR_CMD_SYS_EN        0x1
19 #define TAVOR_CMD_SYS_DIS       0x2
20
21 #define TAVOR_CMD_WRITE_MGM             0x26
22 #define TAVOR_CMD_MOD_STAT_CFG  0x34
23 #define TAVOR_CMD_QUERY_DEV_LIM   0x003
24 #define TAVOR_CMD_QUERY_FW              0x004
25
26 /*
27  * Tavor specific event types
28  *      Only event types that are specific to Tavor
29  *  and are used by the driver are listed here
30  */
31 #define TAVOR_IF_EV_TYPE_OVERRUN        0x0F
32
33 /*
34  * EQ doorbel commands
35  */
36 #define EQ_DBELL_CMD_INC_CONS_IDX 1     /* increment Consumer_indx by one */
37 #define EQ_DBELL_CMD_ARM_EQ       2     /* Request notifcation for next event (Arm EQ) */
38 #define EQ_DBELL_CMD_DISARM_CQ    3     /* Disarm CQ (CQ number is specified in EQ_param) */
39 #define EQ_DBELL_CMD_SET_CONS_IDX 4     /* set Consumer_indx to value of EQ_param */
40 #define EQ_DBELL_CMD_ALWAYS_ARM   5     /* move EQ to Always Armed state */
41
42 /*
43  * CQ doorbel commands
44  */
45 #define CQ_DBELL_CMD_INC_CONS_IDX 1
46 #define CQ_DBELL_CMD_REQ_NOTIF_SOL_UNSOL 2
47 #define CQ_DBELL_CMD_REQ_NOTIF_SOL 3
48 #define CQ_DBELL_CMD_SET_CONS_IDX 4
49 #define CQ_DBELL_CMD_REQ_NOTIF_MULT 5
50
51 #define INPRM_BUF_SZ 0x200
52 #define INPRM_BUF_ALIGN 16
53 #define OUTPRM_BUF_SZ 0x200
54 #define OUTPRM_BUF_ALIGN 16
55
56 /*
57  *  sizes of parameter blocks used in certain
58  *      commands.
59  *  TODO: replace them with sizeof
60  *  operators of the appropriate structs
61  */
62 #define SW2HW_MPT_IBUF_SZ        MT_STRUCT_SIZE(tavorprm_mpt_st)
63 #define SW2HW_EQ_IBUF_SZ         MT_STRUCT_SIZE(tavorprm_eqc_st)
64 #define INIT_IB_IBUF_SZ          0x100
65 #define SW2HW_CQ_IBUF_SZ         0x40
66 #define QPCTX_IBUF_SZ            0x200
67
68 #define EQN 0
69 #define UAR_IDX 1
70
71 #define QPC_OFFSET 0
72 #define CQC_OFFSET (QPC_OFFSET + 0x100000)
73 #define EQPC_OFFSET (CQC_OFFSET + 0x100000)
74 #define EQC_OFFSET (EQPC_OFFSET + 0x100000)
75 #define MC_BASE_OFFSET (EQC_OFFSET + 0x100000)
76 #define MPT_BASE_OFFSET (MC_BASE_OFFSET + 0x100000)
77 #define MTT_BASE_OFFSET (MPT_BASE_OFFSET + 0x100000)
78
79 #define LOG2_QPS 7
80 #define LOG2_CQS 8
81 #define LOG2_EQS 6
82 #define LOG2_MC_ENTRY 6         /* 8 QPs per group */
83 #define LOG2_MC_GROUPS 3        /* 8 groups */
84 #define LOG2_MPT_ENTRIES 5
85
86 #define LOG2_EQ_SZ 5
87 #define LOG2_CQ_SZ 5
88
89 #define NUM_PORTS 2
90
91 #define EQE_OWNER_SW 0
92 #define EQE_OWNER_HW 1
93
94 #define OWNER_HW 1
95 #define OWNER_SW 0
96
97 #define POST_RCV_OFFSET 0x18
98 #define POST_SND_OFFSET 0x10
99 #define CQ_DBELL_OFFSET 0x20
100 #define EQ_DBELL_OFFSET 0x28
101
102 #define CQE_ERROR_OPCODE 0xfe
103
104 #define MAX_GATHER 1            /* max gather entries used in send */
105 #define MAX_SCATTER 2
106
107 #define LOG2_MADS_SND_CQ_SZ LOG2_CQ_SZ
108 #define LOG2_MADS_RCV_CQ_SZ LOG2_CQ_SZ
109 #define LOG2_IPOIB_SND_CQ_SZ LOG2_CQ_SZ
110 #define LOG2_IPOIB_RCV_CQ_SZ LOG2_CQ_SZ
111
112 #define NUM_MADS_SND_CQES (1<<LOG2_MADS_SND_CQ_SZ)
113 #define NUM_MADS_RCV_CQES (1<<LOG2_MADS_RCV_CQ_SZ)
114 #define NUM_IPOIB_SND_CQES (1<<LOG2_IPOIB_SND_CQ_SZ)
115 #define NUM_IPOIB_RCV_CQES (1<<LOG2_IPOIB_RCV_CQ_SZ)
116
117 #define NUM_MADS_RCV_WQES 3
118 #define NUM_IPOIB_RCV_WQES 8
119
120 #if NUM_MADS_RCV_WQES > NUM_IPOIB_RCV_WQES
121 #define MAX_RCV_WQES NUM_MADS_RCV_WQES
122 #else
123 #define MAX_RCV_WQES NUM_IPOIB_RCV_WQES
124 #endif
125
126 #define NUM_MADS_SND_WQES 2
127 #define NUM_IPOIB_SND_WQES 2
128
129 #if NUM_MADS_SND_WQES > NUM_IPOIB_SND_WQES
130 #define MAX_SND_WQES NUM_MADS_SND_WQES
131 #else
132 #define MAX_SND_WQES NUM_IPOIB_SND_WQES
133 #endif
134
135 struct ib_buffers_st {
136         __u8 send_mad_buf[NUM_MADS_SND_WQES][MAD_BUF_SZ];
137         __u8 rcv_mad_buf[NUM_MADS_RCV_WQES][MAD_BUF_SZ + GRH_SIZE];
138         __u8 ipoib_rcv_buf[NUM_IPOIB_RCV_WQES][IPOIB_RCV_BUF_SZ + GRH_SIZE];
139         __u8 ipoib_rcv_grh_buf[NUM_IPOIB_RCV_WQES][IPOIB_RCV_BUF_SZ];
140         __u8 send_ipoib_buf[NUM_IPOIB_SND_WQES][IPOIB_SND_BUF_SZ];
141 };
142
143 struct pcidev {
144         unsigned long bar[6];
145         __u32 dev_config_space[64];
146         struct pci_device *dev;
147         __u8 bus;
148         __u8 devfn;
149 };
150
151 struct dev_pci_struct {
152         struct pcidev dev;
153         struct pcidev br;
154         void *cr_space;
155         void *uar;
156 };
157
158 struct eq_st {
159         __u8 eqn;
160         __u32 cons_idx;
161         __u32 eq_size;
162         struct eqe_t *eq_buf;
163 };
164
165 struct udav_st {
166         union ud_av_u *av_array;
167         __u8 udav_next_free;
168 };
169
170 #if 0
171 struct udavtable_memory_parameters_st {
172         __u32 lkey;
173         __u32 pd:24;
174         __u32 r0:5;
175         __u32 xlation_en:1;
176         __u32 r1:2;
177 } __attribute__ ((packed));
178
179 struct multicast_parameters_st {
180         __u32 mc_base_addr_h;
181         __u32 mc_base_addr_l;
182         __u32 r0[2];
183         __u32 log_mc_table_entry_sz:16;
184         __u32 r1:16;
185         __u32 mc_table_hash_sz:17;
186         __u32 r2:15;
187         __u32 log_mc_table_sz:5;
188         __u32 r3:19;
189         __u32 mc_hash_fn:3;
190         __u32 r4:5;
191         __u32 r5;
192 } __attribute__ ((packed));
193
194 struct tpt_parameters_st {
195         __u32 mpt_base_addr_h;
196         __u32 mpt_base_addr_l;
197
198         __u32 log_mpt_sz:6;
199         __u32 r0:2;
200         __u32 pfto:5;
201         __u32 r1:3;
202         __u32 mtt_segment_size:3;
203         __u32 r2:13;
204
205         __u32 mtt_version:8;
206         __u32 r3:24;
207
208         __u32 mtt_base_addr_h;
209         __u32 mtt_base_addr_l;
210         __u32 r4[2];
211 } __attribute__ ((packed));
212
213 struct uar_parameters_st {
214         __u32 uar_base_addr_h;
215         __u32 uar_base_addr_l;  /* 12 lsbs must be zero */
216         __u32 uar_page_sz:8;
217         __u32 r1:24;
218         __u32 r2;
219         __u32 uar_scratch_base_addr_h;
220         __u32 uar_scratch_base_addr_l;
221         __u32 r3[3];
222 } __attribute__ ((packed));
223
224 struct comp_event_data_st {
225         __u32 cqn:24;
226         __u32 r1:8;
227         __u32 r2[5];
228 } __attribute__ ((packed));
229
230 struct qp_event_data_st {
231         __u32 qpn_een:24;
232         __u32 r1:8;
233         __u32 r2;
234         __u32 r3:28;
235         __u32 e_q:1;
236         __u32 r4:3;
237         __u32 r5[3];
238 } __attribute__ ((packed));
239
240 struct port_state_change_event_data_st {
241         __u32 r0[2];
242         __u32 r1:28;
243         __u32 port:2;
244         __u32 r2:2;
245         __u32 r3[3];
246 } __attribute__ ((packed));
247 #endif
248
249 struct eqe_t {
250         __u8 raw[MT_STRUCT_SIZE(tavorprm_event_queue_entry_st)];
251 } __attribute__ ((packed));
252
253 enum qp_state_e {
254         QP_STATE_RST = 0,
255         QP_STATE_INIT = 1,
256         QP_STATE_RTR = 2,
257         QP_STATE_RTS = 3,
258         QP_STATE_SQEr = 4,
259         QP_STATE_SQD = 5,
260         QP_STATE_ERR = 6,
261         QP_STATE_SQDING = 7,
262         QP_STATE_SUSPEND = 9
263 };
264
265 struct memory_pointer_st {
266         __u32 byte_count;
267         __u32 lkey;
268         __u32 local_addr_h;
269         __u32 local_addr_l;
270 } __attribute__ ((packed));
271
272 /* receive wqe descriptor */
273 struct recv_wqe_st {
274         /* part referenced by hardware */
275         __u8 next[MT_STRUCT_SIZE(wqe_segment_next_st)];
276         __u8 control[MT_STRUCT_SIZE(wqe_segment_ctrl_recv_st)];
277         struct memory_pointer_st mpointer[MAX_SCATTER];
278 } __attribute__ ((packed));
279
280 struct recv_wqe_cont_st {
281         struct recv_wqe_st wqe;
282
283         struct udqp_st *qp;     /* qp this wqe is used with */
284 } __attribute__ ((packed));
285
286 #define RECV_WQE_U_ALIGN 64
287 union recv_wqe_u {
288         __u8 align[(sizeof(struct recv_wqe_cont_st) + RECV_WQE_U_ALIGN - 1) & (~(RECV_WQE_U_ALIGN - 1))];       /* this ensures proper alignment */
289         struct recv_wqe_st wqe;
290         struct recv_wqe_cont_st wqe_cont;
291 } __attribute__ ((packed));
292
293 struct recv_doorbell_st {
294         __u8 raw[MT_STRUCT_SIZE(tavorprm_receive_doorbell_st)];
295 } __attribute__ ((packed));
296
297 struct send_doorbell_st {
298         __u8 raw[MT_STRUCT_SIZE(tavorprm_send_doorbell_st)];
299 } __attribute__ ((packed));
300
301 struct next_control_seg_st {
302         __u8 next[MT_STRUCT_SIZE(wqe_segment_next_st)];
303         __u8 control[MT_STRUCT_SIZE(wqe_segment_ctrl_send_st)];
304 } __attribute__ ((packed));
305
306 struct ud_seg_st {
307         __u32 r1;
308         __u32 lkey;
309         __u32 av_add_h;
310         __u32 av_add_l;
311         __u32 r2[4];
312         __u32 dest_qp;
313         __u32 qkey;
314         __u32 r3[2];
315 } __attribute__ ((packed));
316
317 struct ud_send_wqe_st {
318         struct next_control_seg_st next;
319         struct ud_seg_st udseg;
320         struct memory_pointer_st mpointer[MAX_GATHER];
321 } __attribute__ ((packed));
322
323 struct ude_send_wqe_cont_st {
324         struct ud_send_wqe_st wqe;
325
326         struct udqp_st *qp;     /* qp this wqe is used with */
327 } __attribute__ ((packed));
328
329 #define UD_SEND_WQE_U_ALIGN 64
330 union ud_send_wqe_u {
331         __u8 align[(sizeof(struct ude_send_wqe_cont_st) + UD_SEND_WQE_U_ALIGN -
332                     1) & (~(UD_SEND_WQE_U_ALIGN - 1))];
333         struct ude_send_wqe_cont_st wqe_cont;
334         struct ud_send_wqe_st wqe;
335 } __attribute__ ((packed));
336
337 #define ADDRESS_VECTOR_ST_ALIGN 64
338 struct address_vector_st {
339         __u8 raw[MT_STRUCT_SIZE(tavorprm_ud_address_vector_st)];
340 } __attribute__ ((packed));
341
342 struct ud_av_st {
343         struct address_vector_st av;
344         __u32 dest_qp;          /* destination qpn */
345         __u8 next_free;
346 } __attribute__ ((packed));
347
348 union ud_av_u {
349         __u8 raw[(sizeof(struct ud_av_st) + ADDRESS_VECTOR_ST_ALIGN -
350                   1) & (~(ADDRESS_VECTOR_ST_ALIGN - 1))];
351         struct ud_av_st ud_av;
352 } __attribute__ ((packed));
353
354 union cqe_st {
355         __u8 good_cqe[MT_STRUCT_SIZE(tavorprm_completion_queue_entry_st)];
356         __u8 error_cqe[MT_STRUCT_SIZE(tavorprm_completion_with_error_st)];
357 } __attribute__ ((packed));
358
359 struct address_path_st {
360         __u8 raw[MT_STRUCT_SIZE(tavorprm_address_path_st)];
361 };
362
363 struct qp_ee_ctx_t {
364         __u8 raw[MT_STRUCT_SIZE(tavorprm_queue_pair_ee_context_entry_st)];
365 } __attribute__ ((packed));
366
367 struct qp_ee_state_tarnisition_st {
368         __u32 opt_param_mask;
369         __u32 r1;
370         struct qp_ee_ctx_t ctx;
371         __u32 r2[62];
372 } __attribute__ ((packed));
373
374 struct eq_dbell_st {
375         __u8 raw[MT_STRUCT_SIZE(tavorprm_eq_cmd_doorbell_st)];
376 } __attribute__ ((packed));
377
378 struct cq_dbell_st {
379         __u8 raw[MT_STRUCT_SIZE(tavorprm_cq_cmd_doorbell_st)];
380 } __attribute__ ((packed));
381
382 struct mad_ifc_inprm_st {
383         union mad_u mad;
384 } __attribute__ ((packed));
385
386 struct wqe_buf_st {
387         struct ud_send_wqe_st *sndq;
388         struct recv_wqe_st *rcvq;
389 };
390
391 struct mad_buffer_st {
392         void *buf;              /* pointer to a 256 byte buffer */
393         __u8 owner;             /* sw or hw ownership BUF_OWNER_SW or BUF_OWNER_HW */
394 };
395
396 struct rcv_buf_st {
397         void *buf;
398         __u8 busy;
399 };
400
401 struct ib_eqe_st {
402         __u8 event_type;
403         __u32 cqn;
404 };
405
406 struct cq_st {
407         __u32 cqn;
408         union cqe_st *cq_buf;
409         __u32 cons_idx;
410         __u8 num_cqes;
411 };
412
413 struct udqp_st {
414         /* cq used by this QP */
415         struct cq_st snd_cq;
416         struct cq_st rcv_cq;
417
418         /* QP related data */
419         __u32 qpn;              /* QP number */
420
421         __u32 qkey;
422
423         __u8 recv_wqe_cur_free;
424         __u8 recv_wqe_alloc_idx;
425         __u8 max_recv_wqes;
426         void *rcv_bufs[MAX_RCV_WQES];
427         union recv_wqe_u *rcv_wq;       /* receive work queue */
428         struct recv_wqe_st *last_posted_rcv_wqe;
429
430         __u8 snd_wqe_cur_free;
431         __u8 snd_wqe_alloc_idx;
432         __u8 max_snd_wqes;
433         void *snd_bufs[MAX_SND_WQES];
434         __u16 send_buf_sz;
435         __u16 rcv_buf_sz;
436         union ud_send_wqe_u *snd_wq;    /* send work queue */
437         struct ud_send_wqe_st *last_posted_snd_wqe;
438 };
439
440 struct device_ib_data_st {
441         __u32 mkey;
442         __u32 pd;
443         __u8 port;
444         __u32 qkey;
445         struct eq_st eq;
446         struct udav_st udav;
447         struct udqp_st mads_qp;
448         struct udqp_st ipoib_qp;
449         void *error_buf_addr;
450         __u32 error_buf_size;
451 };
452
453
454
455 struct query_fw_st {
456         __u16 fw_rev_major;
457         __u16 fw_rev_minor;
458         __u16 fw_rev_subminor;
459         __u32 error_buf_start_h;
460         __u32 error_buf_start_l;
461         __u32 error_buf_size;
462 };
463
464
465 struct dev_lim_st {
466         __u8 log2_rsvd_qps;
467         __u16 qpc_entry_sz;
468
469         __u8 log2_rsvd_srqs;
470         __u16 srq_entry_sz;
471
472         __u8 log2_rsvd_ees;
473         __u16 eec_entry_sz;
474
475         __u8 log2_rsvd_cqs;
476         __u16 cqc_entry_sz;
477
478         __u8 log2_rsvd_mtts;
479         __u16 mtt_entry_sz;
480
481         __u8 log2_rsvd_mrws;
482         __u16 mpt_entry_sz;
483
484         __u16 eqc_entry_sz;
485 };
486
487 struct init_hca_st {
488         __u32 qpc_base_addr_h;
489         __u32 qpc_base_addr_l;
490         __u8 log_num_of_qp;
491
492         __u32 eec_base_addr_h;
493         __u32 eec_base_addr_l;
494         __u8 log_num_of_ee;
495
496         __u32 srqc_base_addr_h;
497         __u32 srqc_base_addr_l;
498         __u8 log_num_of_srq;
499
500         __u32 cqc_base_addr_h;
501         __u32 cqc_base_addr_l;
502         __u8 log_num_of_cq;
503
504         __u32 eqpc_base_addr_h;
505         __u32 eqpc_base_addr_l;
506
507         __u32 eeec_base_addr_h;
508         __u32 eeec_base_addr_l;
509
510         __u32 eqc_base_addr_h;
511         __u32 eqc_base_addr_l;
512         __u8 log_num_of_eq;
513
514         __u32 rdb_base_addr_h;
515         __u32 rdb_base_addr_l;
516
517         __u32 mc_base_addr_h;
518         __u32 mc_base_addr_l;
519         __u16 log_mc_table_entry_sz;
520         __u32 mc_table_hash_sz;
521         __u8 log_mc_table_sz;
522
523         __u32 mpt_base_addr_h;
524         __u32 mpt_base_addr_l;
525         __u8 log_mpt_sz;
526         __u32 mtt_base_addr_h;
527         __u32 mtt_base_addr_l;
528         __u8 log_max_uars;
529 };
530
531 static int create_udqp(struct udqp_st *qp);
532 static int destroy_udqp(struct udqp_st *qp);
533 static void *get_send_wqe_buf(void *wqe, __u8 index);
534 static void *get_rcv_wqe_buf(void *wqe, __u8 index);
535
536 static struct recv_wqe_st *alloc_rcv_wqe(struct udqp_st *qp);
537 static int free_wqe(void *wqe);
538 static int poll_cq(void *cqh, union cqe_st *cqe_p, __u8 * num_cqes);
539 static int poll_eq(struct ib_eqe_st *ib_eqe_p, __u8 * num_eqes);
540 static int post_rcv_buf(struct udqp_st *qp, struct recv_wqe_st *rcv_wqe);
541 static __u32 dev_get_qpn(void *qph);
542
543 #endif                          /* __mt23108_h__ */