Merge tag 'driver-core-5.5-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / drivers / infiniband / hw / mlx5 / mlx5_ib.h
index 55ce599db803dcdc77058db5d82f85e6d3a10614..03af54b53bf71401a556a941db644468c7823582 100644 (file)
@@ -247,12 +247,8 @@ struct mlx5_ib_flow_db {
  * These flags are intended for internal use by the mlx5_ib driver, and they
  * rely on the range reserved for that use in the ib_qp_create_flags enum.
  */
-
-/* Create a UD QP whose source QP number is 1 */
-static inline enum ib_qp_create_flags mlx5_ib_create_qp_sqpn_qp1(void)
-{
-       return IB_QP_CREATE_RESERVED_START;
-}
+#define MLX5_IB_QP_CREATE_SQPN_QP1     IB_QP_CREATE_RESERVED_START
+#define MLX5_IB_QP_CREATE_WC_TEST      (IB_QP_CREATE_RESERVED_START << 1)
 
 struct wr_list {
        u16     opcode;
@@ -295,6 +291,7 @@ enum mlx5_ib_wq_flags {
 #define MLX5_MAX_SINGLE_WQE_LOG_NUM_STRIDES 16
 #define MLX5_MIN_SINGLE_STRIDE_LOG_NUM_BYTES 6
 #define MLX5_MAX_SINGLE_STRIDE_LOG_NUM_BYTES 13
+#define MLX5_EXT_MIN_SINGLE_WQE_LOG_NUM_STRIDES 3
 
 struct mlx5_ib_rwq {
        struct ib_wq            ibwq;
@@ -585,6 +582,9 @@ struct mlx5_ib_dm {
                                          IB_ACCESS_REMOTE_READ   |\
                                          IB_ZERO_BASED)
 
+#define mlx5_update_odp_stats(mr, counter_name, value)         \
+       atomic64_add(value, &((mr)->odp_stats.counter_name))
+
 struct mlx5_ib_mr {
        struct ib_mr            ibmr;
        void                    *descs;
@@ -606,7 +606,6 @@ struct mlx5_ib_mr {
        struct mlx5_ib_dev     *dev;
        u32 out[MLX5_ST_SZ_DW(create_mkey_out)];
        struct mlx5_core_sig_ctx    *sig;
-       unsigned int            live;
        void                    *descs_alloc;
        int                     access_flags; /* Needed for rereg MR */
 
@@ -618,10 +617,18 @@ struct mlx5_ib_mr {
        u64                     data_iova;
        u64                     pi_iova;
 
-       atomic_t                num_leaf_free;
-       wait_queue_head_t       q_leaf_free;
+       /* For ODP and implicit */
+       atomic_t                num_deferred_work;
+       struct xarray           implicit_children;
+       union {
+               struct rcu_head rcu;
+               struct list_head elm;
+               struct work_struct work;
+       } odp_destroy;
+       struct ib_odp_counters  odp_stats;
+       bool                    is_odp_implicit;
+
        struct mlx5_async_work  cb_work;
-       atomic_t                num_pending_prefetch;
 };
 
 static inline bool is_odp_mr(struct mlx5_ib_mr *mr)
@@ -950,7 +957,11 @@ struct mlx5_ib_dev {
        /* serialize update of capability mask
         */
        struct mutex                    cap_mask_mutex;
-       bool                            ib_active;
+       u8                              ib_active:1;
+       u8                              fill_delay:1;
+       u8                              is_rep:1;
+       u8                              lag_active:1;
+       u8                              wc_support:1;
        struct umr_common               umrc;
        /* sync used page count stats
         */
@@ -959,7 +970,6 @@ struct mlx5_ib_dev {
        struct timer_list               delay_timer;
        /* Prevents soft lock on massive reg MRs */
        struct mutex                    slow_path_mutex;
-       int                             fill_delay;
        struct ib_odp_caps      odp_caps;
        u64                     odp_max_size;
        struct mlx5_ib_pf_eq    odp_pf_eq;
@@ -968,7 +978,9 @@ struct mlx5_ib_dev {
         * Sleepable RCU that prevents destruction of MRs while they are still
         * being used by a page fault handler.
         */
-       struct srcu_struct      mr_srcu;
+       struct srcu_struct      odp_srcu;
+       struct xarray           odp_mkeys;
+
        u32                     null_mkey;
        struct mlx5_ib_flow_db  *flow_db;
        /* protect resources needed as part of reset flow */
@@ -977,11 +989,10 @@ struct mlx5_ib_dev {
        /* Array with num_ports elements */
        struct mlx5_ib_port     *port;
        struct mlx5_sq_bfreg    bfreg;
+       struct mlx5_sq_bfreg    wc_bfreg;
        struct mlx5_sq_bfreg    fp_bfreg;
        struct mlx5_ib_delay_drop       delay_drop;
        const struct mlx5_ib_profile    *profile;
-       bool                    is_rep;
-       int                             lag_active;
 
        struct mlx5_ib_lb_state         lb;
        u8                      umr_fence;
@@ -992,6 +1003,8 @@ struct mlx5_ib_dev {
        struct mlx5_srq_table   srq_table;
        struct mlx5_async_ctx   async_ctx;
        struct mlx5_devx_event_table devx_event_table;
+
+       struct xarray sig_mrs;
 };
 
 static inline struct mlx5_ib_cq *to_mibcq(struct mlx5_core_cq *mcq)
@@ -1155,6 +1168,7 @@ struct mlx5_ib_mr *mlx5_ib_alloc_implicit_mr(struct mlx5_ib_pd *pd,
                                             struct ib_udata *udata,
                                             int access_flags);
 void mlx5_ib_free_implicit_mr(struct mlx5_ib_mr *mr);
+void mlx5_ib_fence_odp_mr(struct mlx5_ib_mr *mr);
 int mlx5_ib_rereg_user_mr(struct ib_mr *ib_mr, int flags, u64 start,
                          u64 length, u64 virt_addr, int access_flags,
                          struct ib_pd *pd, struct ib_udata *udata);
@@ -1172,9 +1186,8 @@ int mlx5_ib_map_mr_sg_pi(struct ib_mr *ibmr, struct scatterlist *data_sg,
                         unsigned int *meta_sg_offset);
 int mlx5_ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
                        const struct ib_wc *in_wc, const struct ib_grh *in_grh,
-                       const struct ib_mad_hdr *in, size_t in_mad_size,
-                       struct ib_mad_hdr *out, size_t *out_mad_size,
-                       u16 *out_mad_pkey_index);
+                       const struct ib_mad *in, struct ib_mad *out,
+                       size_t *out_mad_size, u16 *out_mad_pkey_index);
 struct ib_xrcd *mlx5_ib_alloc_xrcd(struct ib_device *ibdev,
                                   struct ib_udata *udata);
 int mlx5_ib_dealloc_xrcd(struct ib_xrcd *xrcd, struct ib_udata *udata);
@@ -1216,6 +1229,8 @@ int mlx5_mr_cache_cleanup(struct mlx5_ib_dev *dev);
 
 struct mlx5_ib_mr *mlx5_mr_cache_alloc(struct mlx5_ib_dev *dev, int entry);
 void mlx5_mr_cache_free(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr);
+int mlx5_mr_cache_invalidate(struct mlx5_ib_mr *mr);
+
 int mlx5_ib_check_mr_status(struct ib_mr *ibmr, u32 check_mask,
                            struct ib_mr_status *mr_status);
 struct ib_wq *mlx5_ib_create_wq(struct ib_pd *pd,
@@ -1228,7 +1243,6 @@ struct ib_rwq_ind_table *mlx5_ib_create_rwq_ind_table(struct ib_device *device,
                                                      struct ib_rwq_ind_table_init_attr *init_attr,
                                                      struct ib_udata *udata);
 int mlx5_ib_destroy_rwq_ind_table(struct ib_rwq_ind_table *wq_ind_table);
-bool mlx5_ib_dc_atomic_is_supported(struct mlx5_ib_dev *dev);
 struct ib_dm *mlx5_ib_alloc_dm(struct ib_device *ibdev,
                               struct ib_ucontext *context,
                               struct ib_dm_alloc_attr *attr,
@@ -1293,6 +1307,9 @@ int mlx5_ib_set_vf_link_state(struct ib_device *device, int vf,
                              u8 port, int state);
 int mlx5_ib_get_vf_stats(struct ib_device *device, int vf,
                         u8 port, struct ifla_vf_stats *stats);
+int mlx5_ib_get_vf_guid(struct ib_device *device, int vf, u8 port,
+                       struct ifla_vf_guid *node_guid,
+                       struct ifla_vf_guid *port_guid);
 int mlx5_ib_set_vf_guid(struct ib_device *device, int vf, u8 port,
                        u64 guid, int type);
 
@@ -1327,6 +1344,10 @@ struct mlx5_core_dev *mlx5_ib_get_native_port_mdev(struct mlx5_ib_dev *dev,
                                                   u8 *native_port_num);
 void mlx5_ib_put_native_port_mdev(struct mlx5_ib_dev *dev,
                                  u8 port_num);
+int mlx5_ib_fill_res_entry(struct sk_buff *msg,
+                          struct rdma_restrack_entry *res);
+int mlx5_ib_fill_stat_entry(struct sk_buff *msg,
+                           struct rdma_restrack_entry *res);
 
 #if IS_ENABLED(CONFIG_INFINIBAND_USER_ACCESS)
 int mlx5_ib_devx_create(struct mlx5_ib_dev *dev, bool is_user);
@@ -1342,7 +1363,7 @@ struct mlx5_ib_flow_handler *mlx5_ib_raw_fs_rule_add(
        struct mlx5_flow_act *flow_act, u32 counter_id,
        void *cmd_in, int inlen, int dest_id, int dest_type);
 bool mlx5_ib_devx_is_flow_dest(void *obj, int *dest_id, int *dest_type);
-bool mlx5_ib_devx_is_flow_counter(void *obj, u32 *counter_id);
+bool mlx5_ib_devx_is_flow_counter(void *obj, u32 offset, u32 *counter_id);
 int mlx5_ib_get_flow_trees(const struct uverbs_object_tree_def **root);
 void mlx5_ib_destroy_flow_action_raw(struct mlx5_ib_flow_action *maction);
 #else
@@ -1484,4 +1505,7 @@ static inline bool mlx5_ib_can_use_umr(struct mlx5_ib_dev *dev,
 
        return true;
 }
+
+int mlx5_ib_enable_driver(struct ib_device *dev);
+int mlx5_ib_test_wc(struct mlx5_ib_dev *dev);
 #endif /* MLX5_IB_H */