* [PATCh v3 0/2] Add DMA ACK signal routing for RZ/V2H family
@ 2026-04-02 16:22 John Madieu
2026-04-02 16:22 ` [PATCh v3 1/2] irqchip/renesas-rzv2h: Add DMA ACK signal routing support John Madieu
2026-04-02 16:22 ` [PATCh v3 2/2] dma: sh: rz-dmac: " John Madieu
0 siblings, 2 replies; 8+ messages in thread
From: John Madieu @ 2026-04-02 16:22 UTC (permalink / raw)
To: Vinod Koul, Frank Li, Thomas Gleixner, Geert Uytterhoeven,
Fabrizio Castro
Cc: Claudiu Beznea, Biju Das, Lad Prabhakar, Cosmin Tanislav,
john.madieu, linux-renesas-soc, dmaengine, linux-kernel,
John Madieu
Some peripherals on RZ/V2H, RZ/V2N, and RZ/G3E SoCs require explicit
DMA ACK signal routing through the ICU for level-based DMA handshaking.
Rather than encoding the ACK signal number as a second DMA specifier
cell, derive it in-driver from the MID/RID request number using
arithmetic formulas based on ICU Table 4.6-28 (3 linear peripheral
groups). It must also be noted that DMA ack register is located in
the ICU block
This series adds:
- ICU driver extension to register/deregister DMA ACK signals
(DMA ACK register is located in the ICU block)
- rz-dmac driver support for ACK signal routing via MID/RID lookup,
including restore on system resume
Note: patch 2/2 depends upon [1], the Cyclic DMA series from Claudiu.
Changes:
v3:
- Splitout from v2 [2] into DMA-specific series
- No code change
v2:
- Drop DMA ACK second cell from DT specifier
- Derive ACK signal number in-driver from MID/RID using arithmetic
formulas per ICU Table 4.6-28 (3 linear peripheral groups)
[1] https://lore.kernel.org/all/20260320112838.2200198-1-claudiu.beznea.uj@bp.renesas.com/
[2] https://lore.kernel.org/all/20260402090524.9137-1-john.madieu.xa@bp.renesas.com/
John Madieu (2):
irqchip/renesas-rzv2h: Add DMA ACK signal routing support
dma: sh: rz-dmac: Add DMA ACK signal routing support
drivers/dma/sh/rz-dmac.c | 72 +++++++++++++++++++++++
drivers/irqchip/irq-renesas-rzv2h.c | 40 +++++++++++++
include/linux/irqchip/irq-renesas-rzv2h.h | 5 ++
3 files changed, 117 insertions(+)
--
2.25.1
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCh v3 1/2] irqchip/renesas-rzv2h: Add DMA ACK signal routing support
2026-04-02 16:22 [PATCh v3 0/2] Add DMA ACK signal routing for RZ/V2H family John Madieu
@ 2026-04-02 16:22 ` John Madieu
2026-04-29 7:23 ` Thomas Gleixner
2026-04-02 16:22 ` [PATCh v3 2/2] dma: sh: rz-dmac: " John Madieu
1 sibling, 1 reply; 8+ messages in thread
From: John Madieu @ 2026-04-02 16:22 UTC (permalink / raw)
To: Vinod Koul, Frank Li, Thomas Gleixner, Geert Uytterhoeven,
Fabrizio Castro
Cc: Claudiu Beznea, Biju Das, Lad Prabhakar, Cosmin Tanislav,
john.madieu, linux-renesas-soc, dmaengine, linux-kernel,
John Madieu
Some peripherals on RZ/G3E SoCs (SSIU, SPDIF, SCU/SRC, DVC) require
explicit ACK signal routing through the ICU via the ICU_DMACKSELk
registers for level-based DMA handshaking.
Add rzv2h_icu_register_dma_ack() to configure ICU_DMACKSELk, routing
a DMAC channel's ACK signal to the specified peripheral.
Signed-off-by: John Madieu <john.madieu.xa@bp.renesas.com>
---
Changes:
v3: No changes
v2: No changes
drivers/irqchip/irq-renesas-rzv2h.c | 40 +++++++++++++++++++++++
include/linux/irqchip/irq-renesas-rzv2h.h | 5 +++
2 files changed, 45 insertions(+)
diff --git a/drivers/irqchip/irq-renesas-rzv2h.c b/drivers/irqchip/irq-renesas-rzv2h.c
index 31f191641ff8..4ebcb91c0b6c 100644
--- a/drivers/irqchip/irq-renesas-rzv2h.c
+++ b/drivers/irqchip/irq-renesas-rzv2h.c
@@ -151,6 +151,12 @@ struct rzv2h_hw_info {
#define ICU_DMAC_PREP_DMAREQ(sel, up) (FIELD_PREP(ICU_DMAC_DkRQ_SEL_MASK, (sel)) \
<< ICU_DMAC_DMAREQ_SHIFT(up))
+/* DMAC ACK routing - 4 x 7-bit fields per 32-bit register, 8-bit spacing */
+#define ICU_DMAC_DACK_SEL_MASK GENMASK(6, 0)
+#define ICU_DMAC_DACK_SHIFT(n) ((n) * 8)
+#define ICU_DMAC_DACK_FIELD_MASK(n) (ICU_DMAC_DACK_SEL_MASK << ICU_DMAC_DACK_SHIFT(n))
+#define ICU_DMAC_PREP_DACK(val, n) (((val) & ICU_DMAC_DACK_SEL_MASK) << ICU_DMAC_DACK_SHIFT(n))
+
/**
* struct rzv2h_icu_priv - Interrupt Control Unit controller private data structure.
* @base: Controller's base address
@@ -188,6 +194,40 @@ void rzv2h_icu_register_dma_req(struct platform_device *icu_dev, u8 dmac_index,
}
EXPORT_SYMBOL_GPL(rzv2h_icu_register_dma_req);
+/**
+ * rzv2h_icu_register_dma_ack - Configure DMA ACK signal routing
+ * @icu_dev: ICU platform device
+ * @dmac_index: DMAC instance index (0-4)
+ * @dmac_channel: DMAC channel number (0-15), or RZV2H_ICU_DMAC_ACK_NO_DEFAULT
+ * to disconnect routing for a given ack_no
+ * @ack_no: Peripheral ACK number (0-88) per RZ/G3E manual Table 4.6-28,
+ * used as index into ICU_DMACKSELk
+ *
+ * Routes the ACK signal of the peripheral identified by @ack_no to DMAC
+ * channel @dmac_channel of instance @dmac_index. When @dmac_channel is
+ * RZV2H_ICU_DMAC_ACK_NO_DEFAULT the field is reset, disconnecting any
+ * previously configured routing for that peripheral.
+ */
+void rzv2h_icu_register_dma_ack(struct platform_device *icu_dev, u8 dmac_index,
+ u8 dmac_channel, u16 ack_no)
+{
+ struct rzv2h_icu_priv *priv = platform_get_drvdata(icu_dev);
+ u8 reg_idx = ack_no / 4;
+ u8 field_idx = ack_no & 0x3;
+ u8 dmac_ack_src = (dmac_channel == RZV2H_ICU_DMAC_ACK_NO_DEFAULT) ?
+ RZV2H_ICU_DMAC_ACK_NO_DEFAULT :
+ (dmac_index * 16 + dmac_channel);
+ u32 val;
+
+ guard(raw_spinlock_irqsave)(&priv->lock);
+
+ val = readl(priv->base + ICU_DMACKSELk(reg_idx));
+ val &= ~ICU_DMAC_DACK_FIELD_MASK(field_idx);
+ val |= ICU_DMAC_PREP_DACK(dmac_ack_src, field_idx);
+ writel(val, priv->base + ICU_DMACKSELk(reg_idx));
+}
+EXPORT_SYMBOL_GPL(rzv2h_icu_register_dma_ack);
+
static inline struct rzv2h_icu_priv *irq_data_to_priv(struct irq_data *data)
{
return data->domain->host_data;
diff --git a/include/linux/irqchip/irq-renesas-rzv2h.h b/include/linux/irqchip/irq-renesas-rzv2h.h
index 618a60d2eac0..4ffa898eaaf2 100644
--- a/include/linux/irqchip/irq-renesas-rzv2h.h
+++ b/include/linux/irqchip/irq-renesas-rzv2h.h
@@ -11,13 +11,18 @@
#include <linux/platform_device.h>
#define RZV2H_ICU_DMAC_REQ_NO_DEFAULT 0x3ff
+#define RZV2H_ICU_DMAC_ACK_NO_DEFAULT 0x7f
#ifdef CONFIG_RENESAS_RZV2H_ICU
void rzv2h_icu_register_dma_req(struct platform_device *icu_dev, u8 dmac_index, u8 dmac_channel,
u16 req_no);
+void rzv2h_icu_register_dma_ack(struct platform_device *icu_dev, u8 dmac_index,
+ u8 dmac_channel, u16 ack_no);
#else
static inline void rzv2h_icu_register_dma_req(struct platform_device *icu_dev, u8 dmac_index,
u8 dmac_channel, u16 req_no) { }
+static inline void rzv2h_icu_register_dma_ack(struct platform_device *icu_dev, u8 dmac_index,
+ u8 dmac_channel, u16 ack_no) { }
#endif
#endif /* __LINUX_IRQ_RENESAS_RZV2H */
--
2.25.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCh v3 2/2] dma: sh: rz-dmac: Add DMA ACK signal routing support
2026-04-02 16:22 [PATCh v3 0/2] Add DMA ACK signal routing for RZ/V2H family John Madieu
2026-04-02 16:22 ` [PATCh v3 1/2] irqchip/renesas-rzv2h: Add DMA ACK signal routing support John Madieu
@ 2026-04-02 16:22 ` John Madieu
2026-05-07 18:49 ` Frank Li
1 sibling, 1 reply; 8+ messages in thread
From: John Madieu @ 2026-04-02 16:22 UTC (permalink / raw)
To: Vinod Koul, Frank Li, Thomas Gleixner, Geert Uytterhoeven,
Fabrizio Castro
Cc: Claudiu Beznea, Biju Das, Lad Prabhakar, Cosmin Tanislav,
john.madieu, linux-renesas-soc, dmaengine, linux-kernel,
John Madieu
Some peripherals on RZ/G3E SoCs (SSIU, SPDIF, SCU/SRC, DVC, PFC)
require explicit ACK signal routing through the ICU for level-based DMA
handshaking.
Rather than extending the DT binding with an optional second #dma-cells
(which would require all DMA consumers to supply two cells even when ACK
routing is not needed), derive the ACK signal number directly from the
MID/RID request number using the linear mapping defined in RZ/G3E hardware
manual Table 4.6-28:
PFC external DMA pins (DREQ0..DREQ4):
req_no 0x000-0x004 -> ACK No. 84-88
SSIU BUSIFs (ssip00..ssip93):
req_no 0x161-0x198 -> ACK No. 28-83
SPDIF (CH0..CH2) + SCU SRC (sr0..sr9) + DVC (cmd0..cmd1):
req_no 0x199-0x1b4 -> ACK No. 0-27
ACK routing is programmed when a channel is prepared for transfer and
cleared when the channel is released or the transfer times out, following
the same pattern as MID/RID request routing.
Signed-off-by: John Madieu <john.madieu.xa@bp.renesas.com>
---
Changes:
v3: No changes
v2:
- Drop DMA ACK second cell from DT specifier
- Derive ACK signal number in-driver from MID/RID using arithmetic formulas
per ICU Table 4.6-28 (3 linear peripheral groups)
drivers/dma/sh/rz-dmac.c | 72 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 72 insertions(+)
diff --git a/drivers/dma/sh/rz-dmac.c b/drivers/dma/sh/rz-dmac.c
index 95a89c9d2925..bde3da96b37e 100644
--- a/drivers/dma/sh/rz-dmac.c
+++ b/drivers/dma/sh/rz-dmac.c
@@ -97,6 +97,7 @@ struct rz_dmac_chan {
u32 chcfg;
u32 chctrl;
int mid_rid;
+ int dmac_ack;
struct {
u32 nxla;
@@ -124,6 +125,9 @@ struct rz_dmac_icu {
struct rz_dmac_info {
void (*icu_register_dma_req)(struct platform_device *icu_dev,
u8 dmac_index, u8 dmac_channel, u16 req_no);
+ void (*icu_register_dma_ack)(struct platform_device *icu_dev,
+ u8 dmac_index, u8 dmac_channel, u16 ack_no);
+ u16 default_dma_ack_no;
u16 default_dma_req_no;
};
@@ -362,6 +366,60 @@ static void rz_dmac_set_dma_req_no(struct rz_dmac *dmac, unsigned int index,
rz_dmac_set_dmars_register(dmac, index, req_no);
}
+/*
+ * Map MID/RID request number (bits[0:9] of DMA specifier) to the ICU
+ * DMA ACK signal number, per RZ/G3E hardware manual Table 4.6-28.
+ *
+ * Three peripheral groups cover all ACK-capable peripherals:
+ *
+ * PFC external DMA pins (DREQ0..DREQ4):
+ * req_no 0x000-0x004 -> ACK No. 84-88 (ack = req_no + 84)
+ *
+ * SSIU BUSIFs (ssip00..ssip93):
+ * req_no 0x161-0x198 -> ACK No. 28-83 (ack = req_no - 0x145)
+ *
+ * SPDIF (CH0..CH2) + SCU SRC (sr0..sr9) + DVC (cmd0..cmd1):
+ * req_no 0x199-0x1b4 -> ACK No. 0-27 (ack = req_no - 0x199)
+ */
+static int rz_dmac_get_ack_no(const struct rz_dmac_info *info, u16 req_no)
+{
+ if (!info->icu_register_dma_ack)
+ return -EINVAL;
+
+ switch (req_no) {
+ case 0x000 ... 0x004:
+ /* PFC external DMA pins: ACK No. 84-88 */
+ return req_no + 84;
+ case 0x161 ... 0x198:
+ /* SSIU BUSIFs: ACK No. 28-83 */
+ return req_no - 0x145;
+ case 0x199 ... 0x1b4:
+ /* SPDIF + SCU SRC + DVC: ACK No. 0-27 */
+ return req_no - 0x199;
+ default:
+ return -EINVAL;
+ }
+}
+
+static void rz_dmac_set_dma_ack_no(struct rz_dmac *dmac, unsigned int index,
+ int ack_no)
+{
+ if (ack_no < 0 || !dmac->info->icu_register_dma_ack)
+ return;
+
+ dmac->info->icu_register_dma_ack(dmac->icu.pdev, dmac->icu.dmac_index,
+ index, ack_no);
+}
+
+static void rz_dmac_reset_dma_ack_no(struct rz_dmac *dmac, int ack_no)
+{
+ if (ack_no < 0 || !dmac->info->icu_register_dma_ack)
+ return;
+
+ dmac->info->icu_register_dma_ack(dmac->icu.pdev, dmac->icu.dmac_index,
+ dmac->info->default_dma_ack_no, ack_no);
+}
+
static void rz_dmac_prepare_desc_for_memcpy(struct rz_dmac_chan *channel)
{
struct dma_chan *chan = &channel->vc.chan;
@@ -431,6 +489,7 @@ static void rz_dmac_prepare_descs_for_slave_sg(struct rz_dmac_chan *channel)
channel->lmdesc.tail = lmdesc;
rz_dmac_set_dma_req_no(dmac, channel->index, channel->mid_rid);
+ rz_dmac_set_dma_ack_no(dmac, channel->index, channel->dmac_ack);
}
static void rz_dmac_prepare_descs_for_cyclic(struct rz_dmac_chan *channel)
@@ -485,6 +544,7 @@ static void rz_dmac_prepare_descs_for_cyclic(struct rz_dmac_chan *channel)
channel->lmdesc.tail = lmdesc;
rz_dmac_set_dma_req_no(dmac, channel->index, channel->mid_rid);
+ rz_dmac_set_dma_ack_no(dmac, channel->index, channel->dmac_ack);
}
static int rz_dmac_xfer_desc(struct rz_dmac_chan *chan)
@@ -567,6 +627,9 @@ static void rz_dmac_free_chan_resources(struct dma_chan *chan)
channel->mid_rid = -EINVAL;
}
+ rz_dmac_reset_dma_ack_no(dmac, channel->dmac_ack);
+ channel->dmac_ack = -EINVAL;
+
spin_unlock_irqrestore(&channel->vc.lock, flags);
list_for_each_entry_safe(desc, _desc, &channel->ld_free, node) {
@@ -814,6 +877,7 @@ static void rz_dmac_device_synchronize(struct dma_chan *chan)
dev_warn(dmac->dev, "DMA Timeout");
rz_dmac_set_dma_req_no(dmac, channel->index, dmac->info->default_dma_req_no);
+ rz_dmac_reset_dma_ack_no(dmac, channel->dmac_ack);
}
static struct rz_lmdesc *
@@ -1164,6 +1228,8 @@ static bool rz_dmac_chan_filter(struct dma_chan *chan, void *arg)
channel->chcfg = CHCFG_FILL_TM(ch_cfg) | CHCFG_FILL_AM(ch_cfg) |
CHCFG_FILL_LVL(ch_cfg) | CHCFG_FILL_HIEN(ch_cfg);
+ channel->dmac_ack = rz_dmac_get_ack_no(dmac->info, channel->mid_rid);
+
return !test_and_set_bit(channel->mid_rid, dmac->modules);
}
@@ -1200,6 +1266,7 @@ static int rz_dmac_chan_probe(struct rz_dmac *dmac,
channel->index = index;
channel->mid_rid = -EINVAL;
+ channel->dmac_ack = -EINVAL;
/* Request the channel interrupt. */
scnprintf(pdev_irqname, sizeof(pdev_irqname), "ch%u", index);
@@ -1569,6 +1636,9 @@ static int rz_dmac_resume(struct device *dev)
guard(spinlock_irqsave)(&channel->vc.lock);
+ rz_dmac_set_dma_req_no(dmac, channel->index, channel->mid_rid);
+ rz_dmac_set_dma_ack_no(dmac, channel->index, channel->dmac_ack);
+
if (!(channel->status & BIT(RZ_DMAC_CHAN_STATUS_CYCLIC))) {
rz_dmac_ch_writel(&dmac->channels[i], CHCTRL_DEFAULT, CHCTRL, 1);
continue;
@@ -1601,6 +1671,8 @@ static const struct dev_pm_ops rz_dmac_pm_ops = {
static const struct rz_dmac_info rz_dmac_v2h_info = {
.icu_register_dma_req = rzv2h_icu_register_dma_req,
+ .icu_register_dma_ack = rzv2h_icu_register_dma_ack,
+ .default_dma_ack_no = RZV2H_ICU_DMAC_ACK_NO_DEFAULT,
.default_dma_req_no = RZV2H_ICU_DMAC_REQ_NO_DEFAULT,
};
--
2.25.1
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCh v3 1/2] irqchip/renesas-rzv2h: Add DMA ACK signal routing support
2026-04-02 16:22 ` [PATCh v3 1/2] irqchip/renesas-rzv2h: Add DMA ACK signal routing support John Madieu
@ 2026-04-29 7:23 ` Thomas Gleixner
0 siblings, 0 replies; 8+ messages in thread
From: Thomas Gleixner @ 2026-04-29 7:23 UTC (permalink / raw)
To: John Madieu, Vinod Koul, Frank Li, Geert Uytterhoeven,
Fabrizio Castro
Cc: Claudiu Beznea, Biju Das, Lad Prabhakar, Cosmin Tanislav,
john.madieu, linux-renesas-soc, dmaengine, linux-kernel,
John Madieu
On Thu, Apr 02 2026 at 18:22, John Madieu wrote:
> Some peripherals on RZ/G3E SoCs (SSIU, SPDIF, SCU/SRC, DVC) require
> explicit ACK signal routing through the ICU via the ICU_DMACKSELk
> registers for level-based DMA handshaking.
>
> Add rzv2h_icu_register_dma_ack() to configure ICU_DMACKSELk, routing
> a DMAC channel's ACK signal to the specified peripheral.
>
> Signed-off-by: John Madieu <john.madieu.xa@bp.renesas.com>
Assuming this goes through the DMA tree:
Acked-by: Thomas Gleixner <tglx@kernel.org>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCh v3 2/2] dma: sh: rz-dmac: Add DMA ACK signal routing support
2026-04-02 16:22 ` [PATCh v3 2/2] dma: sh: rz-dmac: " John Madieu
@ 2026-05-07 18:49 ` Frank Li
2026-05-11 17:04 ` John Madieu
0 siblings, 1 reply; 8+ messages in thread
From: Frank Li @ 2026-05-07 18:49 UTC (permalink / raw)
To: John Madieu
Cc: Vinod Koul, Frank Li, Thomas Gleixner, Geert Uytterhoeven,
Fabrizio Castro, Claudiu Beznea, Biju Das, Lad Prabhakar,
Cosmin Tanislav, john.madieu, linux-renesas-soc, dmaengine,
linux-kernel
On Thu, Apr 02, 2026 at 06:22:12PM +0200, John Madieu wrote:
> Some peripherals on RZ/G3E SoCs (SSIU, SPDIF, SCU/SRC, DVC, PFC)
> require explicit ACK signal routing through the ICU for level-based DMA
> handshaking.
>
> Rather than extending the DT binding with an optional second #dma-cells
> (which would require all DMA consumers to supply two cells even when ACK
> routing is not needed), derive the ACK signal number directly from the
> MID/RID request number using the linear mapping defined in RZ/G3E hardware
> manual Table 4.6-28:
>
> PFC external DMA pins (DREQ0..DREQ4):
> req_no 0x000-0x004 -> ACK No. 84-88
>
> SSIU BUSIFs (ssip00..ssip93):
> req_no 0x161-0x198 -> ACK No. 28-83
>
> SPDIF (CH0..CH2) + SCU SRC (sr0..sr9) + DVC (cmd0..cmd1):
> req_no 0x199-0x1b4 -> ACK No. 0-27
>
> ACK routing is programmed when a channel is prepared for transfer and
> cleared when the channel is released or the transfer times out, following
> the same pattern as MID/RID request routing.
>
> Signed-off-by: John Madieu <john.madieu.xa@bp.renesas.com>
> ---
>
> Changes:
>
> v3: No changes
>
> v2:
> - Drop DMA ACK second cell from DT specifier
> - Derive ACK signal number in-driver from MID/RID using arithmetic formulas
> per ICU Table 4.6-28 (3 linear peripheral groups)
>
> drivers/dma/sh/rz-dmac.c | 72 ++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 72 insertions(+)
>
> static void rz_dmac_prepare_desc_for_memcpy(struct rz_dmac_chan *channel)
> {
> struct dma_chan *chan = &channel->vc.chan;
> @@ -431,6 +489,7 @@ static void rz_dmac_prepare_descs_for_slave_sg(struct rz_dmac_chan *channel)
> channel->lmdesc.tail = lmdesc;
>
> rz_dmac_set_dma_req_no(dmac, channel->index, channel->mid_rid);
> + rz_dmac_set_dma_ack_no(dmac, channel->index, channel->dmac_ack);
I am not familar with your hardware, why ACK folllow req immediately?
suppose ACK happen after transfer done.
If ACK need after req, why not add ack handle in rz_dmac_set_dma_req_no()
directly.
Frank
> --
> 2.25.1
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* RE: [PATCh v3 2/2] dma: sh: rz-dmac: Add DMA ACK signal routing support
2026-05-07 18:49 ` Frank Li
@ 2026-05-11 17:04 ` John Madieu
2026-05-11 20:20 ` Frank Li
0 siblings, 1 reply; 8+ messages in thread
From: John Madieu @ 2026-05-11 17:04 UTC (permalink / raw)
To: Frank Li
Cc: Vinod Koul, Frank Li, Thomas Gleixner, Geert Uytterhoeven,
Fabrizio Castro, Claudiu.Beznea, Biju Das, Prabhakar Mahadev Lad,
Cosmin-Gabriel Tanislav, john.madieu@gmail.com,
linux-renesas-soc@vger.kernel.org, dmaengine@vger.kernel.org,
linux-kernel@vger.kernel.org
Hi Frank,
thanks for your review.
> -----Original Message-----
> From: Frank Li <Frank.li@nxp.com>
> Sent: Donnerstag, 7. Mai 2026 20:49
> To: John Madieu <john.madieu.xa@bp.renesas.com>
> Subject: Re: [PATCh v3 2/2] dma: sh: rz-dmac: Add DMA ACK signal routing
> support
>
>
> On Thu, Apr 02, 2026 at 06:22:12PM +0200, John Madieu wrote:
> > Some peripherals on RZ/G3E SoCs (SSIU, SPDIF, SCU/SRC, DVC, PFC)
> > require explicit ACK signal routing through the ICU for level-based
> > DMA handshaking.
> >
> > Rather than extending the DT binding with an optional second
> > #dma-cells (which would require all DMA consumers to supply two cells
> > even when ACK routing is not needed), derive the ACK signal number
> > directly from the MID/RID request number using the linear mapping
> > defined in RZ/G3E hardware manual Table 4.6-28:
> >
> > PFC external DMA pins (DREQ0..DREQ4):
> > req_no 0x000-0x004 -> ACK No. 84-88
> >
> > SSIU BUSIFs (ssip00..ssip93):
> > req_no 0x161-0x198 -> ACK No. 28-83
> >
> > SPDIF (CH0..CH2) + SCU SRC (sr0..sr9) + DVC (cmd0..cmd1):
> > req_no 0x199-0x1b4 -> ACK No. 0-27
> >
> > ACK routing is programmed when a channel is prepared for transfer and
> > cleared when the channel is released or the transfer times out,
> > following the same pattern as MID/RID request routing.
> >
> > Signed-off-by: John Madieu <john.madieu.xa@bp.renesas.com>
> > ---
> >
> > Changes:
> >
> > v3: No changes
> >
> > v2:
> > - Drop DMA ACK second cell from DT specifier
> > - Derive ACK signal number in-driver from MID/RID using arithmetic
> formulas
> > per ICU Table 4.6-28 (3 linear peripheral groups)
> >
> > drivers/dma/sh/rz-dmac.c | 72
> > ++++++++++++++++++++++++++++++++++++++++
> > 1 file changed, 72 insertions(+)
> >
> > static void rz_dmac_prepare_desc_for_memcpy(struct rz_dmac_chan
> > *channel) {
> > struct dma_chan *chan = &channel->vc.chan; @@ -431,6 +489,7 @@
> > static void rz_dmac_prepare_descs_for_slave_sg(struct rz_dmac_chan
> *channel)
> > channel->lmdesc.tail = lmdesc;
> >
> > rz_dmac_set_dma_req_no(dmac, channel->index, channel->mid_rid);
> > + rz_dmac_set_dma_ack_no(dmac, channel->index, channel->dmac_ack);
>
> I am not familar with your hardware, why ACK folllow req immediately?
> suppose ACK happen after transfer done.
rz_dmac_set_dma_ack_no() does not fire an ACK pulse, it programs a static
routing mux in the ICU (ICU_DMACKSELk) that selects which DMAC channel is
the source of the ACK line for a given peripheral. It is the symmetric
counterpart of ICU_DMAREQSELk programmed by rz_dmac_set_dma_req_no().
Both registers must be configured before any transfer can happen on
the channel: the REQ mux routes the peripheral's request line into
the DMAC, the ACK mux routes the DMAC's acknowledge line back to the
peripheral. Once the routing is in place, the level-based REQ/ACK
handshake itself runs entirely in hardware on every burst, with no
driver involvement per transfer.
Maybe should I reword the commit message to make this distinction
explicit (routing config vs per-transfer signal).
>
> If ACK need after req, why not add ack handle in rz_dmac_set_dma_req_no()
> directly.
I would prefer to keep rz_dmac_set_dma_ack_no() as its own helper, to
mirror the existing rz_dmac_set_dma_req_no() path. The surrounding
infrastructure is already structured around per-routing helpers, and
the ACK additions in this patch deliberately follow that pattern:
.icu_register_dma_ack/.default_dma_ack_no.
The two ICU registers also index their fields differently. ICU_DMAkSELy
fields are indexed by DMAC channel and carry the peripheral req_no as
the value, while ICU_DMACKSELk fields are indexed by the peripheral
ack_no and carry the DMAC source channel as the value. Folding ACK
into rz_dmac_set_dma_req_no() would mix those two layouts in one helper
for no behavioral gain.
Regards,
John
>
> Frank
>
> > --
> > 2.25.1
> >
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCh v3 2/2] dma: sh: rz-dmac: Add DMA ACK signal routing support
2026-05-11 17:04 ` John Madieu
@ 2026-05-11 20:20 ` Frank Li
2026-05-11 21:04 ` John Madieu
0 siblings, 1 reply; 8+ messages in thread
From: Frank Li @ 2026-05-11 20:20 UTC (permalink / raw)
To: John Madieu
Cc: Vinod Koul, Frank Li, Thomas Gleixner, Geert Uytterhoeven,
Fabrizio Castro, Claudiu.Beznea, Biju Das, Prabhakar Mahadev Lad,
Cosmin-Gabriel Tanislav, john.madieu@gmail.com,
linux-renesas-soc@vger.kernel.org, dmaengine@vger.kernel.org,
linux-kernel@vger.kernel.org
On Mon, May 11, 2026 at 05:04:46PM +0000, John Madieu wrote:
> Hi Frank,
>
> thanks for your review.
>
> > -----Original Message-----
> > From: Frank Li <Frank.li@nxp.com>
> > Sent: Donnerstag, 7. Mai 2026 20:49
> > To: John Madieu <john.madieu.xa@bp.renesas.com>
> > Subject: Re: [PATCh v3 2/2] dma: sh: rz-dmac: Add DMA ACK signal routing
> > support
> >
> >
> > On Thu, Apr 02, 2026 at 06:22:12PM +0200, John Madieu wrote:
> > > Some peripherals on RZ/G3E SoCs (SSIU, SPDIF, SCU/SRC, DVC, PFC)
> > > require explicit ACK signal routing through the ICU for level-based
> > > DMA handshaking.
> > >
> > > Rather than extending the DT binding with an optional second
> > > #dma-cells (which would require all DMA consumers to supply two cells
> > > even when ACK routing is not needed), derive the ACK signal number
> > > directly from the MID/RID request number using the linear mapping
> > > defined in RZ/G3E hardware manual Table 4.6-28:
> > >
> > > PFC external DMA pins (DREQ0..DREQ4):
> > > req_no 0x000-0x004 -> ACK No. 84-88
> > >
> > > SSIU BUSIFs (ssip00..ssip93):
> > > req_no 0x161-0x198 -> ACK No. 28-83
> > >
> > > SPDIF (CH0..CH2) + SCU SRC (sr0..sr9) + DVC (cmd0..cmd1):
> > > req_no 0x199-0x1b4 -> ACK No. 0-27
> > >
> > > ACK routing is programmed when a channel is prepared for transfer and
> > > cleared when the channel is released or the transfer times out,
> > > following the same pattern as MID/RID request routing.
> > >
> > > Signed-off-by: John Madieu <john.madieu.xa@bp.renesas.com>
> > > ---
> > >
> > > Changes:
> > >
> > > v3: No changes
> > >
> > > v2:
> > > - Drop DMA ACK second cell from DT specifier
> > > - Derive ACK signal number in-driver from MID/RID using arithmetic
> > formulas
> > > per ICU Table 4.6-28 (3 linear peripheral groups)
> > >
> > > drivers/dma/sh/rz-dmac.c | 72
> > > ++++++++++++++++++++++++++++++++++++++++
> > > 1 file changed, 72 insertions(+)
> > >
> > > static void rz_dmac_prepare_desc_for_memcpy(struct rz_dmac_chan
> > > *channel) {
> > > struct dma_chan *chan = &channel->vc.chan; @@ -431,6 +489,7 @@
> > > static void rz_dmac_prepare_descs_for_slave_sg(struct rz_dmac_chan
> > *channel)
> > > channel->lmdesc.tail = lmdesc;
> > >
> > > rz_dmac_set_dma_req_no(dmac, channel->index, channel->mid_rid);
> > > + rz_dmac_set_dma_ack_no(dmac, channel->index, channel->dmac_ack);
> >
> > I am not familar with your hardware, why ACK folllow req immediately?
> > suppose ACK happen after transfer done.
>
> rz_dmac_set_dma_ack_no() does not fire an ACK pulse, it programs a static
> routing mux in the ICU (ICU_DMACKSELk) that selects which DMAC channel is
> the source of the ACK line for a given peripheral. It is the symmetric
> counterpart of ICU_DMAREQSELk programmed by rz_dmac_set_dma_req_no().
>
> Both registers must be configured before any transfer can happen on
> the channel: the REQ mux routes the peripheral's request line into
> the DMAC, the ACK mux routes the DMAC's acknowledge line back to the
> peripheral. Once the routing is in place, the level-based REQ/ACK
> handshake itself runs entirely in hardware on every burst, with no
> driver involvement per transfer.
Supposed these register should belong to dma-engine, but it was located
into irq, you open a private API to irq chip drivers. Ideally these
register ownership should move to here.
these routing mux should be in allocate channel callback, not in
rz_dmac_prepare_descs_for_slave_sg() or in xlate function.
Frank
>
> Maybe should I reword the commit message to make this distinction
> explicit (routing config vs per-transfer signal).
>
> >
> > If ACK need after req, why not add ack handle in rz_dmac_set_dma_req_no()
> > directly.
>
> I would prefer to keep rz_dmac_set_dma_ack_no() as its own helper, to
> mirror the existing rz_dmac_set_dma_req_no() path. The surrounding
> infrastructure is already structured around per-routing helpers, and
> the ACK additions in this patch deliberately follow that pattern:
> .icu_register_dma_ack/.default_dma_ack_no.
>
> The two ICU registers also index their fields differently. ICU_DMAkSELy
> fields are indexed by DMAC channel and carry the peripheral req_no as
> the value, while ICU_DMACKSELk fields are indexed by the peripheral
> ack_no and carry the DMAC source channel as the value. Folding ACK
> into rz_dmac_set_dma_req_no() would mix those two layouts in one helper
> for no behavioral gain.
>
> Regards,
> John
>
>
> >
> > Frank
> >
> > > --
> > > 2.25.1
> > >
^ permalink raw reply [flat|nested] 8+ messages in thread
* RE: [PATCh v3 2/2] dma: sh: rz-dmac: Add DMA ACK signal routing support
2026-05-11 20:20 ` Frank Li
@ 2026-05-11 21:04 ` John Madieu
0 siblings, 0 replies; 8+ messages in thread
From: John Madieu @ 2026-05-11 21:04 UTC (permalink / raw)
To: Frank Li
Cc: Vinod Koul, Frank Li, Thomas Gleixner, Geert Uytterhoeven,
Fabrizio Castro, Claudiu.Beznea, Biju Das, Prabhakar Mahadev Lad,
Cosmin-Gabriel Tanislav, john.madieu@gmail.com,
linux-renesas-soc@vger.kernel.org, dmaengine@vger.kernel.org,
linux-kernel@vger.kernel.org
Hi Frank,
> -----Original Message-----
> From: Frank Li <Frank.li@nxp.com>
> Sent: Montag, 11. Mai 2026 22:21
> To: John Madieu <john.madieu.xa@bp.renesas.com>
> Subject: Re: [PATCh v3 2/2] dma: sh: rz-dmac: Add DMA ACK signal routing
> support
>
> [You don't often get email from frank.li@nxp.com. Learn why this is
> important at https://aka.ms/LearnAboutSenderIdentification ]
>
> On Mon, May 11, 2026 at 05:04:46PM +0000, John Madieu wrote:
> > Hi Frank,
> >
> > thanks for your review.
> >
> > > -----Original Message-----
> > > From: Frank Li <Frank.li@nxp.com>
> > > Sent: Donnerstag, 7. Mai 2026 20:49
> > > To: John Madieu <john.madieu.xa@bp.renesas.com>
> > > Subject: Re: [PATCh v3 2/2] dma: sh: rz-dmac: Add DMA ACK signal
> > > routing support
> > >
> > >
> > > On Thu, Apr 02, 2026 at 06:22:12PM +0200, John Madieu wrote:
> > > > Some peripherals on RZ/G3E SoCs (SSIU, SPDIF, SCU/SRC, DVC, PFC)
> > > > require explicit ACK signal routing through the ICU for
> > > > level-based DMA handshaking.
> > > >
> > > > Rather than extending the DT binding with an optional second
> > > > #dma-cells (which would require all DMA consumers to supply two
> > > > cells even when ACK routing is not needed), derive the ACK signal
> > > > number directly from the MID/RID request number using the linear
> > > > mapping defined in RZ/G3E hardware manual Table 4.6-28:
> > > >
> > > > PFC external DMA pins (DREQ0..DREQ4):
> > > > req_no 0x000-0x004 -> ACK No. 84-88
> > > >
> > > > SSIU BUSIFs (ssip00..ssip93):
> > > > req_no 0x161-0x198 -> ACK No. 28-83
> > > >
> > > > SPDIF (CH0..CH2) + SCU SRC (sr0..sr9) + DVC (cmd0..cmd1):
> > > > req_no 0x199-0x1b4 -> ACK No. 0-27
> > > >
> > > > ACK routing is programmed when a channel is prepared for transfer
> > > > and cleared when the channel is released or the transfer times
> > > > out, following the same pattern as MID/RID request routing.
> > > >
> > > > Signed-off-by: John Madieu <john.madieu.xa@bp.renesas.com>
> > > > ---
> > > >
> > > > Changes:
> > > >
> > > > v3: No changes
> > > >
> > > > v2:
> > > > - Drop DMA ACK second cell from DT specifier
> > > > - Derive ACK signal number in-driver from MID/RID using
> > > > arithmetic
> > > formulas
> > > > per ICU Table 4.6-28 (3 linear peripheral groups)
> > > >
> > > > drivers/dma/sh/rz-dmac.c | 72
> > > > ++++++++++++++++++++++++++++++++++++++++
> > > > 1 file changed, 72 insertions(+)
> > > >
> > > > static void rz_dmac_prepare_desc_for_memcpy(struct rz_dmac_chan
> > > > *channel) {
> > > > struct dma_chan *chan = &channel->vc.chan; @@ -431,6 +489,7
> > > > @@ static void rz_dmac_prepare_descs_for_slave_sg(struct
> > > > rz_dmac_chan
> > > *channel)
> > > > channel->lmdesc.tail = lmdesc;
> > > >
> > > > rz_dmac_set_dma_req_no(dmac, channel->index,
> > > > channel->mid_rid);
> > > > + rz_dmac_set_dma_ack_no(dmac, channel->index,
> > > > + channel->dmac_ack);
> > >
> > > I am not familar with your hardware, why ACK folllow req immediately?
> > > suppose ACK happen after transfer done.
> >
> > rz_dmac_set_dma_ack_no() does not fire an ACK pulse, it programs a
> > static routing mux in the ICU (ICU_DMACKSELk) that selects which DMAC
> > channel is the source of the ACK line for a given peripheral. It is
> > the symmetric counterpart of ICU_DMAREQSELk programmed by
> rz_dmac_set_dma_req_no().
> >
> > Both registers must be configured before any transfer can happen on
> > the channel: the REQ mux routes the peripheral's request line into the
> > DMAC, the ACK mux routes the DMAC's acknowledge line back to the
> > peripheral. Once the routing is in place, the level-based REQ/ACK
> > handshake itself runs entirely in hardware on every burst, with no
> > driver involvement per transfer.
>
> Supposed these register should belong to dma-engine, but it was located
> into irq, you open a private API to irq chip drivers. Ideally these
> register ownership should move to here.
These registers belong to the ICU's MMIO region, along with the
IRQ/TINT/NMI/ECC machinery owned by the irqchip driver. The established
pattern is for the irqchip to keep ownership of the whole region and
export a small entry point for the DMA engine to call into. That pattern
was introduced by Fabrizio when the irqchip driver landed and adopted
by Cosmin when chip-specific REQ routing was added to rz-dmac [1].
>
> these routing mux should be in allocate channel callback, not in
> rz_dmac_prepare_descs_for_slave_sg() or in xlate function.
The prepare-path placement is also pre-existing. The new
rz_dmac_setset_dma_ack_no() call in this patch sit at the same
sites, by design, so the REQ and ACK routes share one lifecycle.
Moving the routing setup to device_alloc_chan_resources() is a
reasonable direction, but it would only make sense if REQ and ACK
move together, and it would be a refactor of existing and recently
landed [1] REQ code in the same change. Should we go this way ?
[1] https://lore.kernel.org/all/20260105114445.878262-1-cosmin-gabriel.tanislav.xa@renesas.com/
Regards,
John
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-05-11 21:04 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-02 16:22 [PATCh v3 0/2] Add DMA ACK signal routing for RZ/V2H family John Madieu
2026-04-02 16:22 ` [PATCh v3 1/2] irqchip/renesas-rzv2h: Add DMA ACK signal routing support John Madieu
2026-04-29 7:23 ` Thomas Gleixner
2026-04-02 16:22 ` [PATCh v3 2/2] dma: sh: rz-dmac: " John Madieu
2026-05-07 18:49 ` Frank Li
2026-05-11 17:04 ` John Madieu
2026-05-11 20:20 ` Frank Li
2026-05-11 21:04 ` John Madieu
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.