efa: Expose 64-bit request ID capability in query QP DV

Expose the capability to post WRs with 64-bit request IDs directly
without translation on query QP DV.

Signed-off-by: Yonatan Nachum <ynachum@amazon.com>
diff --git a/providers/efa/efadv.h b/providers/efa/efadv.h
index d863de4..4b28d1c 100644
--- a/providers/efa/efadv.h
+++ b/providers/efa/efadv.h
@@ -106,6 +106,10 @@
 				  struct efadv_qp_init_attr *efa_attr,
 				  uint32_t inlen);
 
+enum {
+	EFADV_WQ_CAPS_64_BIT_REQ_ID = 1 << 0,
+};
+
 struct efadv_wq_attr {
 	uint64_t comp_mask;
 	uint8_t *buffer;
@@ -113,7 +117,8 @@
 	uint32_t num_entries;
 	uint32_t *doorbell;
 	uint32_t max_batch;
-	uint8_t reserved[4];
+	uint16_t caps;
+	uint8_t reserved[2];
 };
 
 int efadv_query_qp_wqs(struct ibv_qp *ibvqp, struct efadv_wq_attr *sq_attr,
diff --git a/providers/efa/man/efadv_query_qp_wqs.3.md b/providers/efa/man/efadv_query_qp_wqs.3.md
index 8a824a0..c975052 100644
--- a/providers/efa/man/efadv_query_qp_wqs.3.md
+++ b/providers/efa/man/efadv_query_qp_wqs.3.md
@@ -35,7 +35,8 @@
 	uint32_t num_entries;
 	uint32_t *doorbell;
 	uint32_t max_batch;
-	uint8_t reserved[4];
+	uint16_t caps;
+	uint8_t reserved[2];
 };
 ```
 
@@ -60,6 +61,14 @@
 *max_batch*
 :	Maximum batch size for queue submissions.
 
+*caps*
+:	Work queue capabilities:
+
+	EFADV_WQ_CAPS_64_BIT_REQ_ID
+		Work queue supports posting requests with 64-bit IDs.
+		When set, the associated completion queue is guaranteed
+		to return 64-bit request IDs as well.
+
 # RETURN VALUE
 
 **efadv_query_qp_wqs()** returns 0 on success, or the value of errno on failure
diff --git a/providers/efa/verbs.c b/providers/efa/verbs.c
index e21df3a..25981f5 100644
--- a/providers/efa/verbs.c
+++ b/providers/efa/verbs.c
@@ -2426,6 +2426,12 @@
 	sq_attr->num_entries = qp->sq.wq.wqe_cnt;
 	sq_attr->doorbell = qp->sq.wq.db;
 	sq_attr->max_batch = qp->sq.max_batch_wr;
+	if (vext_field_avail(typeof(*sq_attr), reserved, inlen)) {
+		sq_attr->caps = 0;
+		memset(sq_attr->reserved, 0, sizeof(sq_attr->reserved));
+		if (qp->sq.wq.req_id_64_bit)
+			sq_attr->caps |= EFADV_WQ_CAPS_64_BIT_REQ_ID;
+	}
 
 	rq_attr->comp_mask = 0;
 	rq_attr->buffer = qp->rq.buf;
@@ -2433,6 +2439,10 @@
 	rq_attr->num_entries = qp->rq.wq.desc_mask + 1;
 	rq_attr->doorbell = qp->rq.wq.db;
 	rq_attr->max_batch = rq_attr->num_entries;
+	if (vext_field_avail(typeof(*rq_attr), reserved, inlen)) {
+		memset(rq_attr->reserved, 0, sizeof(rq_attr->reserved));
+		rq_attr->caps = 0;
+	}
 
 	return 0;
 }