]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
RDMA/irdma: Restrict Memory Window and CQE Timestamping to GEN3
authorShiraz Saleem <shiraz.saleem@intel.com>
Wed, 27 Aug 2025 15:25:42 +0000 (10:25 -0500)
committerLeon Romanovsky <leon@kernel.org>
Thu, 18 Sep 2025 08:48:46 +0000 (04:48 -0400)
With the deprecation of Memory Window and Timestamping support in GEN2,
move these features to be exclusive to GEN3. This iteration supports
only Type2 Memory Windows. Additionally, it includes the reporting of
the timestamp mask and Host Channel Adapter (HCA) core clock frequency
via the query device verb.

Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com>
Signed-off-by: Tatyana Nikolova <tatyana.e.nikolova@intel.com>
Link: https://patch.msgid.link/20250827152545.2056-14-tatyana.e.nikolova@intel.com
Tested-by: Jacob Moroni <jmoroni@google.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/irdma/verbs.c

index 1134a3546d9145b16ea73bbe228000974fe7f0ab..78f1db759bab040568ddc8c5acb55ccf885ad9de 100644 (file)
@@ -41,7 +41,8 @@ static int irdma_query_device(struct ib_device *ibdev,
        props->max_cq = rf->max_cq - rf->used_cqs;
        props->max_cqe = rf->max_cqe - 1;
        props->max_mr = rf->max_mr - rf->used_mrs;
-       props->max_mw = props->max_mr;
+       if (hw_attrs->uk_attrs.hw_rev >= IRDMA_GEN_3)
+               props->max_mw = props->max_mr;
        props->max_pd = rf->max_pd - rf->used_pds;
        props->max_sge_rd = hw_attrs->uk_attrs.max_hw_read_sges;
        props->max_qp_rd_atom = hw_attrs->max_hw_ird;
@@ -56,12 +57,16 @@ static int irdma_query_device(struct ib_device *ibdev,
        props->max_mcast_qp_attach = IRDMA_MAX_MGS_PER_CTX;
        props->max_total_mcast_qp_attach = rf->max_qp * IRDMA_MAX_MGS_PER_CTX;
        props->max_fast_reg_page_list_len = IRDMA_MAX_PAGES_PER_FMR;
-#define HCA_CLOCK_TIMESTAMP_MASK 0x1ffff
-       if (hw_attrs->uk_attrs.hw_rev >= IRDMA_GEN_2)
-               props->timestamp_mask = HCA_CLOCK_TIMESTAMP_MASK;
        props->max_srq = rf->max_srq - rf->used_srqs;
        props->max_srq_wr = IRDMA_MAX_SRQ_WRS;
        props->max_srq_sge = hw_attrs->uk_attrs.max_hw_wq_frags;
+       if (hw_attrs->uk_attrs.hw_rev >= IRDMA_GEN_3) {
+#define HCA_CORE_CLOCK_KHZ 1000000UL
+               props->timestamp_mask = GENMASK(31, 0);
+               props->hca_core_clock = HCA_CORE_CLOCK_KHZ;
+       }
+       if (hw_attrs->uk_attrs.hw_rev >= IRDMA_GEN_3)
+               props->device_cap_flags |= IB_DEVICE_MEM_WINDOW_TYPE_2B;
 
        return 0;
 }
@@ -798,7 +803,8 @@ static void irdma_roce_fill_and_set_qpctx_info(struct irdma_qp *iwqp,
                roce_info->is_qp1 = true;
        roce_info->rd_en = true;
        roce_info->wr_rdresp_en = true;
-       roce_info->bind_en = true;
+       if (dev->hw_attrs.uk_attrs.hw_rev >= IRDMA_GEN_3)
+               roce_info->bind_en = true;
        roce_info->dcqcn_en = false;
        roce_info->rtomin = 5;
 
@@ -829,7 +835,6 @@ static void irdma_iw_fill_and_set_qpctx_info(struct irdma_qp *iwqp,
        ether_addr_copy(iwarp_info->mac_addr, iwdev->netdev->dev_addr);
        iwarp_info->rd_en = true;
        iwarp_info->wr_rdresp_en = true;
-       iwarp_info->bind_en = true;
        iwarp_info->ecn_en = true;
        iwarp_info->rtomin = 5;
 
@@ -1147,8 +1152,6 @@ static int irdma_get_ib_acc_flags(struct irdma_qp *iwqp)
                }
                if (iwqp->iwarp_info.rd_en)
                        acc_flags |= IB_ACCESS_REMOTE_READ;
-               if (iwqp->iwarp_info.bind_en)
-                       acc_flags |= IB_ACCESS_MW_BIND;
        }
        return acc_flags;
 }
