@@ -154,6 +154,7 @@ struct hns_roce_cq {
unsigned int *set_ci_db;
unsigned int *arm_db;
int arm_sn;
+ unsigned int flags;
};
struct hns_roce_srq {
@@ -56,6 +56,7 @@ struct hns_roce_create_cq_resp {
struct ib_uverbs_create_cq_resp ibv_resp;
__u32 cqn;
__u32 reserved;
+ __u32 cap_flags;
};
struct hns_roce_create_qp {
@@ -476,7 +476,11 @@ static int hns_roce_u_v2_poll_cq(struct ibv_cq *ibvcq, int ne,
if (npolled) {
mmio_ordered_writes_hack();
- hns_roce_v2_update_cq_cons_index(ctx, cq);
+ if (cq->flags & HNS_ROCE_SUPPORT_CQ_RECORD_DB)
+ *cq->set_ci_db = (unsigned short)(cq->cons_index &
+ ((cq->cq_depth << 1) - 1));
+ else
+ hns_roce_v2_update_cq_cons_index(ctx, cq);
}
pthread_spin_unlock(&cq->lock);
@@ -44,6 +44,10 @@ enum {
HNS_ROCE_SUPPORT_RQ_RECORD_DB = 1 << 0,
};
+enum {
+ HNS_ROCE_SUPPORT_CQ_RECORD_DB = 1 << 0,
+};
+
/* V2 REG DEFINITION */
#define ROCEE_VF_DB_CFG0_OFFSET 0x0230
@@ -277,6 +277,16 @@ struct ibv_cq *hns_roce_u_create_cq(struct ibv_context *context, int cqe,
cmd.buf_addr = (uintptr_t) cq->buf.buf;
+ if (to_hr_dev(context->device)->hw_version != HNS_ROCE_HW_VER1) {
+ cq->set_ci_db = hns_roce_alloc_db(to_hr_ctx(context),
+ HNS_ROCE_CQ_TYPE_DB);
+ if (!cq->set_ci_db) {
+ fprintf(stderr, "alloc cq db buffer failed!\n");
+ goto err_buf;
+ }
+ cmd.db_addr = (uintptr_t) cq->set_ci_db;
+ }
+
ret = ibv_cmd_create_cq(context, cqe, channel, comp_vector,
&cq->ibv_cq, &cmd.ibv_cmd, sizeof(cmd),
&resp.ibv_resp, sizeof(resp));
@@ -285,12 +295,10 @@ struct ibv_cq *hns_roce_u_create_cq(struct ibv_context *context, int cqe,
cq->cqn = resp.cqn;
cq->cq_depth = cqe;
+ cq->flags = resp.cap_flags;
if (to_hr_dev(context->device)->hw_version == HNS_ROCE_HW_VER1)
cq->set_ci_db = to_hr_ctx(context)->cq_tptr_base + cq->cqn * 2;
- else
- cq->set_ci_db = to_hr_ctx(context)->uar +
- ROCEE_VF_DB_CFG0_OFFSET;
cq->arm_db = cq->set_ci_db;
cq->arm_sn = 1;
@@ -300,6 +308,11 @@ struct ibv_cq *hns_roce_u_create_cq(struct ibv_context *context, int cqe,
return &cq->ibv_cq;
err_db:
+ if (to_hr_dev(context->device)->hw_version != HNS_ROCE_HW_VER1)
+ hns_roce_free_db(to_hr_ctx(context), cq->set_ci_db,
+ HNS_ROCE_CQ_TYPE_DB);
+
+err_buf:
hns_roce_free_buf(&cq->buf);
err:
@@ -321,6 +334,9 @@ int hns_roce_u_destroy_cq(struct ibv_cq *cq)
if (ret)
return ret;
+ if (to_hr_dev(cq->context->device)->hw_version != HNS_ROCE_HW_VER1)
+ hns_roce_free_db(to_hr_ctx(cq->context),
+ to_hr_cq(cq)->set_ci_db, HNS_ROCE_CQ_TYPE_DB);
hns_roce_free_buf(&to_hr_cq(cq)->buf);
free(to_hr_cq(cq));