diff options
-rw-r--r-- | drivers/infiniband/core/verbs.c | 8 | ||||
-rw-r--r-- | include/rdma/ib_verbs.h | 149 |
2 files changed, 156 insertions, 1 deletions
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index ca8ce7d097e3..92525f855d82 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c | |||
@@ -1437,3 +1437,11 @@ int ib_destroy_flow(struct ib_flow *flow_id) | |||
1437 | return err; | 1437 | return err; |
1438 | } | 1438 | } |
1439 | EXPORT_SYMBOL(ib_destroy_flow); | 1439 | EXPORT_SYMBOL(ib_destroy_flow); |
1440 | |||
1441 | int ib_check_mr_status(struct ib_mr *mr, u32 check_mask, | ||
1442 | struct ib_mr_status *mr_status) | ||
1443 | { | ||
1444 | return mr->device->check_mr_status ? | ||
1445 | mr->device->check_mr_status(mr, check_mask, mr_status) : -ENOSYS; | ||
1446 | } | ||
1447 | EXPORT_SYMBOL(ib_check_mr_status); | ||
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index cb12e6a4e553..82ab5c1e7605 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h | |||
@@ -122,7 +122,19 @@ enum ib_device_cap_flags { | |||
122 | IB_DEVICE_BLOCK_MULTICAST_LOOPBACK = (1<<22), | 122 | IB_DEVICE_BLOCK_MULTICAST_LOOPBACK = (1<<22), |
123 | IB_DEVICE_MEM_WINDOW_TYPE_2A = (1<<23), | 123 | IB_DEVICE_MEM_WINDOW_TYPE_2A = (1<<23), |
124 | IB_DEVICE_MEM_WINDOW_TYPE_2B = (1<<24), | 124 | IB_DEVICE_MEM_WINDOW_TYPE_2B = (1<<24), |
125 | IB_DEVICE_MANAGED_FLOW_STEERING = (1<<29) | 125 | IB_DEVICE_MANAGED_FLOW_STEERING = (1<<29), |
126 | IB_DEVICE_SIGNATURE_HANDOVER = (1<<30) | ||
127 | }; | ||
128 | |||
129 | enum ib_signature_prot_cap { | ||
130 | IB_PROT_T10DIF_TYPE_1 = 1, | ||
131 | IB_PROT_T10DIF_TYPE_2 = 1 << 1, | ||
132 | IB_PROT_T10DIF_TYPE_3 = 1 << 2, | ||
133 | }; | ||
134 | |||
135 | enum ib_signature_guard_cap { | ||
136 | IB_GUARD_T10DIF_CRC = 1, | ||
137 | IB_GUARD_T10DIF_CSUM = 1 << 1, | ||
126 | }; | 138 | }; |
127 | 139 | ||
128 | enum ib_atomic_cap { | 140 | enum ib_atomic_cap { |
@@ -172,6 +184,8 @@ struct ib_device_attr { | |||
172 | unsigned int max_fast_reg_page_list_len; | 184 | unsigned int max_fast_reg_page_list_len; |
173 | u16 max_pkeys; | 185 | u16 max_pkeys; |
174 | u8 local_ca_ack_delay; | 186 | u8 local_ca_ack_delay; |
187 | int sig_prot_cap; | ||
188 | int sig_guard_cap; | ||
175 | }; | 189 | }; |
176 | 190 | ||
177 | enum ib_mtu { | 191 | enum ib_mtu { |
@@ -477,6 +491,114 @@ struct ib_mr_init_attr { | |||
477 | u32 flags; | 491 | u32 flags; |
478 | }; | 492 | }; |
479 | 493 | ||
494 | enum ib_signature_type { | ||
495 | IB_SIG_TYPE_T10_DIF, | ||
496 | }; | ||
497 | |||
498 | /** | ||
499 | * T10-DIF Signature types | ||
500 | * T10-DIF types are defined by SCSI | ||
501 | * specifications. | ||
502 | */ | ||
503 | enum ib_t10_dif_type { | ||
504 | IB_T10DIF_NONE, | ||
505 | IB_T10DIF_TYPE1, | ||
506 | IB_T10DIF_TYPE2, | ||
507 | IB_T10DIF_TYPE3 | ||
508 | }; | ||
509 | |||
510 | /** | ||
511 | * Signature T10-DIF block-guard types | ||
512 | * IB_T10DIF_CRC: Corresponds to T10-PI mandated CRC checksum rules. | ||
513 | * IB_T10DIF_CSUM: Corresponds to IP checksum rules. | ||
514 | */ | ||
515 | enum ib_t10_dif_bg_type { | ||
516 | IB_T10DIF_CRC, | ||
517 | IB_T10DIF_CSUM | ||
518 | }; | ||
519 | |||
520 | /** | ||
521 | * struct ib_t10_dif_domain - Parameters specific for T10-DIF | ||
522 | * domain. | ||
523 | * @type: T10-DIF type (0|1|2|3) | ||
524 | * @bg_type: T10-DIF block guard type (CRC|CSUM) | ||
525 | * @pi_interval: protection information interval. | ||
526 | * @bg: seed of guard computation. | ||
527 | * @app_tag: application tag of guard block | ||
528 | * @ref_tag: initial guard block reference tag. | ||
529 | * @type3_inc_reftag: T10-DIF type 3 does not state | ||
530 | * about the reference tag, it is the user | ||
531 | * choice to increment it or not. | ||
532 | */ | ||
533 | struct ib_t10_dif_domain { | ||
534 | enum ib_t10_dif_type type; | ||
535 | enum ib_t10_dif_bg_type bg_type; | ||
536 | u16 pi_interval; | ||
537 | u16 bg; | ||
538 | u16 app_tag; | ||
539 | u32 ref_tag; | ||
540 | bool type3_inc_reftag; | ||
541 | }; | ||
542 | |||
543 | /** | ||
544 | * struct ib_sig_domain - Parameters for signature domain | ||
545 | * @sig_type: specific signauture type | ||
546 | * @sig: union of all signature domain attributes that may | ||
547 | * be used to set domain layout. | ||
548 | */ | ||
549 | struct ib_sig_domain { | ||
550 | enum ib_signature_type sig_type; | ||
551 | union { | ||
552 | struct ib_t10_dif_domain dif; | ||
553 | } sig; | ||
554 | }; | ||
555 | |||
556 | /** | ||
557 | * struct ib_sig_attrs - Parameters for signature handover operation | ||
558 | * @check_mask: bitmask for signature byte check (8 bytes) | ||
559 | * @mem: memory domain layout desciptor. | ||
560 | * @wire: wire domain layout desciptor. | ||
561 | */ | ||
562 | struct ib_sig_attrs { | ||
563 | u8 check_mask; | ||
564 | struct ib_sig_domain mem; | ||
565 | struct ib_sig_domain wire; | ||
566 | }; | ||
567 | |||
568 | enum ib_sig_err_type { | ||
569 | IB_SIG_BAD_GUARD, | ||
570 | IB_SIG_BAD_REFTAG, | ||
571 | IB_SIG_BAD_APPTAG, | ||
572 | }; | ||
573 | |||
574 | /** | ||
575 | * struct ib_sig_err - signature error descriptor | ||
576 | */ | ||
577 | struct ib_sig_err { | ||
578 | enum ib_sig_err_type err_type; | ||
579 | u32 expected; | ||
580 | u32 actual; | ||
581 | u64 sig_err_offset; | ||
582 | u32 key; | ||
583 | }; | ||
584 | |||
585 | enum ib_mr_status_check { | ||
586 | IB_MR_CHECK_SIG_STATUS = 1, | ||
587 | }; | ||
588 | |||
589 | /** | ||
590 | * struct ib_mr_status - Memory region status container | ||
591 | * | ||
592 | * @fail_status: Bitmask of MR checks status. For each | ||
593 | * failed check a corresponding status bit is set. | ||
594 | * @sig_err: Additional info for IB_MR_CEHCK_SIG_STATUS | ||
595 | * failure. | ||
596 | */ | ||
597 | struct ib_mr_status { | ||
598 | u32 fail_status; | ||
599 | struct ib_sig_err sig_err; | ||
600 | }; | ||
601 | |||
480 | /** | 602 | /** |
481 | * mult_to_ib_rate - Convert a multiple of 2.5 Gbit/sec to an IB rate | 603 | * mult_to_ib_rate - Convert a multiple of 2.5 Gbit/sec to an IB rate |
482 | * enum. | 604 | * enum. |
@@ -660,6 +782,7 @@ enum ib_qp_create_flags { | |||
660 | IB_QP_CREATE_IPOIB_UD_LSO = 1 << 0, | 782 | IB_QP_CREATE_IPOIB_UD_LSO = 1 << 0, |
661 | IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK = 1 << 1, | 783 | IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK = 1 << 1, |
662 | IB_QP_CREATE_NETIF_QP = 1 << 5, | 784 | IB_QP_CREATE_NETIF_QP = 1 << 5, |
785 | IB_QP_CREATE_SIGNATURE_EN = 1 << 6, | ||
663 | /* reserve bits 26-31 for low level drivers' internal use */ | 786 | /* reserve bits 26-31 for low level drivers' internal use */ |
664 | IB_QP_CREATE_RESERVED_START = 1 << 26, | 787 | IB_QP_CREATE_RESERVED_START = 1 << 26, |
665 | IB_QP_CREATE_RESERVED_END = 1 << 31, | 788 | IB_QP_CREATE_RESERVED_END = 1 << 31, |
@@ -824,6 +947,7 @@ enum ib_wr_opcode { | |||
824 | IB_WR_MASKED_ATOMIC_CMP_AND_SWP, | 947 | IB_WR_MASKED_ATOMIC_CMP_AND_SWP, |
825 | IB_WR_MASKED_ATOMIC_FETCH_AND_ADD, | 948 | IB_WR_MASKED_ATOMIC_FETCH_AND_ADD, |
826 | IB_WR_BIND_MW, | 949 | IB_WR_BIND_MW, |
950 | IB_WR_REG_SIG_MR, | ||
827 | /* reserve values for low level drivers' internal use. | 951 | /* reserve values for low level drivers' internal use. |
828 | * These values will not be used at all in the ib core layer. | 952 | * These values will not be used at all in the ib core layer. |
829 | */ | 953 | */ |
@@ -929,6 +1053,12 @@ struct ib_send_wr { | |||
929 | u32 rkey; | 1053 | u32 rkey; |
930 | struct ib_mw_bind_info bind_info; | 1054 | struct ib_mw_bind_info bind_info; |
931 | } bind_mw; | 1055 | } bind_mw; |
1056 | struct { | ||
1057 | struct ib_sig_attrs *sig_attrs; | ||
1058 | struct ib_mr *sig_mr; | ||
1059 | int access_flags; | ||
1060 | struct ib_sge *prot; | ||
1061 | } sig_handover; | ||
932 | } wr; | 1062 | } wr; |
933 | u32 xrc_remote_srq_num; /* XRC TGT QPs only */ | 1063 | u32 xrc_remote_srq_num; /* XRC TGT QPs only */ |
934 | }; | 1064 | }; |
@@ -1474,6 +1604,8 @@ struct ib_device { | |||
1474 | *flow_attr, | 1604 | *flow_attr, |
1475 | int domain); | 1605 | int domain); |
1476 | int (*destroy_flow)(struct ib_flow *flow_id); | 1606 | int (*destroy_flow)(struct ib_flow *flow_id); |
1607 | int (*check_mr_status)(struct ib_mr *mr, u32 check_mask, | ||
1608 | struct ib_mr_status *mr_status); | ||
1477 | 1609 | ||
1478 | struct ib_dma_mapping_ops *dma_ops; | 1610 | struct ib_dma_mapping_ops *dma_ops; |
1479 | 1611 | ||
@@ -2473,4 +2605,19 @@ static inline int ib_check_mr_access(int flags) | |||
2473 | return 0; | 2605 | return 0; |
2474 | } | 2606 | } |
2475 | 2607 | ||
2608 | /** | ||
2609 | * ib_check_mr_status: lightweight check of MR status. | ||
2610 | * This routine may provide status checks on a selected | ||
2611 | * ib_mr. first use is for signature status check. | ||
2612 | * | ||
2613 | * @mr: A memory region. | ||
2614 | * @check_mask: Bitmask of which checks to perform from | ||
2615 | * ib_mr_status_check enumeration. | ||
2616 | * @mr_status: The container of relevant status checks. | ||
2617 | * failed checks will be indicated in the status bitmask | ||
2618 | * and the relevant info shall be in the error item. | ||
2619 | */ | ||
2620 | int ib_check_mr_status(struct ib_mr *mr, u32 check_mask, | ||
2621 | struct ib_mr_status *mr_status); | ||
2622 | |||
2476 | #endif /* IB_VERBS_H */ | 2623 | #endif /* IB_VERBS_H */ |