From: Claudiu Beznea <claudiu.beznea@kernel.org>
To: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>,
vkoul@kernel.org, Frank.Li@kernel.org, lgirdwood@gmail.com,
broonie@kernel.org, perex@perex.cz, tiwai@suse.com,
biju.das.jz@bp.renesas.com,
prabhakar.mahadev-lad.rj@bp.renesas.com, p.zabel@pengutronix.de,
geert+renesas@glider.be, fabrizio.castro.jz@renesas.com,
kuninori.morimoto.gx@renesas.com, long.luu.ur@renesas.com
Cc: dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-sound@vger.kernel.org, linux-renesas-soc@vger.kernel.org
Subject: sashiko review (Re: [PATCH v5 12/17] dmaengine: sh: rz-dmac: Add cyclic DMA support)
Date: Mon, 25 May 2026 10:28:57 +0300 [thread overview]
Message-ID: <f559ed50-6cde-415f-a9c2-a73387d67ebd@kernel.org> (raw)
In-Reply-To: <20260512121219.216159-13-claudiu.beznea.uj@bp.renesas.com>
>commit 206116040d966fa7859b2dc81e454bdbed7acd43
>Author: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
> dmaengine: sh: rz-dmac: Add cyclic DMA support
>This commit adds cyclic DMA support to the RZ DMAC driver. A per-channel
>status bit is introduced to mark cyclic channels and is set during the DMA
>prepare callback.
>> diff --git a/drivers/dma/sh/rz-dmac.c b/drivers/dma/sh/rz-dmac.c
>> index 2de519b581b60..d6ad070be705c 100644
>> --- a/drivers/dma/sh/rz-dmac.c
>> +++ b/drivers/dma/sh/rz-dmac.c
>[ ... ]
>> @@ -431,6 +435,57 @@ static void rz_dmac_prepare_descs_for_slave_sg(struct
rz_dmac_chan *channel)
>> channel->chctrl = 0;
>> }
>>
>> +static void rz_dmac_prepare_descs_for_cyclic(struct rz_dmac_chan *channel)
>> +{
>> + struct dma_chan *chan = &channel->vc.chan;
>> + struct rz_dmac *dmac = to_rz_dmac(chan->device);
>> + struct rz_dmac_desc *d = channel->desc;
>> + size_t period_len = d->sgcount;
>> + struct rz_lmdesc *lmdesc;
>> + size_t buf_len = d->len;
>> + size_t periods = buf_len / period_len;
>> +
>> + lockdep_assert_held(&channel->vc.lock);
>> +
>> + channel->chcfg |= CHCFG_SEL(channel->index) | CHCFG_DMS;
>Are stale hardware configuration fields leaking from previous transfers here?
>If a channel was previously used for a memory-to-memory transfer,
>channel->chctrl might retain the CHCTRL_STG (Software Trigger Generation) bit.
>If it was used for slave_sg, channel->chcfg might retain the CHCFG_DEM
>(Descriptor End Mask) bit.
>Because channel->chcfg is modified via OR-assignment and channel->chctrl
>is not initialized to 0, could the stale CHCTRL_STG bit cause the peripheral
>transfer to continuously trigger via software rather than synchronizing with
>the hardware DREQ signal? Additionally, could a stale CHCFG_DEM bit mask
>every period interrupt and prevent vchan_cyclic_callback() from being invoked?
It is expected the channel to be released before changing its mode (cyclic, sg,
mem-to-mem) and requested again. When the channel is requested the
channel->chcfg is properly reinitialized in rz_dmac_chan_filter() with the
device tree data.
>[ ... ]
>> @@ -586,6 +645,55 @@ rz_dmac_prep_slave_sg(struct dma_chan *chan, struct
scatterlist *sgl,
>> return vchan_tx_prep(&channel->vc, &desc->vd, flags);
>> }
>>
>> +static struct dma_async_tx_descriptor *
>> +rz_dmac_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t buf_addr,
>> + size_t buf_len, size_t period_len,
>> + enum dma_transfer_direction direction,
>> + unsigned long flags)
>> +{
>> + struct rz_dmac_chan *channel = to_rz_dmac_chan(chan);
>> + struct rz_dmac_desc *desc;
>> + size_t periods;
>> +
>> + if (!is_slave_direction(direction))
>> + return NULL;
>> +
>> + if (!period_len || !buf_len)
>> + return NULL;
>> +
>> + periods = buf_len / period_len;
>> + if (!periods || periods > DMAC_NR_LMDESC)
>> + return NULL;
>> +
>> + scoped_guard(spinlock_irqsave, &channel->vc.lock) {
>> + if (channel->status & BIT(RZ_DMAC_CHAN_STATUS_CYCLIC))
>> + return NULL;
>> +
>> + desc = list_first_entry_or_null(&channel->ld_free, struct
rz_dmac_desc, node);
>> + if (!desc)
>> + return NULL;
>> +
>> + list_del(&desc->node);
>> +
>> + channel->status |= BIT(RZ_DMAC_CHAN_STATUS_CYCLIC);
>Can this global channel state modification during descriptor preparation cause
>race conditions?
>The DMA engine API permits descriptors to be prepared concurrently with active
>transfers, or to be freed without being issued. If a slave_sg transfer is
>running when prep_dma_cyclic() is called, the global channel status immediately
>becomes CYCLIC.
>When the active slave_sg transfer triggers an interrupt, wouldn't
>rz_dmac_irq_handler_thread() see this flag and incorrectly execute the cyclic
>path (vchan_cyclic_callback) instead of vchan_cookie_complete()?
>Would it be safer to determine the execution mode by checking the currently
>active descriptor's type (e.g., desc->type == RZ_DMAC_DESC_CYCLIC) instead of
>updating a global channel flag during preparation?
Once a channel has been configured as cyclic channel it can be used only as
cyclic channel. HW don't allow changing its usage like mentioned above.
>[ ... ]
>> @@ -733,9 +841,18 @@ static u32 rz_dmac_calculate_residue_bytes_in_vd(struct
rz_dmac_chan *channel,
>> }
>>
>> /* Calculate residue from next lmdesc to end of virtual desc */
>> - while (lmdesc->chcfg & CHCFG_DEM) {
>> - residue += lmdesc->tb;
>> - lmdesc = rz_dmac_get_next_lmdesc(channel->lmdesc.base, lmdesc);
>> + if (channel->status & BIT(RZ_DMAC_CHAN_STATUS_CYCLIC)) {
>> + u32 start_lmdesc_addr = rz_dmac_lmdesc_addr(channel,
desc->start_lmdesc);
>> +
>> + while (lmdesc->nxla != start_lmdesc_addr) {
>Does this omit the residue from the last descriptor in the cyclic ring?
>The last descriptor is configured such that its nxla field points to
>start_lmdesc_addr in order to loop back. Because the loop condition evaluates
>to false exactly when lmdesc reaches this last descriptor, it terminates
>before adding lmdesc->tb (the transfer byte count) to the residue.
>Could this cause the residue to be permanently under-reported by one full
>period length, affecting subsystems like ALSA that rely on strict monotonic
>residue reporting?
I did a lot of audio testing with this code and never encountered issues with
the current form of this code.
>> + residue += lmdesc->tb;
>> + lmdesc = rz_dmac_get_next_lmdesc(channel->lmdesc.base,
lmdesc);
>> + }
>> + } else {
>> + while (lmdesc->chcfg & CHCFG_DEM) {
>> + residue += lmdesc->tb;
>> + lmdesc = rz_dmac_get_next_lmdesc(channel->lmdesc.base,
lmdesc);
>> + }
>> }
next prev parent reply other threads:[~2026-05-25 7:29 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-12 12:12 [PATCH v5 00/17] Renesas: dmaengine and ASoC fixes Claudiu Beznea
2026-05-12 12:12 ` [PATCH v5 01/17] dmaengine: sh: rz-dmac: Move interrupt request after everything is set up Claudiu Beznea
2026-05-12 20:28 ` Frank Li
2026-05-13 21:44 ` sashiko-bot
2026-05-12 12:12 ` [PATCH v5 02/17] dmaengine: sh: rz-dmac: Fix incorrect NULL check on list_first_entry() Claudiu Beznea
2026-05-12 20:35 ` Frank Li
2026-05-13 13:31 ` Claudiu Beznea
2026-05-13 22:00 ` sashiko-bot
2026-05-12 12:12 ` [PATCH v5 03/17] dmaengine: sh: rz-dmac: Use list_first_entry_or_null() Claudiu Beznea
2026-05-12 20:38 ` Frank Li
2026-05-13 22:18 ` sashiko-bot
2026-05-12 12:12 ` [PATCH v5 04/17] dmaengine: sh: rz-dmac: Use rz_dmac_disable_hw() Claudiu Beznea
2026-05-12 20:42 ` Frank Li
2026-05-12 12:12 ` [PATCH v5 05/17] dmaengine: sh: rz-dmac: Add helper to compute the lmdesc address Claudiu Beznea
2026-05-12 20:44 ` Frank Li
2026-05-12 12:12 ` [PATCH v5 06/17] dmaengine: sh: rz-dmac: Save the start LM descriptor Claudiu Beznea
2026-05-12 20:48 ` Frank Li
2026-05-13 13:33 ` Claudiu Beznea
2026-05-13 23:52 ` sashiko-bot
2026-05-12 12:12 ` [PATCH v5 07/17] dmaengine: sh: rz-dmac: Add helper to check if the channel is enabled Claudiu Beznea
2026-05-12 20:49 ` Frank Li
2026-05-13 23:59 ` sashiko-bot
2026-05-12 12:12 ` [PATCH v5 08/17] dmaengine: sh: rz-dmac: Add helper to check if the channel is paused Claudiu Beznea
2026-05-12 20:57 ` Frank Li
2026-05-12 12:12 ` [PATCH v5 09/17] dmaengine: sh: rz-dmac: Use virt-dma APIs for channel descriptor processing Claudiu Beznea
2026-05-12 21:38 ` Frank Li
2026-05-13 13:34 ` Claudiu Beznea
2026-05-14 0:42 ` sashiko-bot
2026-05-12 12:12 ` [PATCH v5 10/17] dmaengine: sh: rz-dmac: Refactor pause/resume code Claudiu Beznea
2026-05-12 21:43 ` Frank Li
2026-05-13 13:35 ` Claudiu Beznea
2026-05-14 0:57 ` sashiko-bot
2026-05-12 12:12 ` [PATCH v5 11/17] dmaengine: sh: rz-dmac: Drop the update of channel->chctrl with CHCTRL_SETEN Claudiu Beznea
2026-05-12 21:55 ` Frank Li
2026-05-12 12:12 ` [PATCH v5 12/17] dmaengine: sh: rz-dmac: Add cyclic DMA support Claudiu Beznea
2026-05-12 22:00 ` Frank Li
2026-05-13 13:38 ` Claudiu Beznea
2026-05-14 1:43 ` sashiko-bot
2026-05-25 7:28 ` Claudiu Beznea [this message]
2026-05-12 12:12 ` [PATCH v5 13/17] dmaengine: sh: rz-dmac: Add runtime PM support Claudiu Beznea
2026-05-12 22:03 ` Frank Li
2026-05-13 13:39 ` Claudiu Beznea
2026-05-13 19:56 ` Frank Li
2026-05-14 9:20 ` Claudiu Beznea
2026-05-14 2:08 ` sashiko-bot
2026-05-25 7:30 ` sashiko review (Re: [PATCH v5 13/17] dmaengine: sh: rz-dmac: Add runtime PM support) Claudiu Beznea
2026-05-12 12:12 ` [PATCH v5 14/17] dmaengine: sh: rz-dmac: Add suspend to RAM support Claudiu Beznea
2026-05-14 3:04 ` sashiko-bot
2026-05-25 7:33 ` sashiko review (Re: [PATCH v5 14/17] dmaengine: sh: rz-dmac: Add suspend to RAM support) Claudiu Beznea
2026-05-12 12:12 ` [PATCH v5 15/17] ASoC: renesas: rz-ssi: Add pause support Claudiu Beznea
2026-05-14 3:54 ` sashiko-bot
2026-05-12 12:12 ` [PATCH v5 16/17] ASoC: renesas: rz-ssi: Use generic PCM dmaengine APIs Claudiu Beznea
2026-05-14 4:52 ` sashiko-bot
2026-05-12 12:12 ` [PATCH v5 17/17] dmaengine: sh: rz-dmac: Set the Link End (LE) bit on the last descriptor Claudiu Beznea
2026-05-14 5:22 ` sashiko-bot
2026-05-15 8:44 ` [PATCH v5 00/17] Renesas: dmaengine and ASoC fixes John Madieu
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=f559ed50-6cde-415f-a9c2-a73387d67ebd@kernel.org \
--to=claudiu.beznea@kernel.org \
--cc=Frank.Li@kernel.org \
--cc=biju.das.jz@bp.renesas.com \
--cc=broonie@kernel.org \
--cc=claudiu.beznea.uj@bp.renesas.com \
--cc=dmaengine@vger.kernel.org \
--cc=fabrizio.castro.jz@renesas.com \
--cc=geert+renesas@glider.be \
--cc=kuninori.morimoto.gx@renesas.com \
--cc=lgirdwood@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-renesas-soc@vger.kernel.org \
--cc=linux-sound@vger.kernel.org \
--cc=long.luu.ur@renesas.com \
--cc=p.zabel@pengutronix.de \
--cc=perex@perex.cz \
--cc=prabhakar.mahadev-lad.rj@bp.renesas.com \
--cc=tiwai@suse.com \
--cc=vkoul@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 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.