]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - include/rdma/ib_verbs.h
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid
[linux.git] / include / rdma / ib_verbs.h
index 54873085f2dab21257680f63c2e8db1e83416b8c..4f225175cb91ef6e43a75b29e9b51084b31db413 100644 (file)
 #include <linux/cgroup_rdma.h>
 #include <linux/irqflags.h>
 #include <linux/preempt.h>
+#include <linux/dim.h>
 #include <uapi/rdma/ib_user_verbs.h>
+#include <rdma/rdma_counter.h>
 #include <rdma/restrack.h>
+#include <rdma/signature.h>
 #include <uapi/rdma/rdma_user_ioctl.h>
 #include <uapi/rdma/ib_user_ioctl_verbs.h>
 
@@ -132,17 +135,6 @@ struct ib_gid_attr {
        u8                      port_num;
 };
 
-enum rdma_node_type {
-       /* IB values map to NodeInfo:NodeType. */
-       RDMA_NODE_IB_CA         = 1,
-       RDMA_NODE_IB_SWITCH,
-       RDMA_NODE_IB_ROUTER,
-       RDMA_NODE_RNIC,
-       RDMA_NODE_USNIC,
-       RDMA_NODE_USNIC_UDP,
-       RDMA_NODE_UNSPECIFIED,
-};
-
 enum {
        /* set the local administered indication */
        IB_SA_WELL_KNOWN_GUID   = BIT_ULL(57) | 2,
@@ -164,7 +156,7 @@ enum rdma_protocol_type {
 };
 
 __attribute_const__ enum rdma_transport_type
-rdma_node_get_transport(enum rdma_node_type node_type);
+rdma_node_get_transport(unsigned int node_type);
 
 enum rdma_network_type {
        RDMA_NETWORK_IB,
@@ -263,7 +255,7 @@ enum ib_device_cap_flags {
         */
        IB_DEVICE_CROSS_CHANNEL                 = (1 << 27),
        IB_DEVICE_MANAGED_FLOW_STEERING         = (1 << 29),
-       IB_DEVICE_SIGNATURE_HANDOVER            = (1 << 30),
+       IB_DEVICE_INTEGRITY_HANDOVER            = (1 << 30),
        IB_DEVICE_ON_DEMAND_PAGING              = (1ULL << 31),
        IB_DEVICE_SG_GAPS_REG                   = (1ULL << 32),
        IB_DEVICE_VIRTUAL_FUNCTION              = (1ULL << 33),
@@ -275,17 +267,6 @@ enum ib_device_cap_flags {
        IB_DEVICE_ALLOW_USER_UNREG              = (1ULL << 37),
 };
 
-enum ib_signature_prot_cap {
-       IB_PROT_T10DIF_TYPE_1 = 1,
-       IB_PROT_T10DIF_TYPE_2 = 1 << 1,
-       IB_PROT_T10DIF_TYPE_3 = 1 << 2,
-};
-
-enum ib_signature_guard_cap {
-       IB_GUARD_T10DIF_CRC     = 1,
-       IB_GUARD_T10DIF_CSUM    = 1 << 1,
-};
-
 enum ib_atomic_cap {
        IB_ATOMIC_NONE,
        IB_ATOMIC_HCA,
@@ -327,8 +308,8 @@ struct ib_rss_caps {
 };
 
 enum ib_tm_cap_flags {
-       /*  Support tag matching on RC transport */
-       IB_TM_CAP_RC                = 1 << 0,
+       /*  Support tag matching with rendezvous offload for RC transport */
+       IB_TM_CAP_RNDV_RC = 1 << 0,
 };
 
 struct ib_tm_caps {
@@ -411,6 +392,7 @@ struct ib_device_attr {
        int                     max_srq_wr;
        int                     max_srq_sge;
        unsigned int            max_fast_reg_page_list_len;
+       unsigned int            max_pi_fast_reg_page_list_len;
        u16                     max_pkeys;
        u8                      local_ca_ack_delay;
        int                     sig_prot_cap;
@@ -796,118 +778,26 @@ __attribute_const__ int ib_rate_to_mbps(enum ib_rate rate);
  * enum ib_mr_type - memory region type
  * @IB_MR_TYPE_MEM_REG:       memory region that is used for
  *                            normal registration
- * @IB_MR_TYPE_SIGNATURE:     memory region that is used for
- *                            signature operations (data-integrity
- *                            capable regions)
  * @IB_MR_TYPE_SG_GAPS:       memory region that is capable to
  *                            register any arbitrary sg lists (without
  *                            the normal mr constraints - see
  *                            ib_map_mr_sg)
+ * @IB_MR_TYPE_DM:            memory region that is used for device
+ *                            memory registration
+ * @IB_MR_TYPE_USER:          memory region that is used for the user-space
+ *                            application
+ * @IB_MR_TYPE_DMA:           memory region that is used for DMA operations
+ *                            without address translations (VA=PA)
+ * @IB_MR_TYPE_INTEGRITY:     memory region that is used for
+ *                            data integrity operations
  */
 enum ib_mr_type {
        IB_MR_TYPE_MEM_REG,
-       IB_MR_TYPE_SIGNATURE,
        IB_MR_TYPE_SG_GAPS,
-};
-
-/**
- * Signature types
- * IB_SIG_TYPE_NONE: Unprotected.
- * IB_SIG_TYPE_T10_DIF: Type T10-DIF
- */
-enum ib_signature_type {
-       IB_SIG_TYPE_NONE,
-       IB_SIG_TYPE_T10_DIF,
-};
-
-/**
- * Signature T10-DIF block-guard types
- * IB_T10DIF_CRC: Corresponds to T10-PI mandated CRC checksum rules.
- * IB_T10DIF_CSUM: Corresponds to IP checksum rules.
- */
-enum ib_t10_dif_bg_type {
-       IB_T10DIF_CRC,
-       IB_T10DIF_CSUM
-};
-
-/**
- * struct ib_t10_dif_domain - Parameters specific for T10-DIF
- *     domain.
- * @bg_type: T10-DIF block guard type (CRC|CSUM)
- * @pi_interval: protection information interval.
- * @bg: seed of guard computation.
- * @app_tag: application tag of guard block
- * @ref_tag: initial guard block reference tag.
- * @ref_remap: Indicate wethear the reftag increments each block
- * @app_escape: Indicate to skip block check if apptag=0xffff
- * @ref_escape: Indicate to skip block check if reftag=0xffffffff
- * @apptag_check_mask: check bitmask of application tag.
- */
-struct ib_t10_dif_domain {
-       enum ib_t10_dif_bg_type bg_type;
-       u16                     pi_interval;
-       u16                     bg;
-       u16                     app_tag;
-       u32                     ref_tag;
-       bool                    ref_remap;
-       bool                    app_escape;
-       bool                    ref_escape;
-       u16                     apptag_check_mask;
-};
-
-/**
- * struct ib_sig_domain - Parameters for signature domain
- * @sig_type: specific signauture type
- * @sig: union of all signature domain attributes that may
- *     be used to set domain layout.
- */
-struct ib_sig_domain {
-       enum ib_signature_type sig_type;
-       union {
-               struct ib_t10_dif_domain dif;
-       } sig;
-};
-
-/**
- * struct ib_sig_attrs - Parameters for signature handover operation
- * @check_mask: bitmask for signature byte check (8 bytes)
- * @mem: memory domain layout desciptor.
- * @wire: wire domain layout desciptor.
- */
-struct ib_sig_attrs {
-       u8                      check_mask;
-       struct ib_sig_domain    mem;
-       struct ib_sig_domain    wire;
-};
-
-enum ib_sig_err_type {
-       IB_SIG_BAD_GUARD,
-       IB_SIG_BAD_REFTAG,
-       IB_SIG_BAD_APPTAG,
-};
-
-/**
- * Signature check masks (8 bytes in total) according to the T10-PI standard:
- *  -------- -------- ------------
- * | GUARD  | APPTAG |   REFTAG   |
- * |  2B    |  2B    |    4B      |
- *  -------- -------- ------------
- */
-enum {
-       IB_SIG_CHECK_GUARD      = 0xc0,
-       IB_SIG_CHECK_APPTAG     = 0x30,
-       IB_SIG_CHECK_REFTAG     = 0x0f,
-};
-
-/**
- * struct ib_sig_err - signature error descriptor
- */
-struct ib_sig_err {
-       enum ib_sig_err_type    err_type;
-       u32                     expected;
-       u32                     actual;
-       u64                     sig_err_offset;
-       u32                     key;
+       IB_MR_TYPE_DM,
+       IB_MR_TYPE_USER,
+       IB_MR_TYPE_DMA,
+       IB_MR_TYPE_INTEGRITY,
 };
 
 enum ib_mr_status_check {
@@ -1164,7 +1054,7 @@ enum ib_qp_create_flags {
        IB_QP_CREATE_MANAGED_SEND               = 1 << 3,
        IB_QP_CREATE_MANAGED_RECV               = 1 << 4,
        IB_QP_CREATE_NETIF_QP                   = 1 << 5,
-       IB_QP_CREATE_SIGNATURE_EN               = 1 << 6,
+       IB_QP_CREATE_INTEGRITY_EN               = 1 << 6,
        /* FREE                                 = 1 << 7, */
        IB_QP_CREATE_SCATTER_FCS                = 1 << 8,
        IB_QP_CREATE_CVLAN_STRIPPING            = 1 << 9,
@@ -1343,7 +1233,7 @@ enum ib_wr_opcode {
 
        /* These are kernel only and can not be issued by userspace */
        IB_WR_REG_MR = 0x20,
-       IB_WR_REG_SIG_MR,
+       IB_WR_REG_MR_INTEGRITY,
 
        /* reserve values for low level drivers' internal use.
         * These values will not be used at all in the ib core layer.
@@ -1453,20 +1343,6 @@ static inline const struct ib_reg_wr *reg_wr(const struct ib_send_wr *wr)
        return container_of(wr, struct ib_reg_wr, wr);
 }
 
-struct ib_sig_handover_wr {
-       struct ib_send_wr       wr;
-       struct ib_sig_attrs    *sig_attrs;
-       struct ib_mr           *sig_mr;
-       int                     access_flags;
-       struct ib_sge          *prot;
-};
-
-static inline const struct ib_sig_handover_wr *
-sig_handover_wr(const struct ib_send_wr *wr)
-{
-       return container_of(wr, struct ib_sig_handover_wr, wr);
-}
-
 struct ib_recv_wr {
        struct ib_recv_wr      *next;
        union {
@@ -1634,6 +1510,7 @@ struct ib_cq {
                struct work_struct      work;
        };
        struct workqueue_struct *comp_wq;
+       struct dim *dim;
        /*
         * Implementation details of the RDMA core, don't use in drivers:
         */
@@ -1818,10 +1695,14 @@ struct ib_qp {
        struct ib_qp_security  *qp_sec;
        u8                      port;
 
+       bool                    integrity_en;
        /*
         * Implementation details of the RDMA core, don't use in drivers:
         */
        struct rdma_restrack_entry     res;
+
+       /* The counter the qp is bind to */
+       struct rdma_counter    *counter;
 };
 
 struct ib_dm {
@@ -1840,6 +1721,7 @@ struct ib_mr {
        u64                iova;
        u64                length;
        unsigned int       page_size;
+       enum ib_mr_type    type;
        bool               need_inval;
        union {
                struct ib_uobject       *uobject;       /* user */
@@ -1847,7 +1729,7 @@ struct ib_mr {
        };
 
        struct ib_dm      *dm;
-
+       struct ib_sig_attrs *sig_attrs; /* only for IB_MR_TYPE_INTEGRITY MRs */
        /*
         * Implementation details of the RDMA core, don't use in drivers:
         */
@@ -2243,6 +2125,8 @@ struct ib_port_data {
        spinlock_t netdev_lock;
        struct net_device __rcu *netdev;
        struct hlist_node ndev_hash_link;
+       struct rdma_port_counter port_counter;
+       struct rdma_hw_stats *hw_stats;
 };
 
 /* rdma netdev type - specifies protocol type */
@@ -2329,6 +2213,11 @@ struct iw_cm_conn_param;
  * need to define the supported operations, otherwise they will be set to null.
  */
 struct ib_device_ops {
+       struct module *owner;
+       enum rdma_driver_id driver_id;
+       u32 uverbs_abi_ver;
+       unsigned int uverbs_no_driver_id_binding:1;
+
        int (*post_send)(struct ib_qp *qp, const struct ib_send_wr *send_wr,
                         const struct ib_send_wr **bad_send_wr);
        int (*post_recv)(struct ib_qp *qp, const struct ib_recv_wr *recv_wr,
@@ -2454,11 +2343,10 @@ struct ib_device_ops {
        int (*query_qp)(struct ib_qp *qp, struct ib_qp_attr *qp_attr,
                        int qp_attr_mask, struct ib_qp_init_attr *qp_init_attr);
        int (*destroy_qp)(struct ib_qp *qp, struct ib_udata *udata);
-       struct ib_cq *(*create_cq)(struct ib_device *device,
-                                  const struct ib_cq_init_attr *attr,
-                                  struct ib_udata *udata);
+       int (*create_cq)(struct ib_cq *cq, const struct ib_cq_init_attr *attr,
+                        struct ib_udata *udata);
        int (*modify_cq)(struct ib_cq *cq, u16 cq_count, u16 cq_period);
-       int (*destroy_cq)(struct ib_cq *cq, struct ib_udata *udata);
+       void (*destroy_cq)(struct ib_cq *cq, struct ib_udata *udata);
        int (*resize_cq)(struct ib_cq *cq, int cqe, struct ib_udata *udata);
        struct ib_mr *(*get_dma_mr)(struct ib_pd *pd, int mr_access_flags);
        struct ib_mr *(*reg_user_mr)(struct ib_pd *pd, u64 start, u64 length,
@@ -2470,6 +2358,9 @@ struct ib_device_ops {
        int (*dereg_mr)(struct ib_mr *mr, struct ib_udata *udata);
        struct ib_mr *(*alloc_mr)(struct ib_pd *pd, enum ib_mr_type mr_type,
                                  u32 max_num_sg, struct ib_udata *udata);
+       struct ib_mr *(*alloc_mr_integrity)(struct ib_pd *pd,
+                                           u32 max_num_data_sg,
+                                           u32 max_num_meta_sg);
        int (*advise_mr)(struct ib_pd *pd,
                         enum ib_uverbs_advise_mr_advice advice, u32 flags,
                         struct ib_sge *sg_list, u32 num_sge,
@@ -2516,7 +2407,7 @@ struct ib_device_ops {
        struct ib_wq *(*create_wq)(struct ib_pd *pd,
                                   struct ib_wq_init_attr *init_attr,
                                   struct ib_udata *udata);
-       int (*destroy_wq)(struct ib_wq *wq, struct ib_udata *udata);
+       void (*destroy_wq)(struct ib_wq *wq, struct ib_udata *udata);
        int (*modify_wq)(struct ib_wq *wq, struct ib_wq_attr *attr,
                         u32 wq_attr_mask, struct ib_udata *udata);
        struct ib_rwq_ind_table *(*create_rwq_ind_table)(
@@ -2538,6 +2429,11 @@ struct ib_device_ops {
        int (*read_counters)(struct ib_counters *counters,
                             struct ib_counters_read_attr *counters_read_attr,
                             struct uverbs_attr_bundle *attrs);
+       int (*map_mr_sg_pi)(struct ib_mr *mr, struct scatterlist *data_sg,
+                           int data_sg_nents, unsigned int *data_sg_offset,
+                           struct scatterlist *meta_sg, int meta_sg_nents,
+                           unsigned int *meta_sg_offset);
+
        /**
         * alloc_hw_stats - Allocate a struct rdma_hw_stats and fill in the
         *   driver initialized data.  The struct is kfree()'ed by the sysfs
@@ -2595,8 +2491,34 @@ struct ib_device_ops {
                         u8 pdata_len);
        int (*iw_create_listen)(struct iw_cm_id *cm_id, int backlog);
        int (*iw_destroy_listen)(struct iw_cm_id *cm_id);
+       /**
+        * counter_bind_qp - Bind a QP to a counter.
+        * @counter - The counter to be bound. If counter->id is zero then
+        *   the driver needs to allocate a new counter and set counter->id
+        */
+       int (*counter_bind_qp)(struct rdma_counter *counter, struct ib_qp *qp);
+       /**
+        * counter_unbind_qp - Unbind the qp from the dynamically-allocated
+        *   counter and bind it onto the default one
+        */
+       int (*counter_unbind_qp)(struct ib_qp *qp);
+       /**
+        * counter_dealloc -De-allocate the hw counter
+        */
+       int (*counter_dealloc)(struct rdma_counter *counter);
+       /**
+        * counter_alloc_stats - Allocate a struct rdma_hw_stats and fill in
+        * the driver initialized data.
+        */
+       struct rdma_hw_stats *(*counter_alloc_stats)(
+               struct rdma_counter *counter);
+       /**
+        * counter_update_stats - Query the stats value of this counter
+        */
+       int (*counter_update_stats)(struct rdma_counter *counter);
 
        DECLARE_RDMA_OBJ_SIZE(ib_ah);
+       DECLARE_RDMA_OBJ_SIZE(ib_cq);
        DECLARE_RDMA_OBJ_SIZE(ib_pd);
        DECLARE_RDMA_OBJ_SIZE(ib_srq);
        DECLARE_RDMA_OBJ_SIZE(ib_ucontext);
@@ -2636,7 +2558,6 @@ struct ib_device {
 
        int                           num_comp_vectors;
 
-       struct module               *owner;
        union {
                struct device           dev;
                struct ib_core_device   coredev;
@@ -2648,7 +2569,6 @@ struct ib_device {
         */
        const struct attribute_group    *groups[3];
 
-       int                          uverbs_abi_ver;
        u64                          uverbs_cmd_mask;
        u64                          uverbs_ex_cmd_mask;
 
@@ -2658,6 +2578,8 @@ struct ib_device {
        u16                          is_switch:1;
        /* Indicates kernel verbs support, should not be used in drivers */
        u16                          kverbs_provider:1;
+       /* CQ adaptive moderation (RDMA DIM) */
+       u16                          use_cq_dim:1;
        u8                           node_type;
        u8                           phys_port_cnt;
        struct ib_device_attr        attrs;
@@ -2672,7 +2594,6 @@ struct ib_device {
        struct rdma_restrack_root *res;
 
        const struct uapi_definition   *driver_def;
-       enum rdma_driver_id             driver_id;
 
        /*
         * Positive refcount indicates that the device is currently
@@ -2694,11 +2615,15 @@ struct ib_device {
        u32 iw_driver_flags;
 };
 
+struct ib_client_nl_info;
 struct ib_client {
        const char *name;
        void (*add)   (struct ib_device *);
        void (*remove)(struct ib_device *, void *client_data);
        void (*rename)(struct ib_device *dev, void *client_data);
+       int (*get_nl_info)(struct ib_device *ibdev, void *client_data,
+                          struct ib_client_nl_info *res);
+       int (*get_global_nl_info)(struct ib_client_nl_info *res);
 
        /* Returns the net_dev belonging to this ib_client and matching the
         * given parameters.
@@ -2722,7 +2647,9 @@ struct ib_client {
                        const union ib_gid *gid,
                        const struct sockaddr *addr,
                        void *client_data);
-       struct list_head list;
+
+       refcount_t uses;
+       struct completion uses_zero;
        u32 client_id;
 
        /* kverbs are not required by the client */
@@ -3859,9 +3786,9 @@ int ib_destroy_cq_user(struct ib_cq *cq, struct ib_udata *udata);
  *
  * NOTE: for user cq use ib_destroy_cq_user with valid udata!
  */
-static inline int ib_destroy_cq(struct ib_cq *cq)
+static inline void ib_destroy_cq(struct ib_cq *cq)
 {
-       return ib_destroy_cq_user(cq, NULL);
+       ib_destroy_cq_user(cq, NULL);
 }
 
 /**
@@ -4148,6 +4075,10 @@ static inline struct ib_mr *ib_alloc_mr(struct ib_pd *pd,
        return ib_alloc_mr_user(pd, mr_type, max_num_sg, NULL);
 }
 
+struct ib_mr *ib_alloc_mr_integrity(struct ib_pd *pd,
+                                   u32 max_num_data_sg,
+                                   u32 max_num_meta_sg);
+
 /**
  * ib_update_fast_reg_key - updates the key portion of the fast_reg MR
  *   R_Key and L_Key.
@@ -4332,6 +4263,10 @@ int ib_destroy_rwq_ind_table(struct ib_rwq_ind_table *wq_ind_table);
 
 int ib_map_mr_sg(struct ib_mr *mr, struct scatterlist *sg, int sg_nents,
                 unsigned int *sg_offset, unsigned int page_size);
+int ib_map_mr_sg_pi(struct ib_mr *mr, struct scatterlist *data_sg,
+                   int data_sg_nents, unsigned int *data_sg_offset,
+                   struct scatterlist *meta_sg, int meta_sg_nents,
+                   unsigned int *meta_sg_offset, unsigned int page_size);
 
 static inline int
 ib_map_mr_sg_zbva(struct ib_mr *mr, struct scatterlist *sg, int sg_nents,