ctxm->max_entries = le32_to_cpu(resp->qp_max_entries);
                ctxm->qp_qp1_entries = le16_to_cpu(resp->qp_min_qp1_entries);
                ctxm->qp_l2_entries = le16_to_cpu(resp->qp_max_l2_entries);
+               ctxm->qp_fast_qpmd_entries = le16_to_cpu(resp->fast_qpmd_qp_num_entries);
                ctxm->entry_size = le16_to_cpu(resp->qp_entry_size);
                bnxt_init_ctx_initializer(ctxm, init_val, resp->qp_init_offset,
                                          (init_mask & (1 << init_idx++)) != 0);
                bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem,
                                      &req->qpc_pg_size_qpc_lvl,
                                      &req->qpc_page_dir);
+
+               if (enables & FUNC_BACKING_STORE_CFG_REQ_ENABLES_QP_FAST_QPMD)
+                       req->qp_num_fast_qpmd_entries = cpu_to_le16(ctxm->qp_fast_qpmd_entries);
        }
        if (enables & FUNC_BACKING_STORE_CFG_REQ_ENABLES_SRQ) {
                ctxm = &ctx->ctx_arr[BNXT_CTX_SRQ];
        u32 num_mr, num_ah;
        u32 extra_srqs = 0;
        u32 extra_qps = 0;
+       u32 fast_qpmd_qps;
        u8 pg_lvl = 1;
        int i, rc;
 
        ctxm = &ctx->ctx_arr[BNXT_CTX_QP];
        l2_qps = ctxm->qp_l2_entries;
        qp1_qps = ctxm->qp_qp1_entries;
+       fast_qpmd_qps = ctxm->qp_fast_qpmd_entries;
        max_qps = ctxm->max_entries;
        ctxm = &ctx->ctx_arr[BNXT_CTX_SRQ];
        srqs = ctxm->srq_l2_entries;
        max_srqs = ctxm->max_entries;
+       ena = 0;
        if ((bp->flags & BNXT_FLAG_ROCE_CAP) && !is_kdump_kernel()) {
                pg_lvl = 2;
                extra_qps = min_t(u32, 65536, max_qps - l2_qps - qp1_qps);
+               /* allocate extra qps if fw supports RoCE fast qp destroy feature */
+               extra_qps += fast_qpmd_qps;
                extra_srqs = min_t(u32, 8192, max_srqs - srqs);
+               if (fast_qpmd_qps)
+                       ena |= FUNC_BACKING_STORE_CFG_REQ_ENABLES_QP_FAST_QPMD;
        }
 
        ctxm = &ctx->ctx_arr[BNXT_CTX_QP];
        if (rc)
                return rc;
 
-       ena = 0;
        if (!(bp->flags & BNXT_FLAG_ROCE_CAP))
                goto skip_rdma;
 
        rc = bnxt_setup_ctxm_pg_tbls(bp, ctxm, num_mr + num_ah, 2);
        if (rc)
                return rc;
-       ena = FUNC_BACKING_STORE_CFG_REQ_ENABLES_MRAV;
+       ena |= FUNC_BACKING_STORE_CFG_REQ_ENABLES_MRAV;
 
        ctxm = &ctx->ctx_arr[BNXT_CTX_TIM];
        rc = bnxt_setup_ctxm_pg_tbls(bp, ctxm, l2_qps + qp1_qps + extra_qps, 1);