From: Yonatan Nachum <ynachum@amazon.com>
To: <jgg@nvidia.com>, <leon@kernel.org>, <linux-rdma@vger.kernel.org>
Cc: <mrgolin@amazon.com>, <sleybo@amazon.com>, <matua@amazon.com>,
<gal.pressman@linux.dev>, Yonatan Nachum <ynachum@amazon.com>
Subject: [PATCH for-next v3 2/3] RDMA/efa: Generalize the admin SQ
Date: Wed, 12 Aug 2026 12:17:17 +0000 [thread overview]
Message-ID: <20260812121718.2904349-3-ynachum@amazon.com> (raw)
In-Reply-To: <20260812121718.2904349-1-ynachum@amazon.com>
As preparation for admin v2 entry size which is 128B, generalize the SQ
ring to use a generic buffer and use the right offset into it using the
configured entry size. This will allow us to choose different entry size
on SQ init with minimal changes.
Reviewed-by: Michael Margolin <mrgolin@amazon.com>
Signed-off-by: Yonatan Nachum <ynachum@amazon.com>
---
drivers/infiniband/hw/efa/efa_com.c | 48 +++++++++++++----------------
drivers/infiniband/hw/efa/efa_com.h | 3 +-
2 files changed, 24 insertions(+), 27 deletions(-)
diff --git a/drivers/infiniband/hw/efa/efa_com.c b/drivers/infiniband/hw/efa/efa_com.c
index 8d8be22b76c8..72b87f8cd086 100644
--- a/drivers/infiniband/hw/efa/efa_com.c
+++ b/drivers/infiniband/hw/efa/efa_com.c
@@ -138,14 +138,13 @@ static int efa_com_admin_init_sq(struct efa_com_dev *edev)
{
struct efa_com_admin_queue *aq = &edev->aq;
struct efa_com_admin_sq *sq = &aq->sq;
- u16 size = aq->depth * sizeof(*sq->entries);
+ u32 addr_high, addr_low;
u32 aq_caps = 0;
- u32 addr_high;
- u32 addr_low;
- sq->entries =
- dma_alloc_coherent(aq->dmadev, size, &sq->dma_addr, GFP_KERNEL);
- if (!sq->entries)
+ sq->entry_size = sizeof(struct efa_admin_aq_entry);
+ sq->buffer = dma_alloc_coherent(aq->dmadev, aq->depth * sq->entry_size,
+ &sq->dma_addr, GFP_KERNEL);
+ if (!sq->buffer)
return -ENOMEM;
spin_lock_init(&sq->lock);
@@ -163,8 +162,7 @@ static int efa_com_admin_init_sq(struct efa_com_dev *edev)
writel(addr_high, edev->reg_bar + EFA_REGS_AQ_BASE_HI_OFF);
EFA_SET(&aq_caps, EFA_REGS_AQ_CAPS_AQ_DEPTH, aq->depth);
- EFA_SET(&aq_caps, EFA_REGS_AQ_CAPS_AQ_ENTRY_SIZE,
- sizeof(struct efa_admin_aq_entry));
+ EFA_SET(&aq_caps, EFA_REGS_AQ_CAPS_AQ_ENTRY_SIZE, sq->entry_size);
writel(aq_caps, edev->reg_bar + EFA_REGS_AQ_CAPS_OFF);
@@ -330,24 +328,22 @@ static void __efa_com_submit_admin_cmd(struct efa_com_admin_queue *aq,
struct efa_admin_acq_entry *comp,
size_t comp_size_in_bytes)
{
- struct efa_admin_aq_entry *aqe;
- u16 queue_size_mask;
- u16 cmd_id;
- u16 ctx_id;
- u16 pi;
+ u16 queue_size_mask, cmd_id, ctx_id, pi;
+ struct efa_com_admin_sq *sq = &aq->sq;
+ u8 *aqe;
queue_size_mask = aq->depth - 1;
- pi = aq->sq.pc & queue_size_mask;
+ pi = sq->pc & queue_size_mask;
ctx_id = efa_com_get_comp_ctx_id(aq, comp_ctx);
/* cmd_id LSBs are the ctx_id and MSBs are entropy bits from pc */
cmd_id = ctx_id & queue_size_mask;
- cmd_id |= aq->sq.pc << ilog2(aq->depth);
+ cmd_id |= sq->pc << ilog2(aq->depth);
cmd_id &= EFA_ADMIN_AQ_COMMON_DESC_COMMAND_ID_MASK;
cmd->aq_common_descriptor.command_id = cmd_id;
EFA_SET(&cmd->aq_common_descriptor.flags,
- EFA_ADMIN_AQ_COMMON_DESC_PHASE, aq->sq.phase);
+ EFA_ADMIN_AQ_COMMON_DESC_PHASE, sq->phase);
comp_ctx->status = EFA_CMD_SUBMITTED;
comp_ctx->comp_size = comp_size_in_bytes;
@@ -357,18 +353,18 @@ static void __efa_com_submit_admin_cmd(struct efa_com_admin_queue *aq,
reinit_completion(&comp_ctx->wait_event);
- aqe = &aq->sq.entries[pi];
- memset(aqe, 0, sizeof(*aqe));
+ aqe = sq->buffer + sq->entry_size * pi;
+ memset(aqe, 0, sq->entry_size);
memcpy(aqe, cmd, cmd_size_in_bytes);
- aq->sq.pc++;
+ sq->pc++;
atomic64_inc(&aq->stats.submitted_cmd);
- if ((aq->sq.pc & queue_size_mask) == 0)
- aq->sq.phase = !aq->sq.phase;
+ if ((sq->pc & queue_size_mask) == 0)
+ sq->phase = !sq->phase;
/* barrier not needed in case of writel */
- writel(aq->sq.pc, aq->sq.db_addr);
+ writel(sq->pc, sq->db_addr);
}
static inline int efa_com_init_comp_ctxt(struct efa_com_admin_queue *aq)
@@ -723,8 +719,8 @@ void efa_com_admin_destroy(struct efa_com_dev *edev)
devm_kfree(edev->dmadev, aq->comp_ctx_pool);
devm_kfree(edev->dmadev, aq->comp_ctx);
- size = aq->depth * sizeof(*sq->entries);
- dma_free_coherent(edev->dmadev, size, sq->entries, sq->dma_addr);
+ size = aq->depth * sq->entry_size;
+ dma_free_coherent(edev->dmadev, size, sq->buffer, sq->dma_addr);
size = aq->depth * sizeof(*cq->entries);
dma_free_coherent(edev->dmadev, size, cq->entries, cq->dma_addr);
@@ -843,8 +839,8 @@ int efa_com_admin_init(struct efa_com_dev *edev,
dma_free_coherent(edev->dmadev, aq->depth * sizeof(*aq->cq.entries),
aq->cq.entries, aq->cq.dma_addr);
err_destroy_sq:
- dma_free_coherent(edev->dmadev, aq->depth * sizeof(*aq->sq.entries),
- aq->sq.entries, aq->sq.dma_addr);
+ dma_free_coherent(edev->dmadev, aq->depth * aq->sq.entry_size,
+ aq->sq.buffer, aq->sq.dma_addr);
err_destroy_comp_ctxt:
devm_kfree(edev->dmadev, aq->comp_ctx);
err_destroy_ah_cache:
diff --git a/drivers/infiniband/hw/efa/efa_com.h b/drivers/infiniband/hw/efa/efa_com.h
index f979e36ec158..069c9dd98328 100644
--- a/drivers/infiniband/hw/efa/efa_com.h
+++ b/drivers/infiniband/hw/efa/efa_com.h
@@ -33,7 +33,8 @@ struct efa_com_admin_cq {
};
struct efa_com_admin_sq {
- struct efa_admin_aq_entry *entries;
+ u8 *buffer;
+ u16 entry_size;
dma_addr_t dma_addr;
spinlock_t lock; /* Protects ASQ */
--
2.50.1
next prev parent reply other threads:[~2026-08-12 12:17 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-12 12:17 [PATCH for-next v3 0/3] RDMA/efa: Add support for 128B admin v2 SQ entry Yonatan Nachum
2026-08-12 12:17 ` [PATCH for-next v3 1/3] RDMA/efa: Decouple admin command payload from admin header Yonatan Nachum
2026-08-12 12:17 ` Yonatan Nachum [this message]
2026-08-12 12:17 ` [PATCH for-next v3 3/3] RDMA/efa: Add support for 128B admin v2 SQ entry Yonatan Nachum
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=20260812121718.2904349-3-ynachum@amazon.com \
--to=ynachum@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=mrgolin@amazon.com \
--cc=sleybo@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox