1
2
3
4
5
6
7
8
9
10#ifndef IB_MAD_H
11#define IB_MAD_H
12
13#include <linux/list.h>
14
15#include <rdma/ib_verbs.h>
16#include <uapi/rdma/ib_user_mad.h>
17
18
19#define IB_MGMT_BASE_VERSION 1
20#define OPA_MGMT_BASE_VERSION 0x80
21
22#define OPA_SM_CLASS_VERSION 0x80
23
24
25#define IB_MGMT_CLASS_SUBN_LID_ROUTED 0x01
26#define IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE 0x81
27#define IB_MGMT_CLASS_SUBN_ADM 0x03
28#define IB_MGMT_CLASS_PERF_MGMT 0x04
29#define IB_MGMT_CLASS_BM 0x05
30#define IB_MGMT_CLASS_DEVICE_MGMT 0x06
31#define IB_MGMT_CLASS_CM 0x07
32#define IB_MGMT_CLASS_SNMP 0x08
33#define IB_MGMT_CLASS_DEVICE_ADM 0x10
34#define IB_MGMT_CLASS_BOOT_MGMT 0x11
35#define IB_MGMT_CLASS_BIS 0x12
36#define IB_MGMT_CLASS_CONG_MGMT 0x21
37#define IB_MGMT_CLASS_VENDOR_RANGE2_START 0x30
38#define IB_MGMT_CLASS_VENDOR_RANGE2_END 0x4F
39
40#define IB_OPENIB_OUI (0x001405)
41
42
43#define IB_MGMT_METHOD_GET 0x01
44#define IB_MGMT_METHOD_SET 0x02
45#define IB_MGMT_METHOD_GET_RESP 0x81
46#define IB_MGMT_METHOD_SEND 0x03
47#define IB_MGMT_METHOD_TRAP 0x05
48#define IB_MGMT_METHOD_REPORT 0x06
49#define IB_MGMT_METHOD_REPORT_RESP 0x86
50#define IB_MGMT_METHOD_TRAP_REPRESS 0x07
51
52#define IB_MGMT_METHOD_RESP 0x80
53#define IB_BM_ATTR_MOD_RESP cpu_to_be32(1)
54
55#define IB_MGMT_MAX_METHODS 128
56
57
58#define IB_MGMT_MAD_STATUS_SUCCESS 0x0000
59#define IB_MGMT_MAD_STATUS_BUSY 0x0001
60#define IB_MGMT_MAD_STATUS_REDIRECT_REQD 0x0002
61#define IB_MGMT_MAD_STATUS_BAD_VERSION 0x0004
62#define IB_MGMT_MAD_STATUS_UNSUPPORTED_METHOD 0x0008
63#define IB_MGMT_MAD_STATUS_UNSUPPORTED_METHOD_ATTRIB 0x000c
64#define IB_MGMT_MAD_STATUS_INVALID_ATTRIB_VALUE 0x001c
65
66
67#define IB_MGMT_RMPP_VERSION 1
68
69#define IB_MGMT_RMPP_TYPE_DATA 1
70#define IB_MGMT_RMPP_TYPE_ACK 2
71#define IB_MGMT_RMPP_TYPE_STOP 3
72#define IB_MGMT_RMPP_TYPE_ABORT 4
73
74#define IB_MGMT_RMPP_FLAG_ACTIVE 1
75#define IB_MGMT_RMPP_FLAG_FIRST (1<<1)
76#define IB_MGMT_RMPP_FLAG_LAST (1<<2)
77
78#define IB_MGMT_RMPP_NO_RESPTIME 0x1F
79
80#define IB_MGMT_RMPP_STATUS_SUCCESS 0
81#define IB_MGMT_RMPP_STATUS_RESX 1
82#define IB_MGMT_RMPP_STATUS_ABORT_MIN 118
83#define IB_MGMT_RMPP_STATUS_T2L 118
84#define IB_MGMT_RMPP_STATUS_BAD_LEN 119
85#define IB_MGMT_RMPP_STATUS_BAD_SEG 120
86#define IB_MGMT_RMPP_STATUS_BADT 121
87#define IB_MGMT_RMPP_STATUS_W2S 122
88#define IB_MGMT_RMPP_STATUS_S2B 123
89#define IB_MGMT_RMPP_STATUS_BAD_STATUS 124
90#define IB_MGMT_RMPP_STATUS_UNV 125
91#define IB_MGMT_RMPP_STATUS_TMR 126
92#define IB_MGMT_RMPP_STATUS_UNSPEC 127
93#define IB_MGMT_RMPP_STATUS_ABORT_MAX 127
94
95#define IB_QP0 0
96#define IB_QP1 cpu_to_be32(1)
97#define IB_QP1_QKEY 0x80010000
98#define IB_QP_SET_QKEY 0x80000000
99
100#define IB_DEFAULT_PKEY_PARTIAL 0x7FFF
101#define IB_DEFAULT_PKEY_FULL 0xFFFF
102
103
104
105
106#define IB_NOTICE_TYPE_FATAL 0x80
107#define IB_NOTICE_TYPE_URGENT 0x81
108#define IB_NOTICE_TYPE_SECURITY 0x82
109#define IB_NOTICE_TYPE_SM 0x83
110#define IB_NOTICE_TYPE_INFO 0x84
111
112
113
114
115#define IB_NOTICE_PROD_CA cpu_to_be16(1)
116#define IB_NOTICE_PROD_SWITCH cpu_to_be16(2)
117#define IB_NOTICE_PROD_ROUTER cpu_to_be16(3)
118#define IB_NOTICE_PROD_CLASS_MGR cpu_to_be16(4)
119
120enum {
121 IB_MGMT_MAD_HDR = 24,
122 IB_MGMT_MAD_DATA = 232,
123 IB_MGMT_RMPP_HDR = 36,
124 IB_MGMT_RMPP_DATA = 220,
125 IB_MGMT_VENDOR_HDR = 40,
126 IB_MGMT_VENDOR_DATA = 216,
127 IB_MGMT_SA_HDR = 56,
128 IB_MGMT_SA_DATA = 200,
129 IB_MGMT_DEVICE_HDR = 64,
130 IB_MGMT_DEVICE_DATA = 192,
131 IB_MGMT_MAD_SIZE = IB_MGMT_MAD_HDR + IB_MGMT_MAD_DATA,
132 OPA_MGMT_MAD_DATA = 2024,
133 OPA_MGMT_RMPP_DATA = 2012,
134 OPA_MGMT_MAD_SIZE = IB_MGMT_MAD_HDR + OPA_MGMT_MAD_DATA,
135};
136
137struct ib_mad_hdr {
138 u8 base_version;
139 u8 mgmt_class;
140 u8 class_version;
141 u8 method;
142 __be16 status;
143 __be16 class_specific;
144 __be64 tid;
145 __be16 attr_id;
146 __be16 resv;
147 __be32 attr_mod;
148};
149
150struct ib_rmpp_hdr {
151 u8 rmpp_version;
152 u8 rmpp_type;
153 u8 rmpp_rtime_flags;
154 u8 rmpp_status;
155 __be32 seg_num;
156 __be32 paylen_newwin;
157};
158
159typedef u64 __bitwise ib_sa_comp_mask;
160
161#define IB_SA_COMP_MASK(n) ((__force ib_sa_comp_mask) cpu_to_be64(1ull << (n)))
162
163
164
165
166
167
168
169struct ib_sa_hdr {
170 __be64 sm_key;
171 __be16 attr_offset;
172 __be16 reserved;
173 ib_sa_comp_mask comp_mask;
174} __packed;
175
176struct ib_mad {
177 struct ib_mad_hdr mad_hdr;
178 u8 data[IB_MGMT_MAD_DATA];
179};
180
181struct opa_mad {
182 struct ib_mad_hdr mad_hdr;
183 u8 data[OPA_MGMT_MAD_DATA];
184};
185
186struct ib_rmpp_mad {
187 struct ib_mad_hdr mad_hdr;
188 struct ib_rmpp_hdr rmpp_hdr;
189 u8 data[IB_MGMT_RMPP_DATA];
190};
191
192struct opa_rmpp_mad {
193 struct ib_mad_hdr mad_hdr;
194 struct ib_rmpp_hdr rmpp_hdr;
195 u8 data[OPA_MGMT_RMPP_DATA];
196};
197
198struct ib_sa_mad {
199 struct ib_mad_hdr mad_hdr;
200 struct ib_rmpp_hdr rmpp_hdr;
201 struct ib_sa_hdr sa_hdr;
202 u8 data[IB_MGMT_SA_DATA];
203} __packed;
204
205struct ib_vendor_mad {
206 struct ib_mad_hdr mad_hdr;
207 struct ib_rmpp_hdr rmpp_hdr;
208 u8 reserved;
209 u8 oui[3];
210 u8 data[IB_MGMT_VENDOR_DATA];
211};
212
213#define IB_MGMT_CLASSPORTINFO_ATTR_ID cpu_to_be16(0x0001)
214
215#define IB_CLASS_PORT_INFO_RESP_TIME_MASK 0x1F
216#define IB_CLASS_PORT_INFO_RESP_TIME_FIELD_SIZE 5
217
218struct ib_class_port_info {
219 u8 base_version;
220 u8 class_version;
221 __be16 capability_mask;
222
223 __be32 cap_mask2_resp_time;
224 u8 redirect_gid[16];
225 __be32 redirect_tcslfl;
226 __be16 redirect_lid;
227 __be16 redirect_pkey;
228 __be32 redirect_qp;
229 __be32 redirect_qkey;
230 u8 trap_gid[16];
231 __be32 trap_tcslfl;
232 __be16 trap_lid;
233 __be16 trap_pkey;
234 __be32 trap_hlqp;
235 __be32 trap_qkey;
236};
237
238
239enum ib_port_capability_mask_bits {
240 IB_PORT_SM = 1 << 1,
241 IB_PORT_NOTICE_SUP = 1 << 2,
242 IB_PORT_TRAP_SUP = 1 << 3,
243 IB_PORT_OPT_IPD_SUP = 1 << 4,
244 IB_PORT_AUTO_MIGR_SUP = 1 << 5,
245 IB_PORT_SL_MAP_SUP = 1 << 6,
246 IB_PORT_MKEY_NVRAM = 1 << 7,
247 IB_PORT_PKEY_NVRAM = 1 << 8,
248 IB_PORT_LED_INFO_SUP = 1 << 9,
249 IB_PORT_SM_DISABLED = 1 << 10,
250 IB_PORT_SYS_IMAGE_GUID_SUP = 1 << 11,
251 IB_PORT_PKEY_SW_EXT_PORT_TRAP_SUP = 1 << 12,
252 IB_PORT_EXTENDED_SPEEDS_SUP = 1 << 14,
253 IB_PORT_CAP_MASK2_SUP = 1 << 15,
254 IB_PORT_CM_SUP = 1 << 16,
255 IB_PORT_SNMP_TUNNEL_SUP = 1 << 17,
256 IB_PORT_REINIT_SUP = 1 << 18,
257 IB_PORT_DEVICE_MGMT_SUP = 1 << 19,
258 IB_PORT_VENDOR_CLASS_SUP = 1 << 20,
259 IB_PORT_DR_NOTICE_SUP = 1 << 21,
260 IB_PORT_CAP_MASK_NOTICE_SUP = 1 << 22,
261 IB_PORT_BOOT_MGMT_SUP = 1 << 23,
262 IB_PORT_LINK_LATENCY_SUP = 1 << 24,
263 IB_PORT_CLIENT_REG_SUP = 1 << 25,
264 IB_PORT_OTHER_LOCAL_CHANGES_SUP = 1 << 26,
265 IB_PORT_LINK_SPEED_WIDTH_TABLE_SUP = 1 << 27,
266 IB_PORT_VENDOR_SPECIFIC_MADS_TABLE_SUP = 1 << 28,
267 IB_PORT_MCAST_PKEY_TRAP_SUPPRESSION_SUP = 1 << 29,
268 IB_PORT_MCAST_FDB_TOP_SUP = 1 << 30,
269 IB_PORT_HIERARCHY_INFO_SUP = 1ULL << 31,
270};
271
272enum ib_port_capability_mask2_bits {
273 IB_PORT_SET_NODE_DESC_SUP = 1 << 0,
274 IB_PORT_EX_PORT_INFO_EX_SUP = 1 << 1,
275 IB_PORT_VIRT_SUP = 1 << 2,
276 IB_PORT_SWITCH_PORT_STATE_TABLE_SUP = 1 << 3,
277 IB_PORT_LINK_WIDTH_2X_SUP = 1 << 4,
278 IB_PORT_LINK_SPEED_HDR_SUP = 1 << 5,
279};
280
281#define OPA_CLASS_PORT_INFO_PR_SUPPORT BIT(26)
282
283struct opa_class_port_info {
284 u8 base_version;
285 u8 class_version;
286 __be16 cap_mask;
287 __be32 cap_mask2_resp_time;
288
289 u8 redirect_gid[16];
290 __be32 redirect_tc_fl;
291 __be32 redirect_lid;
292 __be32 redirect_sl_qp;
293 __be32 redirect_qkey;
294
295 u8 trap_gid[16];
296 __be32 trap_tc_fl;
297 __be32 trap_lid;
298 __be32 trap_hl_qp;
299 __be32 trap_qkey;
300
301 __be16 trap_pkey;
302 __be16 redirect_pkey;
303
304 u8 trap_sl_rsvd;
305 u8 reserved[3];
306} __packed;
307
308
309
310
311
312
313static inline u8 ib_get_cpi_resp_time(struct ib_class_port_info *cpi)
314{
315 return (u8)(be32_to_cpu(cpi->cap_mask2_resp_time) &
316 IB_CLASS_PORT_INFO_RESP_TIME_MASK);
317}
318
319
320
321
322
323
324
325static inline void ib_set_cpi_resp_time(struct ib_class_port_info *cpi,
326 u8 rtime)
327{
328 cpi->cap_mask2_resp_time =
329 (cpi->cap_mask2_resp_time &
330 cpu_to_be32(~IB_CLASS_PORT_INFO_RESP_TIME_MASK)) |
331 cpu_to_be32(rtime & IB_CLASS_PORT_INFO_RESP_TIME_MASK);
332}
333
334
335
336
337
338
339static inline u32 ib_get_cpi_capmask2(struct ib_class_port_info *cpi)
340{
341 return (be32_to_cpu(cpi->cap_mask2_resp_time) >>
342 IB_CLASS_PORT_INFO_RESP_TIME_FIELD_SIZE);
343}
344
345
346
347
348
349
350
351static inline void ib_set_cpi_capmask2(struct ib_class_port_info *cpi,
352 u32 capmask2)
353{
354 cpi->cap_mask2_resp_time =
355 (cpi->cap_mask2_resp_time &
356 cpu_to_be32(IB_CLASS_PORT_INFO_RESP_TIME_MASK)) |
357 cpu_to_be32(capmask2 <<
358 IB_CLASS_PORT_INFO_RESP_TIME_FIELD_SIZE);
359}
360
361
362
363
364
365
366static inline u32 opa_get_cpi_capmask2(struct opa_class_port_info *cpi)
367{
368 return (be32_to_cpu(cpi->cap_mask2_resp_time) >>
369 IB_CLASS_PORT_INFO_RESP_TIME_FIELD_SIZE);
370}
371
372struct ib_mad_notice_attr {
373 u8 generic_type;
374 u8 prod_type_msb;
375 __be16 prod_type_lsb;
376 __be16 trap_num;
377 __be16 issuer_lid;
378 __be16 toggle_count;
379
380 union {
381 struct {
382 u8 details[54];
383 } raw_data;
384
385 struct {
386 __be16 reserved;
387 __be16 lid;
388 u8 port_num;
389 } __packed ntc_129_131;
390
391 struct {
392 __be16 reserved;
393 __be16 lid;
394 u8 reserved2;
395 u8 local_changes;
396 __be32 new_cap_mask;
397 u8 reserved3;
398 u8 change_flags;
399 } __packed ntc_144;
400
401 struct {
402 __be16 reserved;
403 __be16 lid;
404 __be16 reserved2;
405 __be64 new_sys_guid;
406 } __packed ntc_145;
407
408 struct {
409 __be16 reserved;
410 __be16 lid;
411 __be16 dr_slid;
412 u8 method;
413 u8 reserved2;
414 __be16 attr_id;
415 __be32 attr_mod;
416 __be64 mkey;
417 u8 reserved3;
418 u8 dr_trunc_hop;
419 u8 dr_rtn_path[30];
420 } __packed ntc_256;
421
422 struct {
423 __be16 reserved;
424 __be16 lid1;
425 __be16 lid2;
426 __be32 key;
427 __be32 sl_qp1;
428 __be32 qp2;
429 union ib_gid gid1;
430 union ib_gid gid2;
431 } __packed ntc_257_258;
432
433 } details;
434};
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462struct ib_mad_send_buf {
463 struct ib_mad_send_buf *next;
464 void *mad;
465 struct ib_mad_agent *mad_agent;
466 struct ib_ah *ah;
467 void *context[2];
468 int hdr_len;
469 int data_len;
470 int seg_count;
471 int seg_size;
472 int seg_rmpp_size;
473 int timeout_ms;
474 int retries;
475};
476
477
478
479
480
481int ib_response_mad(const struct ib_mad_hdr *hdr);
482
483
484
485
486
487static inline u8 ib_get_rmpp_resptime(struct ib_rmpp_hdr *rmpp_hdr)
488{
489 return rmpp_hdr->rmpp_rtime_flags >> 3;
490}
491
492
493
494
495
496static inline u8 ib_get_rmpp_flags(struct ib_rmpp_hdr *rmpp_hdr)
497{
498 return rmpp_hdr->rmpp_rtime_flags & 0x7;
499}
500
501
502
503
504
505
506static inline void ib_set_rmpp_resptime(struct ib_rmpp_hdr *rmpp_hdr, u8 rtime)
507{
508 rmpp_hdr->rmpp_rtime_flags = ib_get_rmpp_flags(rmpp_hdr) | (rtime << 3);
509}
510
511
512
513
514
515
516static inline void ib_set_rmpp_flags(struct ib_rmpp_hdr *rmpp_hdr, u8 flags)
517{
518 rmpp_hdr->rmpp_rtime_flags = (rmpp_hdr->rmpp_rtime_flags & 0xF8) |
519 (flags & 0x7);
520}
521
522struct ib_mad_agent;
523struct ib_mad_send_wc;
524struct ib_mad_recv_wc;
525
526
527
528
529
530
531typedef void (*ib_mad_send_handler)(struct ib_mad_agent *mad_agent,
532 struct ib_mad_send_wc *mad_send_wc);
533
534
535
536
537
538
539
540
541
542
543
544
545typedef void (*ib_mad_recv_handler)(struct ib_mad_agent *mad_agent,
546 struct ib_mad_send_buf *send_buf,
547 struct ib_mad_recv_wc *mad_recv_wc);
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564enum {
565 IB_MAD_USER_RMPP = IB_USER_MAD_USER_RMPP,
566};
567struct ib_mad_agent {
568 struct ib_device *device;
569 struct ib_qp *qp;
570 ib_mad_recv_handler recv_handler;
571 ib_mad_send_handler send_handler;
572 void *context;
573 u32 hi_tid;
574 u32 flags;
575 void *security;
576 struct list_head mad_agent_sec_list;
577 u8 port_num;
578 u8 rmpp_version;
579 bool smp_allowed;
580};
581
582
583
584
585
586
587
588
589struct ib_mad_send_wc {
590 struct ib_mad_send_buf *send_buf;
591 enum ib_wc_status status;
592 u32 vendor_err;
593};
594
595
596
597
598
599
600
601
602
603struct ib_mad_recv_buf {
604 struct list_head list;
605 struct ib_grh *grh;
606 union {
607 struct ib_mad *mad;
608 struct opa_mad *opa_mad;
609 };
610};
611
612
613
614
615
616
617
618
619
620
621
622
623struct ib_mad_recv_wc {
624 struct ib_wc *wc;
625 struct ib_mad_recv_buf recv_buf;
626 struct list_head rmpp_list;
627 int mad_len;
628 size_t mad_seg_size;
629};
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644struct ib_mad_reg_req {
645 u8 mgmt_class;
646 u8 mgmt_class_version;
647 u8 oui[3];
648 DECLARE_BITMAP(method_mask, IB_MGMT_MAX_METHODS);
649};
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
671 u32 port_num,
672 enum ib_qp_type qp_type,
673 struct ib_mad_reg_req *mad_reg_req,
674 u8 rmpp_version,
675 ib_mad_send_handler send_handler,
676 ib_mad_recv_handler recv_handler,
677 void *context,
678 u32 registration_flags);
679
680
681
682
683
684
685
686void ib_unregister_mad_agent(struct ib_mad_agent *mad_agent);
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707int ib_post_send_mad(struct ib_mad_send_buf *send_buf,
708 struct ib_mad_send_buf **bad_send_buf);
709
710
711
712
713
714
715
716
717
718void ib_free_recv_mad(struct ib_mad_recv_wc *mad_recv_wc);
719
720
721
722
723
724
725
726
727
728int ib_modify_mad(struct ib_mad_send_buf *send_buf, u32 timeout_ms);
729
730
731
732
733
734
735
736
737static inline void ib_cancel_mad(struct ib_mad_send_buf *send_buf)
738{
739 ib_modify_mad(send_buf, 0);
740}
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769struct ib_mad_send_buf *ib_create_send_mad(struct ib_mad_agent *mad_agent,
770 u32 remote_qpn, u16 pkey_index,
771 int rmpp_active,
772 int hdr_len, int data_len,
773 gfp_t gfp_mask,
774 u8 base_version);
775
776
777
778
779
780
781
782
783int ib_is_mad_class_rmpp(u8 mgmt_class);
784
785
786
787
788
789
790
791
792
793int ib_get_mad_data_offset(u8 mgmt_class);
794
795
796
797
798
799
800
801
802
803void *ib_get_rmpp_segment(struct ib_mad_send_buf *send_buf, int seg_num);
804
805
806
807
808
809void ib_free_send_mad(struct ib_mad_send_buf *send_buf);
810
811
812
813
814
815
816int ib_mad_kernel_rmpp_agent(const struct ib_mad_agent *agent);
817
818#endif
819