From: Michael Margolin <mrgolin@amazon.com>
To: <jgg@nvidia.com>, <leon@kernel.org>, <linux-rdma@vger.kernel.org>
Cc: <sleybo@amazon.com>, <matua@amazon.com>, <gal.pressman@linux.dev>,
"Daniel Kinsbursky" <dkinsb@amazon.com>,
Yonatan Nachum <ynachum@amazon.com>
Subject: [PATCH for-next v2 4/5] RDMA/efa: Update device interface
Date: Thu, 16 Apr 2026 21:23:26 +0000 [thread overview]
Message-ID: <20260416212327.18191-5-mrgolin@amazon.com> (raw)
In-Reply-To: <20260416212327.18191-1-mrgolin@amazon.com>
Align device interface definitions.
Reviewed-by: Daniel Kinsbursky <dkinsb@amazon.com>
Reviewed-by: Yonatan Nachum <ynachum@amazon.com>
Signed-off-by: Michael Margolin <mrgolin@amazon.com>
---
.../infiniband/hw/efa/efa_admin_cmds_defs.h | 185 +++++++++++++++++-
drivers/infiniband/hw/efa/efa_io_defs.h | 62 +++++-
2 files changed, 242 insertions(+), 5 deletions(-)
diff --git a/drivers/infiniband/hw/efa/efa_admin_cmds_defs.h b/drivers/infiniband/hw/efa/efa_admin_cmds_defs.h
index ad34ea5da6b0..2d75edabeefa 100644
--- a/drivers/infiniband/hw/efa/efa_admin_cmds_defs.h
+++ b/drivers/infiniband/hw/efa/efa_admin_cmds_defs.h
@@ -31,7 +31,12 @@ enum efa_admin_aq_opcode {
EFA_ADMIN_CREATE_EQ = 18,
EFA_ADMIN_DESTROY_EQ = 19,
EFA_ADMIN_ALLOC_MR = 20,
- EFA_ADMIN_MAX_OPCODE = 20,
+ EFA_ADMIN_SERVICE = 21,
+ EFA_ADMIN_CREATE_COUNTER = 25,
+ EFA_ADMIN_DESTROY_COUNTER = 26,
+ EFA_ADMIN_ATTACH_COUNTER = 27,
+ EFA_ADMIN_MODIFY_COUNTER = 28,
+ EFA_ADMIN_MAX_OPCODE = 28,
};
enum efa_admin_aq_feature_id {
@@ -725,7 +730,9 @@ struct efa_admin_feature_device_attr_desc {
* on TX queues
* 4 : unsolicited_write_recv - If set, unsolicited
* write with imm. receive is supported
- * 31:5 : reserved - MBZ
+ * 5 : event_counters - If set, event counters are
+ * supported
+ * 31:6 : reserved - MBZ
*/
u32 device_caps;
@@ -814,6 +821,34 @@ struct efa_admin_feature_queue_attr_desc_1 {
struct efa_admin_feature_queue_attr_desc_2 {
/* Maximum size of data that can be sent inline in a Send WQE */
u16 inline_buf_size_ex;
+
+ /* MBZ */
+ u8 reserved[6];
+
+ /*
+ * Supported counter QP events
+ * 0 : send_comp
+ * 1 : send_comp_err
+ * 2 : recv_comp
+ * 3 : recv_comp_err
+ * 4 : read_comp
+ * 5 : read_comp_err
+ * 6 : write_comp
+ * 7 : write_comp_err
+ * 8 : remote_read_comp
+ * 9 : remote_write_comp
+ * 31:10 : reserved - MBZ
+ */
+ u32 supported_counter_qp_events;
+
+ /* Maximum number of counters */
+ u32 max_event_counters;
+
+ /*
+ * Maximum counter value, counter wraps around to 0 after reaching
+ * this value
+ */
+ u64 event_counter_max_val;
};
struct efa_admin_event_queue_attr_desc {
@@ -1092,6 +1127,127 @@ struct efa_admin_host_info {
u32 flags;
};
+struct efa_admin_service_cmd {
+ struct efa_admin_aq_common_desc aq_common_descriptor;
+
+ u8 buffer[60];
+};
+
+struct efa_admin_service_resp {
+ struct efa_admin_acq_common_desc acq_common_desc;
+
+ u8 buffer[56];
+};
+
+/* Create Counter command */
+struct efa_admin_create_counter_cmd {
+ struct efa_admin_aq_common_desc aq_common_descriptor;
+
+ /* UAR number */
+ u16 uar;
+
+ /* MBZ */
+ u16 reserved;
+
+ /* Counter physical address */
+ u64 paddr;
+};
+
+struct efa_admin_create_counter_resp {
+ struct efa_admin_acq_common_desc acq_common_desc;
+
+ /* Counter handle */
+ u32 cntr_handle;
+
+ /* MBZ */
+ u32 reserved;
+};
+
+struct efa_admin_destroy_counter_cmd {
+ struct efa_admin_aq_common_desc aq_common_descriptor;
+
+ /* Counter handle */
+ u32 cntr_handle;
+};
+
+struct efa_admin_destroy_counter_resp {
+ struct efa_admin_acq_common_desc acq_common_desc;
+};
+
+enum efa_admin_counter_attach_type {
+ EFA_ADMIN_COUNTER_ATTACH_QP_EVENTS = 0,
+};
+
+struct efa_admin_counter_attach_qp_events {
+ /* QP handle */
+ u32 qp_handle;
+
+ /*
+ * Bitmask of counter QP events
+ * 0 : send_comp
+ * 1 : send_comp_err
+ * 2 : recv_comp
+ * 3 : recv_comp_err
+ * 4 : read_comp
+ * 5 : read_comp_err
+ * 6 : write_comp
+ * 7 : write_comp_err
+ * 8 : remote_read_comp
+ * 9 : remote_write_comp
+ * 31:10 : reserved - MBZ
+ */
+ u32 events;
+};
+
+struct efa_admin_attach_counter_cmd {
+ struct efa_admin_aq_common_desc aq_common_descriptor;
+
+ /* Counter handle */
+ u32 cntr_handle;
+
+ /* efa_admin_counter_attach_type */
+ u8 attach_type;
+
+ /* MBZ */
+ u8 reserved[3];
+
+ union {
+ struct efa_admin_counter_attach_qp_events qp_events;
+ } u;
+};
+
+struct efa_admin_attach_counter_resp {
+ struct efa_admin_acq_common_desc acq_common_desc;
+};
+
+/* Counter modify operations */
+enum efa_admin_counter_modify_ops {
+ /* Set counter value */
+ EFA_ADMIN_COUNTER_MODIFY_SET = 0,
+ /* Add to counter value */
+ EFA_ADMIN_COUNTER_MODIFY_ADD = 1,
+};
+
+struct efa_admin_modify_counter_cmd {
+ struct efa_admin_aq_common_desc aq_common_descriptor;
+
+ /* Counter handle */
+ u32 cntr_handle;
+
+ /* Counter operation type (efa_admin_counter_modify_ops) */
+ u8 operation;
+
+ /* MBZ */
+ u8 reserved[7];
+
+ /* Value for SET or ADD */
+ u64 value;
+};
+
+struct efa_admin_modify_counter_resp {
+ struct efa_admin_acq_common_desc acq_common_desc;
+};
+
/* create_qp_cmd */
#define EFA_ADMIN_CREATE_QP_CMD_SQ_VIRT_MASK BIT(0)
#define EFA_ADMIN_CREATE_QP_CMD_RQ_VIRT_MASK BIT(1)
@@ -1132,6 +1288,19 @@ struct efa_admin_host_info {
#define EFA_ADMIN_FEATURE_DEVICE_ATTR_DESC_DATA_POLLING_128_MASK BIT(2)
#define EFA_ADMIN_FEATURE_DEVICE_ATTR_DESC_RDMA_WRITE_MASK BIT(3)
#define EFA_ADMIN_FEATURE_DEVICE_ATTR_DESC_UNSOLICITED_WRITE_RECV_MASK BIT(4)
+#define EFA_ADMIN_FEATURE_DEVICE_ATTR_DESC_EVENT_COUNTERS_MASK BIT(5)
+
+/* feature_queue_attr_desc_2 */
+#define EFA_ADMIN_FEATURE_QUEUE_ATTR_DESC_2_SEND_COMP_MASK BIT(0)
+#define EFA_ADMIN_FEATURE_QUEUE_ATTR_DESC_2_SEND_COMP_ERR_MASK BIT(1)
+#define EFA_ADMIN_FEATURE_QUEUE_ATTR_DESC_2_RECV_COMP_MASK BIT(2)
+#define EFA_ADMIN_FEATURE_QUEUE_ATTR_DESC_2_RECV_COMP_ERR_MASK BIT(3)
+#define EFA_ADMIN_FEATURE_QUEUE_ATTR_DESC_2_READ_COMP_MASK BIT(4)
+#define EFA_ADMIN_FEATURE_QUEUE_ATTR_DESC_2_READ_COMP_ERR_MASK BIT(5)
+#define EFA_ADMIN_FEATURE_QUEUE_ATTR_DESC_2_WRITE_COMP_MASK BIT(6)
+#define EFA_ADMIN_FEATURE_QUEUE_ATTR_DESC_2_WRITE_COMP_ERR_MASK BIT(7)
+#define EFA_ADMIN_FEATURE_QUEUE_ATTR_DESC_2_REMOTE_READ_COMP_MASK BIT(8)
+#define EFA_ADMIN_FEATURE_QUEUE_ATTR_DESC_2_REMOTE_WRITE_COMP_MASK BIT(9)
/* create_eq_cmd */
#define EFA_ADMIN_CREATE_EQ_CMD_ENTRY_SIZE_WORDS_MASK GENMASK(4, 0)
@@ -1150,4 +1319,16 @@ struct efa_admin_host_info {
#define EFA_ADMIN_HOST_INFO_INTREE_MASK BIT(0)
#define EFA_ADMIN_HOST_INFO_GDR_MASK BIT(1)
+/* counter_attach_qp_events */
+#define EFA_ADMIN_COUNTER_ATTACH_QP_EVENTS_SEND_COMP_MASK BIT(0)
+#define EFA_ADMIN_COUNTER_ATTACH_QP_EVENTS_SEND_COMP_ERR_MASK BIT(1)
+#define EFA_ADMIN_COUNTER_ATTACH_QP_EVENTS_RECV_COMP_MASK BIT(2)
+#define EFA_ADMIN_COUNTER_ATTACH_QP_EVENTS_RECV_COMP_ERR_MASK BIT(3)
+#define EFA_ADMIN_COUNTER_ATTACH_QP_EVENTS_READ_COMP_MASK BIT(4)
+#define EFA_ADMIN_COUNTER_ATTACH_QP_EVENTS_READ_COMP_ERR_MASK BIT(5)
+#define EFA_ADMIN_COUNTER_ATTACH_QP_EVENTS_WRITE_COMP_MASK BIT(6)
+#define EFA_ADMIN_COUNTER_ATTACH_QP_EVENTS_WRITE_COMP_ERR_MASK BIT(7)
+#define EFA_ADMIN_COUNTER_ATTACH_QP_EVENTS_REMOTE_READ_COMP_MASK BIT(8)
+#define EFA_ADMIN_COUNTER_ATTACH_QP_EVENTS_REMOTE_WRITE_COMP_MASK BIT(9)
+
#endif /* _EFA_ADMIN_CMDS_H_ */
diff --git a/drivers/infiniband/hw/efa/efa_io_defs.h b/drivers/infiniband/hw/efa/efa_io_defs.h
index a4c9fd33da38..874698e19647 100644
--- a/drivers/infiniband/hw/efa/efa_io_defs.h
+++ b/drivers/infiniband/hw/efa/efa_io_defs.h
@@ -9,6 +9,7 @@
#define EFA_IO_TX_DESC_NUM_BUFS 2
#define EFA_IO_TX_DESC_NUM_RDMA_BUFS 1
#define EFA_IO_TX_DESC_INLINE_MAX_SIZE 32
+#define EFA_IO_TX_DESC_INLINE_MAX_SIZE_128 80
#define EFA_IO_TX_DESC_IMM_DATA_SIZE 4
#define EFA_IO_TX_DESC_INLINE_PBL_SIZE 1
@@ -65,6 +66,8 @@ enum efa_io_comp_status {
EFA_IO_COMP_STATUS_REMOTE_ERROR_UNKNOWN_PEER = 14,
/* Unreachable remote - never received a response */
EFA_IO_COMP_STATUS_LOCAL_ERROR_UNREACH_REMOTE = 15,
+ /* Remote feature mismatch */
+ EFA_IO_COMP_STATUS_REMOTE_ERROR_FEATURE_MISMATCH = 18,
};
enum efa_io_frwr_pbl_mode {
@@ -72,6 +75,13 @@ enum efa_io_frwr_pbl_mode {
EFA_IO_FRWR_DIRECT_PBL = 1,
};
+enum efa_io_processing_hint {
+ /* Default value */
+ EFA_IO_PROCESSING_HINT_NONE = 0,
+ /* Optimize for throughput */
+ EFA_IO_PROCESSING_HINT_BURST_PPS_SENSITIVE = 1,
+};
+
struct efa_io_tx_meta_desc {
/* Verbs-generated Request ID */
u16 req_id;
@@ -121,7 +131,14 @@ struct efa_io_tx_meta_desc {
u16 ah;
- u16 reserved;
+ /*
+ * control flags
+ * 1:0 : processing_hint - enum efa_io_processing_hint
+ * 7:2 : reserved - MBZ
+ */
+ u8 ctrl3;
+
+ u8 reserved;
/* Queue key */
u32 qkey;
@@ -172,6 +189,19 @@ struct efa_io_rdma_req {
struct efa_io_tx_buf_desc local_mem[1];
};
+struct efa_io_rdma_req_128 {
+ /* Remote memory address */
+ struct efa_io_remote_mem_addr remote_mem;
+
+ union {
+ /* Local memory address */
+ struct efa_io_tx_buf_desc local_mem[1];
+
+ /* inline data for RDMA */
+ u8 inline_data[80];
+ };
+};
+
struct efa_io_fast_mr_reg_req {
/* Updated local key of the MR after lkey/rkey increment */
u32 lkey;
@@ -230,8 +260,8 @@ struct efa_io_fast_mr_inv_req {
};
/*
- * Tx WQE, composed of tx meta descriptors followed by either tx buffer
- * descriptors or inline data
+ * 64-byte Tx WQE, composed of tx meta descriptors followed by either tx
+ * buffer descriptors or inline data
*/
struct efa_io_tx_wqe {
/* TX meta */
@@ -254,6 +284,31 @@ struct efa_io_tx_wqe {
} data;
};
+/*
+ * 128-byte Tx WQE, composed of tx meta descriptors followed by either tx
+ * buffer descriptors or inline data
+ */
+struct efa_io_tx_wqe_128 {
+ /* TX meta */
+ struct efa_io_tx_meta_desc meta;
+
+ union {
+ /* Send buffer descriptors */
+ struct efa_io_tx_buf_desc sgl[2];
+
+ u8 inline_data[80];
+
+ /* RDMA local and remote memory addresses */
+ struct efa_io_rdma_req_128 rdma_req;
+
+ /* Fast registration */
+ struct efa_io_fast_mr_reg_req reg_mr_req;
+
+ /* Fast invalidation */
+ struct efa_io_fast_mr_inv_req inv_mr_req;
+ } data;
+};
+
/*
* Rx buffer descriptor; RX WQE is composed of one or more RX buffer
* descriptors.
@@ -365,6 +420,7 @@ struct efa_io_rx_cdesc_ex {
#define EFA_IO_TX_META_DESC_FIRST_MASK BIT(2)
#define EFA_IO_TX_META_DESC_LAST_MASK BIT(3)
#define EFA_IO_TX_META_DESC_COMP_REQ_MASK BIT(4)
+#define EFA_IO_TX_META_DESC_PROCESSING_HINT_MASK GENMASK(1, 0)
/* tx_buf_desc */
#define EFA_IO_TX_BUF_DESC_LKEY_MASK GENMASK(23, 0)
--
2.47.3
next prev parent reply other threads:[~2026-04-16 21:23 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-16 21:23 [PATCH for-next v2 0/5] Introduce Completion Counters Michael Margolin
2026-04-16 21:23 ` [PATCH for-next v2 1/5] RDMA/core: Add Completion Counters support Michael Margolin
2026-04-30 0:50 ` Doug Ledford
2026-04-30 1:49 ` Jason Gunthorpe
2026-04-30 15:38 ` Doug Ledford
2026-04-30 12:18 ` Michael Margolin
2026-04-30 19:09 ` Doug Ledford
2026-04-30 22:33 ` Sean Hefty
2026-05-04 12:51 ` Michael Margolin
2026-05-04 15:37 ` Sean Hefty
2026-04-16 21:23 ` [PATCH for-next v2 2/5] RDMA/core: Prevent destroying in-use completion counters Michael Margolin
2026-04-16 21:23 ` [PATCH for-next v2 3/5] RDMA/core: Add Completion Counters to resource tracking Michael Margolin
2026-04-16 21:23 ` Michael Margolin [this message]
2026-04-28 22:36 ` [PATCH for-next v2 0/5] Introduce Completion Counters Doug Ledford
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260416212327.18191-5-mrgolin@amazon.com \
--to=mrgolin@amazon.com \
--cc=dkinsb@amazon.com \
--cc=gal.pressman@linux.dev \
--cc=jgg@nvidia.com \
--cc=leon@kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=matua@amazon.com \
--cc=sleybo@amazon.com \
--cc=ynachum@amazon.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.