From: Adrian Hunter <adrian.hunter@intel.com>
To: alexandre.belloni@bootlin.com
Cc: Frank.Li@nxp.com, linux-i3c@lists.infradead.org,
linux-kernel@vger.kernel.org
Subject: [PATCH V3 15/16] i3c: mipi-i3c-hci: Consolidate DMA ring allocation
Date: Mon, 4 May 2026 14:33:51 +0300 [thread overview]
Message-ID: <20260504113352.38490-16-adrian.hunter@intel.com> (raw)
In-Reply-To: <20260504113352.38490-1-adrian.hunter@intel.com>
dma_alloc_coherent() allocates memory in whole pages, which can waste
space when command and response queues are allocated separately.
Allocate the DMA command and response queues from a single coherent
allocation instead, while preserving the required 4-byte alignment.
This reduces memory overhead without changing behavior.
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
---
Changes in V3:
None
Changes in V2:
Check for failed allocation before assignments to avoid doing
arithmetic with NULL pointers
drivers/i3c/master/mipi-i3c-hci/dma.c | 24 +++++++++++-------------
1 file changed, 11 insertions(+), 13 deletions(-)
diff --git a/drivers/i3c/master/mipi-i3c-hci/dma.c b/drivers/i3c/master/mipi-i3c-hci/dma.c
index 6440302c63ca..4029d4d9e784 100644
--- a/drivers/i3c/master/mipi-i3c-hci/dma.c
+++ b/drivers/i3c/master/mipi-i3c-hci/dma.c
@@ -186,14 +186,12 @@ static void hci_dma_free(void *data)
for (int i = 0; i < rings->total; i++) {
rh = &rings->headers[i];
- if (rh->xfer)
- dma_free_coherent(rings->sysdev,
- rh->xfer_struct_sz * rh->xfer_entries,
- rh->xfer, rh->xfer_dma);
- if (rh->resp)
- dma_free_coherent(rings->sysdev,
- rh->resp_struct_sz * rh->xfer_entries,
- rh->resp, rh->resp_dma);
+ if (rh->xfer) {
+ size_t sz = round_up(rh->xfer_struct_sz * rh->xfer_entries, 4);
+
+ sz += rh->resp_struct_sz * rh->xfer_entries;
+ dma_free_coherent(rings->sysdev, sz, rh->xfer, rh->xfer_dma);
+ }
kfree(rh->src_xfers);
if (rh->ibi_status)
dma_free_coherent(rings->sysdev,
@@ -359,18 +357,18 @@ static int hci_dma_init(struct i3c_hci *hci)
dev_dbg(&hci->master.dev,
"xfer_struct_sz = %d, resp_struct_sz = %d",
rh->xfer_struct_sz, rh->resp_struct_sz);
- xfers_sz = rh->xfer_struct_sz * rh->xfer_entries;
+ xfers_sz = round_up(rh->xfer_struct_sz * rh->xfer_entries, 4);
resps_sz = rh->resp_struct_sz * rh->xfer_entries;
- rh->xfer = dma_alloc_coherent(rings->sysdev, xfers_sz,
+ rh->xfer = dma_alloc_coherent(rings->sysdev, xfers_sz + resps_sz,
&rh->xfer_dma, GFP_KERNEL);
- rh->resp = dma_alloc_coherent(rings->sysdev, resps_sz,
- &rh->resp_dma, GFP_KERNEL);
rh->src_xfers =
kzalloc_objs(*rh->src_xfers, rh->xfer_entries);
ret = -ENOMEM;
- if (!rh->xfer || !rh->resp || !rh->src_xfers)
+ if (!rh->xfer || !rh->src_xfers)
goto err_out;
+ rh->resp = rh->xfer + xfers_sz;
+ rh->resp_dma = rh->xfer_dma + xfers_sz;
/* IBIs */
--
2.51.0
--
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c
next prev parent reply other threads:[~2026-05-04 11:34 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-04 11:33 [PATCH V3 00/16] i3c: mipi-i3c-hci: DMA abort, recovery and related improvements Adrian Hunter
2026-05-04 11:33 ` [PATCH V3 01/16] i3c: mipi-i3c-hci: Fix suspend behavior when bus disable falls back to software reset Adrian Hunter
2026-05-04 11:33 ` [PATCH V3 02/16] i3c: mipi-i3c-hci: Preserve RUN bit when aborting DMA ring Adrian Hunter
2026-05-04 11:33 ` [PATCH V3 03/16] i3c: mipi-i3c-hci: Prevent DMA enqueue while ring is aborting or in error Adrian Hunter
2026-05-04 11:33 ` [PATCH V3 04/16] i3c: mipi-i3c-hci: Wait for DMA ring restart to complete Adrian Hunter
2026-05-04 11:33 ` [PATCH V3 05/16] i3c: mipi-i3c-hci: Move hci_dma_xfer_done() definition Adrian Hunter
2026-05-04 11:33 ` [PATCH V3 06/16] i3c: mipi-i3c-hci: Call hci_dma_xfer_done() from dequeue path Adrian Hunter
2026-05-04 11:33 ` [PATCH V3 07/16] i3c: mipi-i3c-hci: Complete transfer lists immediately on error Adrian Hunter
2026-05-04 11:33 ` [PATCH V3 08/16] i3c: mipi-i3c-hci: Avoid restarting DMA ring after aborting wrong transfer Adrian Hunter
2026-05-04 11:33 ` [PATCH V3 09/16] i3c: mipi-i3c-hci: Add DMA ring abort/reset quirk for Intel controllers Adrian Hunter
2026-05-04 11:33 ` [PATCH V3 10/16] i3c: mipi-i3c-hci: Add DMA ring abort " Adrian Hunter
2026-05-04 11:33 ` [PATCH V3 11/16] i3c: mipi-i3c-hci: Factor out reset-and-restore helper Adrian Hunter
2026-05-04 11:33 ` [PATCH V3 12/16] i3c: mipi-i3c-hci: Add DMA-mode recovery for internal controller errors Adrian Hunter
2026-05-04 11:33 ` [PATCH V3 13/16] i3c: mipi-i3c-hci: Wait for NoOp commands to complete Adrian Hunter
2026-05-04 11:33 ` [PATCH V3 14/16] i3c: mipi-i3c-hci: Base timeouts on actual transfer start time Adrian Hunter
2026-05-04 11:33 ` Adrian Hunter [this message]
2026-05-04 11:33 ` [PATCH V3 16/16] i3c: mipi-i3c-hci: Increase DMA transfer ring size to maximum Adrian Hunter
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=20260504113352.38490-16-adrian.hunter@intel.com \
--to=adrian.hunter@intel.com \
--cc=Frank.Li@nxp.com \
--cc=alexandre.belloni@bootlin.com \
--cc=linux-i3c@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
/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