@@ -2433,8 +2436,8 @@ static int irdma_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr)
 
 static inline int cq_validate_flags(u32 flags, u8 hw_rev)
 {
-       /* GEN1 does not support CQ create flags */
-       if (hw_rev == IRDMA_GEN_1)
+       /* GEN1/2 does not support CQ create flags */
+       if (hw_rev <= IRDMA_GEN_2)
                return flags ? -EOPNOTSUPP : 0;
 
        return flags & ~IB_UVERBS_CQ_FLAGS_TIMESTAMP_COMPLETION ? -EOPNOTSUPP : 0;
@@ -2660,8 +2663,9 @@ cq_free_rsrc:
 /**
  * irdma_get_mr_access - get hw MR access permissions from IB access flags
  * @access: IB access flags
+ * @hw_rev: Hardware version
  */
-static inline u16 irdma_get_mr_access(int access)
+static inline u16 irdma_get_mr_access(int access, u8 hw_rev)
 {
        u16 hw_access = 0;
 
@@ -2671,8 +2675,10 @@ static inline u16 irdma_get_mr_access(int access)
                     IRDMA_ACCESS_FLAGS_REMOTEWRITE : 0;
        hw_access |= (access & IB_ACCESS_REMOTE_READ) ?
                     IRDMA_ACCESS_FLAGS_REMOTEREAD : 0;
-       hw_access |= (access & IB_ACCESS_MW_BIND) ?
-                    IRDMA_ACCESS_FLAGS_BIND_WINDOW : 0;
+       if (hw_rev >= IRDMA_GEN_3) {
+               hw_access |= (access & IB_ACCESS_MW_BIND) ?
+                            IRDMA_ACCESS_FLAGS_BIND_WINDOW : 0;
+       }
        hw_access |= (access & IB_ZERO_BASED) ?
                     IRDMA_ACCESS_FLAGS_ZERO_BASED : 0;
        hw_access |= IRDMA_ACCESS_FLAGS_LOCALREAD;
@@ -3242,7 +3248,8 @@ static int irdma_hwreg_mr(struct irdma_device *iwdev, struct irdma_mr *iwmr,
        stag_info->stag_idx = iwmr->stag >> IRDMA_CQPSQ_STAG_IDX_S;
        stag_info->stag_key = (u8)iwmr->stag;
        stag_info->total_len = iwmr->len;
-       stag_info->access_rights = irdma_get_mr_access(access);
+       stag_info->access_rights = irdma_get_mr_access(access,
+                                                      iwdev->rf->sc_dev.hw_attrs.uk_attrs.hw_rev);
        stag_info->pd_id = iwpd->sc_pd.pd_id;
        stag_info->all_memory = pd->flags & IB_PD_UNSAFE_GLOBAL_RKEY;
        if (stag_info->access_rights & IRDMA_ACCESS_FLAGS_ZERO_BASED)
@@ -4036,7 +4043,9 @@ static int irdma_post_send(struct ib_qp *ibqp,
 
                        stag_info.signaled = info.signaled;
                        stag_info.read_fence = info.read_fence;
-                       stag_info.access_rights = irdma_get_mr_access(reg_wr(ib_wr)->access);
+                       stag_info.access_rights =
+                               irdma_get_mr_access(reg_wr(ib_wr)->access,
+                                                   dev->hw_attrs.uk_attrs.hw_rev);
                        stag_info.stag_key = reg_wr(ib_wr)->key & 0xff;
                        stag_info.stag_idx = reg_wr(ib_wr)->key >> 8;
                        stag_info.page_size = reg_wr(ib_wr)->mr->page_size;
@@ -5239,7 +5248,9 @@ static const struct ib_device_ops irdma_gen1_dev_ops = {
 };
 
 static const struct ib_device_ops irdma_gen3_dev_ops = {
+       .alloc_mw = irdma_alloc_mw,
        .create_srq = irdma_create_srq,
+       .dealloc_mw = irdma_dealloc_mw,
        .destroy_srq = irdma_destroy_srq,
        .modify_srq = irdma_modify_srq,
        .post_srq_recv = irdma_post_srq_recv,
@@ -5280,7 +5291,6 @@ static const struct ib_device_ops irdma_dev_ops = {
 
        .alloc_hw_port_stats = irdma_alloc_hw_port_stats,
        .alloc_mr = irdma_alloc_mr,
-       .alloc_mw = irdma_alloc_mw,
        .alloc_pd = irdma_alloc_pd,
        .alloc_ucontext = irdma_alloc_ucontext,
        .create_cq = irdma_create_cq,