* Re: [PATCH 35/60] kvm: Add VCPU plane-scheduling state and helpers
From: James Bottomley @ 2026-06-09 15:06 UTC (permalink / raw)
To: Jörg Rödel
Cc: Paolo Bonzini, Sean Christopherson, Tom Lendacky, ashish.kalra,
michael.roth, nsaenz, anelkz, Melody Wang, kvm, linux-kernel,
kvmarm, loongarch, linux-mips, linuxppc-dev, kvm-riscv, x86,
coconut-svsm, joerg.roedel
In-Reply-To: <aigifVmRZA0TXIrK@8bytes.org>
On Tue, 2026-06-09 at 16:27 +0200, Jörg Rödel wrote:
> Hi James,
>
> On Tue, Jun 09, 2026 at 08:59:02AM -0400, James Bottomley wrote:
> > Are the details of this anywhere? The last PUCK information I saw
> > on the kvm list was the cancellation of the March and April calls.
>
> Here is the calendar link I use, which has the appointments GMeet
> links:
>
> https://calendar.google.com/calendar/embed?src=c_61a5b1f644739bf5bed7e5ea5fc3669ce32a2544c5db1c7c891702ca5090c7d5%40group.calendar.google.com
Thanks. For people who don't use gmail, google does have a well hidden
ical link:
https://calendar.google.com/calendar/ical/c_61a5b1f644739bf5bed7e5ea5fc3669ce32a2544c5db1c7c891702ca5090c7d5%40group.calendar.google.com/public/basic.ics
Regards,
James
^ permalink raw reply
* [PATCHv3 00/15] dmaengine: fsldma: devm conversion, fixups, and cleanups
From: Rosen Penev @ 2026-06-09 22:19 UTC (permalink / raw)
To: dmaengine
Cc: Vinod Koul, Frank Li, Zhang Wei, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt, open list,
open list:FREESCALE DMA DRIVER,
open list:CLANG/LLVM BUILD SUPPORT:Keyword:b(?i:clang|llvm)b
- Kill the channel tasklet before removal to prevent a race with
the IRQ handler.
- Check the return value of dma_async_device_register() instead
of silently returning success.
- Replace the powerpc-specific I/O accessors with portable
generic ones so the driver can be built on non-powerpc
architectures.
Build-tested with LLVM=1 ARCH=powerpc allmodconfig
v3: even more sashiko fixes
v2: add extra fixes to satisfy sashiko
Rosen Penev (15):
dmaengine: fsldma: kill tasklet before removing channel
dmaengine: fsldma: drop desc_lock before invoking client callback
dmaengine: fsldma: halt DMA engine before freeing resources
dmaengine: fsldma: provide device_release callback
dmaengine: fsldma: check dma_async_device_register() return value
dmaengine: fsldma: fix probe error path not freeing IRQs
dmaengine: fsldma: fix request_irqs unwind freeing unregistered IRQ
dmaengine: fsldma: convert to platform_get_irq_optional()
dmaengine: fsldma: use devm for kzalloc()
dmaengine: fsldma: use devm_platform_ioremap_resource()
dmaengine: fsldma: convert channel allocation to devm_kzalloc()
dmaengine: fsldma: use devm for of_iomap()
dmaengine: fsldma: replace irq_of_parse_and_map with of_irq_get
dmaengine: fsldma: replace ppc-specific accessors with portable
generic ones
dmaengine: fsldma: fix kernel-doc param names to match function
signatures
drivers/dma/Kconfig | 2 +-
drivers/dma/fsldma.c | 253 +++++++++++++++++++++++--------------------
drivers/dma/fsldma.h | 35 +++++-
3 files changed, 167 insertions(+), 123 deletions(-)
--
2.54.0
^ permalink raw reply
* [PATCHv3 01/15] dmaengine: fsldma: kill tasklet before removing channel
From: Rosen Penev @ 2026-06-09 22:19 UTC (permalink / raw)
To: dmaengine
Cc: Vinod Koul, Frank Li, Zhang Wei, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt, open list,
open list:FREESCALE DMA DRIVER,
open list:CLANG/LLVM BUILD SUPPORT:Keyword:b(?i:clang|llvm)b
In-Reply-To: <20260609221926.35538-1-rosenp@gmail.com>
Add tasklet_kill() in fsl_dma_chan_remove() to prevent a race
where the tasklet, scheduled by the IRQ handler, runs after
the channel has been freed.
Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/dma/fsldma.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
index 22d62d958abd..0e2f84862261 100644
--- a/drivers/dma/fsldma.c
+++ b/drivers/dma/fsldma.c
@@ -1205,6 +1205,7 @@ static int fsl_dma_chan_probe(struct fsldma_device *fdev,
static void fsl_dma_chan_remove(struct fsldma_chan *chan)
{
+ tasklet_kill(&chan->tasklet);
irq_dispose_mapping(chan->irq);
list_del(&chan->common.device_node);
iounmap(chan->regs);
--
2.54.0
^ permalink raw reply related
* [PATCHv3 02/15] dmaengine: fsldma: drop desc_lock before invoking client callback
From: Rosen Penev @ 2026-06-09 22:19 UTC (permalink / raw)
To: dmaengine
Cc: Vinod Koul, Frank Li, Zhang Wei, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt, open list,
open list:FREESCALE DMA DRIVER,
open list:CLANG/LLVM BUILD SUPPORT:Keyword:b(?i:clang|llvm)b
In-Reply-To: <20260609221926.35538-1-rosenp@gmail.com>
fsldma_run_tx_complete_actions() calls dmaengine_desc_get_callback_invoke()
while still holding chan->desc_lock. If the client submits a new
transaction from their completion callback, fsl_dma_tx_submit()
tries to acquire the same non-recursive spinlock, causing a
self-deadlock.
Fix by extracting the callback info under the lock, removing the
descriptor from ld_running, dropping the lock, then invoking the
callback and running dependencies outside the lock.
Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/dma/fsldma.c | 108 ++++++++++++++++++++++---------------------
1 file changed, 55 insertions(+), 53 deletions(-)
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
index 0e2f84862261..455d21d738de 100644
--- a/drivers/dma/fsldma.c
+++ b/drivers/dma/fsldma.c
@@ -496,16 +496,19 @@ static void fsldma_clean_completed_descriptor(struct fsldma_chan *chan)
}
/**
- * fsldma_run_tx_complete_actions - cleanup a single link descriptor
+ * fsldma_run_tx_complete_actions - unmap and extract callback from a descriptor
* @chan: Freescale DMA channel
- * @desc: descriptor to cleanup and free
+ * @desc: descriptor to process
* @cookie: Freescale DMA transaction identifier
+ * @cb: returned callback information
*
- * This function is used on a descriptor which has been executed by the DMA
- * controller. It will run any callbacks, submit any dependencies.
+ * Unmap the descriptor if it has been submitted and extract its callback
+ * into @cb. The caller must invoke the callback and run dependencies
+ * after releasing chan->desc_lock.
*/
static dma_cookie_t fsldma_run_tx_complete_actions(struct fsldma_chan *chan,
- struct fsl_desc_sw *desc, dma_cookie_t cookie)
+ struct fsl_desc_sw *desc, dma_cookie_t cookie,
+ struct dmaengine_desc_callback *cb)
{
struct dma_async_tx_descriptor *txd = &desc->async_tx;
dma_cookie_t ret = cookie;
@@ -514,49 +517,14 @@ static dma_cookie_t fsldma_run_tx_complete_actions(struct fsldma_chan *chan,
if (txd->cookie > 0) {
ret = txd->cookie;
-
dma_descriptor_unmap(txd);
- /* Run the link descriptor callback function */
- dmaengine_desc_get_callback_invoke(txd, NULL);
}
- /* Run any dependencies */
- dma_run_dependencies(txd);
+ dmaengine_desc_get_callback(txd, cb);
return ret;
}
-/**
- * fsldma_clean_running_descriptor - move the completed descriptor from
- * ld_running to ld_completed
- * @chan: Freescale DMA channel
- * @desc: the descriptor which is completed
- *
- * Free the descriptor directly if acked by async_tx api, or move it to
- * queue ld_completed.
- */
-static void fsldma_clean_running_descriptor(struct fsldma_chan *chan,
- struct fsl_desc_sw *desc)
-{
- /* Remove from the list of transactions */
- list_del(&desc->node);
-
- /*
- * the client is allowed to attach dependent operations
- * until 'ack' is set
- */
- if (!async_tx_test_ack(&desc->async_tx)) {
- /*
- * Move this descriptor to the list of descriptors which is
- * completed, but still awaiting the 'ack' bit to be set.
- */
- list_add_tail(&desc->node, &chan->ld_completed);
- return;
- }
-
- dma_pool_free(chan->desc_pool, desc, desc->async_tx.phys);
-}
-
/**
* fsl_chan_xfer_ld_queue - transfer any pending transactions
* @chan : Freescale DMA channel
@@ -635,22 +603,23 @@ static void fsl_chan_xfer_ld_queue(struct fsldma_chan *chan)
*/
static void fsldma_cleanup_descriptors(struct fsldma_chan *chan)
{
- struct fsl_desc_sw *desc, *_desc;
+ struct fsl_desc_sw *desc;
dma_cookie_t cookie = 0;
dma_addr_t curr_phys = get_cdar(chan);
int seen_current = 0;
fsldma_clean_completed_descriptor(chan);
- /* Run the callback for each descriptor, in order */
- list_for_each_entry_safe(desc, _desc, &chan->ld_running, node) {
- /*
- * do not advance past the current descriptor loaded into the
- * hardware channel, subsequent descriptors are either in
- * process or have not been submitted
- */
- if (seen_current)
- break;
+ /*
+ * Take descriptors one at a time from the front of the running
+ * queue. We re-read the list each iteration so that we don't
+ * chase a stale next pointer across the lock-drop below.
+ */
+ while (!seen_current && !list_empty(&chan->ld_running)) {
+ struct dmaengine_desc_callback cb;
+
+ desc = list_first_entry(&chan->ld_running,
+ struct fsl_desc_sw, node);
/*
* stop the search if we reach the current descriptor and the
@@ -662,9 +631,42 @@ static void fsldma_cleanup_descriptors(struct fsldma_chan *chan)
break;
}
- cookie = fsldma_run_tx_complete_actions(chan, desc, cookie);
+ cookie = fsldma_run_tx_complete_actions(chan, desc, cookie, &cb);
- fsldma_clean_running_descriptor(chan, desc);
+ /*
+ * Remove from the running list before dropping the lock so
+ * that terminate_all cannot free this descriptor while we
+ * call into the client below.
+ */
+ list_del(&desc->node);
+
+ /*
+ * Prevent dma_run_dependencies() from calling
+ * fsl_chan_xfer_ld_queue() while we are not holding the
+ * lock. That would splice pending descriptors into
+ * ld_running before they have been completed by hardware.
+ * fsl_chan_xfer_ld_queue at the end of this function will
+ * re-evaluate the situation.
+ */
+ chan->idle = false;
+
+ /*
+ * Drop the lock before invoking the client callback, since
+ * the DMAengine API explicitly allows clients to submit new
+ * transactions from their completion callback. Otherwise
+ * we self-deadlock on chan->desc_lock.
+ */
+ spin_unlock(&chan->desc_lock);
+ dmaengine_desc_callback_invoke(&cb, NULL);
+ dma_run_dependencies(&desc->async_tx);
+ spin_lock(&chan->desc_lock);
+
+ chan->idle = true;
+
+ if (!async_tx_test_ack(&desc->async_tx))
+ list_add_tail(&desc->node, &chan->ld_completed);
+ else
+ dma_pool_free(chan->desc_pool, desc, desc->async_tx.phys);
}
/*
--
2.54.0
^ permalink raw reply related
* [PATCHv3 03/15] dmaengine: fsldma: halt DMA engine before freeing resources
From: Rosen Penev @ 2026-06-09 22:19 UTC (permalink / raw)
To: dmaengine
Cc: Vinod Koul, Frank Li, Zhang Wei, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt, open list,
open list:FREESCALE DMA DRIVER,
open list:CLANG/LLVM BUILD SUPPORT:Keyword:b(?i:clang|llvm)b
In-Reply-To: <20260609221926.35538-1-rosenp@gmail.com>
When a channel is released (fsl_dma_free_chan_resources) or the driver is
unbound (fsl_dma_chan_remove), the descriptor pool and channel resources
are freed without stopping the DMA hardware first. An active transfer
could continue executing in the background, fetching descriptors or
writing data to physical memory pages that have already been freed.
Fix by calling dma_halt() in both paths before cleaning up, matching
the pattern already used in fsl_dma_device_terminate_all().
Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/dma/fsldma.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
index 455d21d738de..1ba10d065278 100644
--- a/drivers/dma/fsldma.c
+++ b/drivers/dma/fsldma.c
@@ -748,6 +748,7 @@ static void fsl_dma_free_chan_resources(struct dma_chan *dchan)
chan_dbg(chan, "free all channel resources\n");
spin_lock_bh(&chan->desc_lock);
+ dma_halt(chan);
fsldma_cleanup_descriptors(chan);
fsldma_free_desc_list(chan, &chan->ld_pending);
fsldma_free_desc_list(chan, &chan->ld_running);
@@ -1207,6 +1208,10 @@ static int fsl_dma_chan_probe(struct fsldma_device *fdev,
static void fsl_dma_chan_remove(struct fsldma_chan *chan)
{
+ spin_lock_bh(&chan->desc_lock);
+ dma_halt(chan);
+ spin_unlock_bh(&chan->desc_lock);
+
tasklet_kill(&chan->tasklet);
irq_dispose_mapping(chan->irq);
list_del(&chan->common.device_node);
--
2.54.0
^ permalink raw reply related
* [PATCHv3 05/15] dmaengine: fsldma: check dma_async_device_register() return value
From: Rosen Penev @ 2026-06-09 22:19 UTC (permalink / raw)
To: dmaengine
Cc: Vinod Koul, Frank Li, Zhang Wei, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt, open list,
open list:FREESCALE DMA DRIVER,
open list:CLANG/LLVM BUILD SUPPORT:Keyword:b(?i:clang|llvm)b
In-Reply-To: <20260609221926.35538-1-rosenp@gmail.com>
Check the return value of dma_async_device_register() in the probe
path and propagate errors instead of silently returning success.
Previously, a registration failure would cause a NULL pointer
dereference in list_del_rcu() during remove when
dma_async_device_unregister() tried to remove the device's
global_node from a list it was never added to.
Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/dma/fsldma.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
index 43d817f6ded1..3009e1531292 100644
--- a/drivers/dma/fsldma.c
+++ b/drivers/dma/fsldma.c
@@ -1303,7 +1303,11 @@ static int fsldma_of_probe(struct platform_device *op)
goto out_free_fdev;
}
- dma_async_device_register(&fdev->common);
+ err = dma_async_device_register(&fdev->common);
+ if (err) {
+ dev_err(fdev->dev, "unable to register DMA device\n");
+ goto out_free_fdev;
+ }
return 0;
out_free_fdev:
--
2.54.0
^ permalink raw reply related
* [PATCHv3 04/15] dmaengine: fsldma: provide device_release callback
From: Rosen Penev @ 2026-06-09 22:19 UTC (permalink / raw)
To: dmaengine
Cc: Vinod Koul, Frank Li, Zhang Wei, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt, open list,
open list:FREESCALE DMA DRIVER,
open list:CLANG/LLVM BUILD SUPPORT:Keyword:b(?i:clang|llvm)b
In-Reply-To: <20260609221926.35538-1-rosenp@gmail.com>
The DMA core requires drivers to set dma_device.device_release so that
the container structure is only freed after all references to it have
been dropped (see the comment above dma_async_device_register()).
This driver violated that contract: fdev was devm_kzalloc()'d with no
device_release callback. If a client still held a channel reference
when the driver was unbound, dma_device_release() would eventually
run on freed memory, causing a use-after-free.
Fix by allocating fdev with kzalloc_obj(), adding
fsldma_device_release() to free it, and setting device_release.
fsldma_of_remove() now saves channel pointers and frees IRQs before
calling dma_async_device_unregister(), since fdev may be freed by
the release callback inside that call.
Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/dma/fsldma.c | 27 ++++++++++++++++++++++-----
1 file changed, 22 insertions(+), 5 deletions(-)
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
index 1ba10d065278..43d817f6ded1 100644
--- a/drivers/dma/fsldma.c
+++ b/drivers/dma/fsldma.c
@@ -1219,6 +1219,8 @@ static void fsl_dma_chan_remove(struct fsldma_chan *chan)
kfree(chan);
}
+static void fsldma_device_release(struct dma_device *dma_dev);
+
static int fsldma_of_probe(struct platform_device *op)
{
struct fsldma_device *fdev;
@@ -1257,6 +1259,7 @@ static int fsldma_of_probe(struct platform_device *op)
fdev->common.device_issue_pending = fsl_dma_memcpy_issue_pending;
fdev->common.device_config = fsl_dma_device_config;
fdev->common.device_terminate_all = fsl_dma_device_terminate_all;
+ fdev->common.device_release = fsldma_device_release;
fdev->common.dev = &op->dev;
fdev->common.src_addr_widths = FSL_DMA_BUSWIDTHS;
@@ -1316,19 +1319,33 @@ static int fsldma_of_probe(struct platform_device *op)
return err;
}
+static void fsldma_device_release(struct dma_device *dma_dev)
+{
+ struct fsldma_device *fdev = container_of(dma_dev, struct fsldma_device,
+ common);
+ kfree(fdev);
+}
+
static void fsldma_of_remove(struct platform_device *op)
{
- struct fsldma_device *fdev;
+ struct fsldma_device *fdev = platform_get_drvdata(op);
+ struct fsldma_chan *chans[FSL_DMA_MAX_CHANS_PER_DEVICE];
unsigned int i;
- fdev = platform_get_drvdata(op);
- dma_async_device_unregister(&fdev->common);
+ for (i = 0; i < FSL_DMA_MAX_CHANS_PER_DEVICE; i++)
+ chans[i] = fdev->chan[i];
fsldma_free_irqs(fdev);
+ /*
+ * fdev may be freed by fsldma_device_release inside this call;
+ * use saved copies of the channel pointers afterwards.
+ */
+ dma_async_device_unregister(&fdev->common);
+
for (i = 0; i < FSL_DMA_MAX_CHANS_PER_DEVICE; i++) {
- if (fdev->chan[i])
- fsl_dma_chan_remove(fdev->chan[i]);
+ if (chans[i])
+ fsl_dma_chan_remove(chans[i]);
}
irq_dispose_mapping(fdev->irq);
--
2.54.0
^ permalink raw reply related
* [PATCHv3 06/15] dmaengine: fsldma: fix probe error path not freeing IRQs
From: Rosen Penev @ 2026-06-09 22:19 UTC (permalink / raw)
To: dmaengine
Cc: Vinod Koul, Frank Li, Zhang Wei, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt, open list,
open list:FREESCALE DMA DRIVER,
open list:CLANG/LLVM BUILD SUPPORT:Keyword:b(?i:clang|llvm)b
In-Reply-To: <20260609221926.35538-1-rosenp@gmail.com>
If dma_async_device_register() fails after fsldma_request_irqs()
succeeded, the error path jumped to out_free_fdev which only removed
channels but never freed the already-registered IRQs. A subsequent
interrupt would access freed memory.
Fix by adding an out_free_irqs label that calls fsldma_free_irqs()
before falling through to the existing channel cleanup.
Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/dma/fsldma.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
index 3009e1531292..4475d50a94f5 100644
--- a/drivers/dma/fsldma.c
+++ b/drivers/dma/fsldma.c
@@ -1306,10 +1306,12 @@ static int fsldma_of_probe(struct platform_device *op)
err = dma_async_device_register(&fdev->common);
if (err) {
dev_err(fdev->dev, "unable to register DMA device\n");
- goto out_free_fdev;
+ goto out_free_irqs;
}
return 0;
+out_free_irqs:
+ fsldma_free_irqs(fdev);
out_free_fdev:
for (i = 0; i < FSL_DMA_MAX_CHANS_PER_DEVICE; i++) {
if (fdev->chan[i])
--
2.54.0
^ permalink raw reply related
* [PATCHv3 07/15] dmaengine: fsldma: fix request_irqs unwind freeing unregistered IRQ
From: Rosen Penev @ 2026-06-09 22:19 UTC (permalink / raw)
To: dmaengine
Cc: Vinod Koul, Frank Li, Zhang Wei, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt, open list,
open list:FREESCALE DMA DRIVER,
open list:CLANG/LLVM BUILD SUPPORT:Keyword:b(?i:clang|llvm)b
In-Reply-To: <20260609221926.35538-1-rosenp@gmail.com>
When fsldma_request_irqs() fails on a per-channel IRQ, the unwind
loop starts at the current index i, which calls free_irq() on the
IRQ that request_irq() just failed to register. Decrement i before
the loop to skip the failed channel.
Bug introduced by commit 586f54672b33 ("dmaengine: fsldma: convert
to platform_get_irq_optional()").
Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/dma/fsldma.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
index 4475d50a94f5..c04a7fbd2ed0 100644
--- a/drivers/dma/fsldma.c
+++ b/drivers/dma/fsldma.c
@@ -1088,7 +1088,7 @@ static int fsldma_request_irqs(struct fsldma_device *fdev)
return 0;
out_unwind:
- for (/* none */; i >= 0; i--) {
+ for (i--; i >= 0; i--) {
chan = fdev->chan[i];
if (!chan)
continue;
--
2.54.0
^ permalink raw reply related
* [PATCHv3 08/15] dmaengine: fsldma: convert to platform_get_irq_optional()
From: Rosen Penev @ 2026-06-09 22:19 UTC (permalink / raw)
To: dmaengine
Cc: Vinod Koul, Frank Li, Zhang Wei, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt, open list,
open list:FREESCALE DMA DRIVER,
open list:CLANG/LLVM BUILD SUPPORT:Keyword:b(?i:clang|llvm)b
In-Reply-To: <20260609221926.35538-1-rosenp@gmail.com>
Replace the per-controller irq_of_parse_and_map() call with
platform_get_irq_optional(). The controller IRQ is optional -- when
absent (-ENXIO) the driver falls back to per-channel IRQs. Any other
error is treated as fatal. The corresponding irq_dispose_mapping()
calls in the probe error path and remove function are removed.
The per-channel IRQ mapping in fsl_dma_chan_probe() uses a child
device_node rather than the platform device's of_node, so it is not
converted here.
Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/dma/fsldma.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
index c04a7fbd2ed0..eba194d64105 100644
--- a/drivers/dma/fsldma.c
+++ b/drivers/dma/fsldma.c
@@ -1213,7 +1213,6 @@ static void fsl_dma_chan_remove(struct fsldma_chan *chan)
spin_unlock_bh(&chan->desc_lock);
tasklet_kill(&chan->tasklet);
- irq_dispose_mapping(chan->irq);
list_del(&chan->common.device_node);
iounmap(chan->regs);
kfree(chan);
@@ -1248,7 +1247,14 @@ static int fsldma_of_probe(struct platform_device *op)
}
/* map the channel IRQ if it exists, but don't hookup the handler yet */
- fdev->irq = irq_of_parse_and_map(op->dev.of_node, 0);
+ fdev->irq = platform_get_irq_optional(op, 0);
+ if (fdev->irq < 0) {
+ if (fdev->irq != -ENXIO) {
+ err = fdev->irq;
+ goto out_iounmap;
+ }
+ fdev->irq = 0;
+ }
dma_cap_set(DMA_MEMCPY, fdev->common.cap_mask);
dma_cap_set(DMA_SLAVE, fdev->common.cap_mask);
@@ -1317,7 +1323,7 @@ static int fsldma_of_probe(struct platform_device *op)
if (fdev->chan[i])
fsl_dma_chan_remove(fdev->chan[i]);
}
- irq_dispose_mapping(fdev->irq);
+out_iounmap:
iounmap(fdev->regs);
out_free:
kfree(fdev);
@@ -1353,7 +1359,6 @@ static void fsldma_of_remove(struct platform_device *op)
if (chans[i])
fsl_dma_chan_remove(chans[i]);
}
- irq_dispose_mapping(fdev->irq);
iounmap(fdev->regs);
kfree(fdev);
--
2.54.0
^ permalink raw reply related
* [PATCHv3 09/15] dmaengine: fsldma: use devm for kzalloc()
From: Rosen Penev @ 2026-06-09 22:19 UTC (permalink / raw)
To: dmaengine
Cc: Vinod Koul, Frank Li, Zhang Wei, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt, open list,
open list:FREESCALE DMA DRIVER,
open list:CLANG/LLVM BUILD SUPPORT:Keyword:b(?i:clang|llvm)b
In-Reply-To: <20260609221926.35538-1-rosenp@gmail.com>
Convert fdev allocation from kzalloc_obj() to devm_kzalloc() to simplify
the probe error and remove paths by dropping the explicit kfree.
Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/dma/fsldma.c | 18 ++++++------------
1 file changed, 6 insertions(+), 12 deletions(-)
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
index eba194d64105..dac12de06ef5 100644
--- a/drivers/dma/fsldma.c
+++ b/drivers/dma/fsldma.c
@@ -1222,18 +1222,17 @@ static void fsldma_device_release(struct dma_device *dma_dev);
static int fsldma_of_probe(struct platform_device *op)
{
+ struct device *dev = &op->dev;
struct fsldma_device *fdev;
struct device_node *child;
unsigned int i;
int err;
- fdev = kzalloc_obj(*fdev);
- if (!fdev) {
- err = -ENOMEM;
- goto out_return;
- }
+ fdev = devm_kzalloc(dev, sizeof(*fdev), GFP_KERNEL);
+ if (!fdev)
+ return -ENOMEM;
- fdev->dev = &op->dev;
+ fdev->dev = dev;
INIT_LIST_HEAD(&fdev->common.channels);
/* The DMA address bits supported for this device. */
fdev->addr_bits = (long)device_get_match_data(fdev->dev);
@@ -1242,8 +1241,7 @@ static int fsldma_of_probe(struct platform_device *op)
fdev->regs = of_iomap(op->dev.of_node, 0);
if (!fdev->regs) {
dev_err(&op->dev, "unable to ioremap registers\n");
- err = -ENOMEM;
- goto out_free;
+ return -ENOMEM;
}
/* map the channel IRQ if it exists, but don't hookup the handler yet */
@@ -1325,9 +1323,6 @@ static int fsldma_of_probe(struct platform_device *op)
}
out_iounmap:
iounmap(fdev->regs);
-out_free:
- kfree(fdev);
-out_return:
return err;
}
@@ -1361,7 +1356,6 @@ static void fsldma_of_remove(struct platform_device *op)
}
iounmap(fdev->regs);
- kfree(fdev);
}
#ifdef CONFIG_PM
--
2.54.0
^ permalink raw reply related
* [PATCHv3 10/15] dmaengine: fsldma: use devm_platform_ioremap_resource()
From: Rosen Penev @ 2026-06-09 22:19 UTC (permalink / raw)
To: dmaengine
Cc: Vinod Koul, Frank Li, Zhang Wei, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt, open list,
open list:FREESCALE DMA DRIVER,
open list:CLANG/LLVM BUILD SUPPORT:Keyword:b(?i:clang|llvm)b
In-Reply-To: <20260609221926.35538-1-rosenp@gmail.com>
Convert of_iomap() to devm_platform_ioremap_resource() to let the devm
framework handle unmapping. This allows removing the out_iounmap
label and the explicit iounmap() in both the probe error path and
the remove function.
The DGSR (fdev->regs) and per-channel registers (chan->regs) map
physically distinct regions in all supported variants
(EloPlus/Elo/Elo3), so there is no overlap risk.
Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/dma/fsldma.c | 18 +++++-------------
1 file changed, 5 insertions(+), 13 deletions(-)
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
index dac12de06ef5..e4a3315a7d9d 100644
--- a/drivers/dma/fsldma.c
+++ b/drivers/dma/fsldma.c
@@ -1238,19 +1238,15 @@ static int fsldma_of_probe(struct platform_device *op)
fdev->addr_bits = (long)device_get_match_data(fdev->dev);
/* ioremap the registers for use */
- fdev->regs = of_iomap(op->dev.of_node, 0);
- if (!fdev->regs) {
- dev_err(&op->dev, "unable to ioremap registers\n");
- return -ENOMEM;
- }
+ fdev->regs = devm_platform_ioremap_resource(op, 0);
+ if (IS_ERR(fdev->regs))
+ return PTR_ERR(fdev->regs);
/* map the channel IRQ if it exists, but don't hookup the handler yet */
fdev->irq = platform_get_irq_optional(op, 0);
if (fdev->irq < 0) {
- if (fdev->irq != -ENXIO) {
- err = fdev->irq;
- goto out_iounmap;
- }
+ if (fdev->irq != -ENXIO)
+ return fdev->irq;
fdev->irq = 0;
}
@@ -1321,8 +1317,6 @@ static int fsldma_of_probe(struct platform_device *op)
if (fdev->chan[i])
fsl_dma_chan_remove(fdev->chan[i]);
}
-out_iounmap:
- iounmap(fdev->regs);
return err;
}
@@ -1354,8 +1348,6 @@ static void fsldma_of_remove(struct platform_device *op)
if (chans[i])
fsl_dma_chan_remove(chans[i]);
}
-
- iounmap(fdev->regs);
}
#ifdef CONFIG_PM
--
2.54.0
^ permalink raw reply related
* [PATCHv3 11/15] dmaengine: fsldma: convert channel allocation to devm_kzalloc()
From: Rosen Penev @ 2026-06-09 22:19 UTC (permalink / raw)
To: dmaengine
Cc: Vinod Koul, Frank Li, Zhang Wei, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt, open list,
open list:FREESCALE DMA DRIVER,
open list:CLANG/LLVM BUILD SUPPORT:Keyword:b(?i:clang|llvm)b
In-Reply-To: <20260609221926.35538-1-rosenp@gmail.com>
Convert fsl_dma_chan_probe from kzalloc_obj() to devm_kzalloc(), tying
the channel lifetime to the parent DMA device. Remove kfree(chan) in both
the probe error path and the remove function.
Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/dma/fsldma.c | 12 +++---------
1 file changed, 3 insertions(+), 9 deletions(-)
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
index e4a3315a7d9d..0df09789187d 100644
--- a/drivers/dma/fsldma.c
+++ b/drivers/dma/fsldma.c
@@ -1114,11 +1114,9 @@ static int fsl_dma_chan_probe(struct fsldma_device *fdev,
int err;
/* alloc channel */
- chan = kzalloc_obj(*chan);
- if (!chan) {
- err = -ENOMEM;
- goto out_return;
- }
+ chan = devm_kzalloc(fdev->dev, sizeof(*chan), GFP_KERNEL);
+ if (!chan)
+ return -ENOMEM;
/* ioremap registers for use */
chan->regs = of_iomap(node, 0);
@@ -1200,9 +1198,6 @@ static int fsl_dma_chan_probe(struct fsldma_device *fdev,
out_iounmap_regs:
iounmap(chan->regs);
-out_free_chan:
- kfree(chan);
-out_return:
return err;
}
@@ -1215,7 +1210,6 @@ static void fsl_dma_chan_remove(struct fsldma_chan *chan)
tasklet_kill(&chan->tasklet);
list_del(&chan->common.device_node);
iounmap(chan->regs);
- kfree(chan);
}
static void fsldma_device_release(struct dma_device *dma_dev);
--
2.54.0
^ permalink raw reply related
* [PATCHv3 12/15] dmaengine: fsldma: use devm for of_iomap()
From: Rosen Penev @ 2026-06-09 22:19 UTC (permalink / raw)
To: dmaengine
Cc: Vinod Koul, Frank Li, Zhang Wei, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt, open list,
open list:FREESCALE DMA DRIVER,
open list:CLANG/LLVM BUILD SUPPORT:Keyword:b(?i:clang|llvm)b
In-Reply-To: <20260609221926.35538-1-rosenp@gmail.com>
Replace of_iomap() with devm_of_iomap() for per-channel register
mappings. This eliminates the iounmap calls in both the probe
error path and fsl_dma_chan_remove, and simplifies the error
handling by returning directly on failure.
Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/dma/fsldma.c | 22 ++++++----------------
1 file changed, 6 insertions(+), 16 deletions(-)
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
index 0df09789187d..a3792864f02a 100644
--- a/drivers/dma/fsldma.c
+++ b/drivers/dma/fsldma.c
@@ -1111,7 +1111,6 @@ static int fsl_dma_chan_probe(struct fsldma_device *fdev,
{
struct fsldma_chan *chan;
struct resource res;
- int err;
/* alloc channel */
chan = devm_kzalloc(fdev->dev, sizeof(*chan), GFP_KERNEL);
@@ -1119,17 +1118,14 @@ static int fsl_dma_chan_probe(struct fsldma_device *fdev,
return -ENOMEM;
/* ioremap registers for use */
- chan->regs = of_iomap(node, 0);
- if (!chan->regs) {
- dev_err(fdev->dev, "unable to ioremap registers\n");
- err = -ENOMEM;
- goto out_free_chan;
- }
+ chan->regs = devm_of_iomap(fdev->dev, node, 0, NULL);
+ if (IS_ERR(chan->regs))
+ return dev_err_probe(fdev->dev, PTR_ERR(chan->regs), "unable to ioremap registers\n");
- err = of_address_to_resource(node, 0, &res);
+ int err = of_address_to_resource(node, 0, &res);
if (err) {
dev_err(fdev->dev, "unable to find 'reg' property\n");
- goto out_iounmap_regs;
+ return err;
}
chan->feature = feature;
@@ -1148,8 +1144,7 @@ static int fsl_dma_chan_probe(struct fsldma_device *fdev,
((res.start - 0x200) & 0xfff) >> 7;
if (chan->id >= FSL_DMA_MAX_CHANS_PER_DEVICE) {
dev_err(fdev->dev, "too many channels for device\n");
- err = -EINVAL;
- goto out_iounmap_regs;
+ return -EINVAL;
}
fdev->chan[chan->id] = chan;
@@ -1195,10 +1190,6 @@ static int fsl_dma_chan_probe(struct fsldma_device *fdev,
chan->irq ? chan->irq : fdev->irq);
return 0;
-
-out_iounmap_regs:
- iounmap(chan->regs);
- return err;
}
static void fsl_dma_chan_remove(struct fsldma_chan *chan)
@@ -1209,7 +1200,6 @@ static void fsl_dma_chan_remove(struct fsldma_chan *chan)
tasklet_kill(&chan->tasklet);
list_del(&chan->common.device_node);
- iounmap(chan->regs);
}
static void fsldma_device_release(struct dma_device *dma_dev);
--
2.54.0
^ permalink raw reply related
* [PATCHv3 13/15] dmaengine: fsldma: replace irq_of_parse_and_map with of_irq_get
From: Rosen Penev @ 2026-06-09 22:19 UTC (permalink / raw)
To: dmaengine
Cc: Vinod Koul, Frank Li, Zhang Wei, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt, open list,
open list:FREESCALE DMA DRIVER,
open list:CLANG/LLVM BUILD SUPPORT:Keyword:b(?i:clang|llvm)b
In-Reply-To: <20260609221926.35538-1-rosenp@gmail.com>
Use of_irq_get() which returns a negative error code on failure
instead of silently returning 0. Split the IRQ validation check
in fsldma_request_irqs to handle three cases:
- chan->irq < 0: propagate the error (e.g. -EPROBE_DEFER)
- chan->irq == 0: IRQ not found, return -ENODEV
- chan->irq > 0: valid IRQ, proceed
The fsldma_free_irqs() function's !chan->irq check is unchanged
since both 0 and negative values mean no IRQ to free.
Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/dma/fsldma.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
index a3792864f02a..7d0c80121aa4 100644
--- a/drivers/dma/fsldma.c
+++ b/drivers/dma/fsldma.c
@@ -1070,6 +1070,12 @@ static int fsldma_request_irqs(struct fsldma_device *fdev)
if (!chan)
continue;
+ if (chan->irq < 0) {
+ if (chan->irq != -EPROBE_DEFER)
+ chan_err(chan, "interrupts property missing in device tree\n");
+ ret = chan->irq;
+ goto out_unwind;
+ }
if (!chan->irq) {
chan_err(chan, "interrupts property missing in device tree\n");
ret = -ENODEV;
@@ -1093,7 +1099,7 @@ static int fsldma_request_irqs(struct fsldma_device *fdev)
if (!chan)
continue;
- if (!chan->irq)
+ if (chan->irq <= 0)
continue;
free_irq(chan->irq, chan);
@@ -1181,7 +1187,7 @@ static int fsl_dma_chan_probe(struct fsldma_device *fdev,
dma_cookie_init(&chan->common);
/* find the IRQ line, if it exists in the device tree */
- chan->irq = irq_of_parse_and_map(node, 0);
+ chan->irq = of_irq_get(node, 0);
/* Add the channel to DMA device channel list */
list_add_tail(&chan->common.device_node, &fdev->common.channels);
--
2.54.0
^ permalink raw reply related
* [PATCHv3 14/15] dmaengine: fsldma: replace ppc-specific accessors with portable generic ones
From: Rosen Penev @ 2026-06-09 22:19 UTC (permalink / raw)
To: dmaengine
Cc: Vinod Koul, Frank Li, Zhang Wei, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt, open list,
open list:FREESCALE DMA DRIVER,
open list:CLANG/LLVM BUILD SUPPORT:Keyword:b(?i:clang|llvm)b
In-Reply-To: <20260609221926.35538-1-rosenp@gmail.com>
- Convert remaining in_be32/in_le32 calls to FSL_DMA_IN macro
- Replace __ilog2 with generic ilog2 (pull in linux/log2.h)
- Add linux/io.h include
- Expand non-PPC accessor support from ARM-only to all architectures
- Guard 64-bit generic accessors with CONFIG_64BIT; provide
emulation using 32-bit accessors on 32-bit platforms
Add COMPILE_TEST support as a result for extra compile coverage.
Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/dma/Kconfig | 2 +-
drivers/dma/fsldma.c | 11 ++++++-----
drivers/dma/fsldma.h | 35 ++++++++++++++++++++++++++++++++---
3 files changed, 39 insertions(+), 9 deletions(-)
diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
index 302021540d76..9b13e7aa31c7 100644
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -206,7 +206,7 @@ config EP93XX_DMA
config FSL_DMA
tristate "Freescale Elo series DMA support"
- depends on FSL_SOC
+ depends on FSL_SOC || COMPILE_TEST
select DMA_ENGINE
select ASYNC_TX_ENABLE_CHANNEL_SWITCH
help
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
index 7d0c80121aa4..d4c9b81ade0d 100644
--- a/drivers/dma/fsldma.c
+++ b/drivers/dma/fsldma.c
@@ -32,6 +32,8 @@
#include <linux/of_address.h>
#include <linux/of_irq.h>
#include <linux/platform_device.h>
+#include <linux/io.h>
+#include <linux/log2.h>
#include <linux/fsldma.h>
#include "dmaengine.h"
#include "fsldma.h"
@@ -266,7 +268,7 @@ static void fsl_chan_set_src_loop_size(struct fsldma_chan *chan, int size)
case 4:
case 8:
mode &= ~FSL_DMA_MR_SAHTS_MASK;
- mode |= FSL_DMA_MR_SAHE | (__ilog2(size) << 14);
+ mode |= FSL_DMA_MR_SAHE | (ilog2(size) << 14);
break;
}
@@ -299,7 +301,7 @@ static void fsl_chan_set_dst_loop_size(struct fsldma_chan *chan, int size)
case 4:
case 8:
mode &= ~FSL_DMA_MR_DAHTS_MASK;
- mode |= FSL_DMA_MR_DAHE | (__ilog2(size) << 16);
+ mode |= FSL_DMA_MR_DAHE | (ilog2(size) << 16);
break;
}
@@ -326,7 +328,7 @@ static void fsl_chan_set_request_count(struct fsldma_chan *chan, int size)
mode = get_mr(chan);
mode &= ~FSL_DMA_MR_BWC_MASK;
- mode |= (__ilog2(size) << 24) & FSL_DMA_MR_BWC_MASK;
+ mode |= (ilog2(size) << 24) & FSL_DMA_MR_BWC_MASK;
set_mr(chan, mode);
}
@@ -1007,8 +1009,7 @@ static irqreturn_t fsldma_ctrl_irq(int irq, void *data)
u32 gsr, mask;
int i;
- gsr = (fdev->feature & FSL_DMA_BIG_ENDIAN) ? in_be32(fdev->regs)
- : in_le32(fdev->regs);
+ gsr = FSL_DMA_IN(fdev, fdev->regs, 32);
mask = 0xff000000;
dev_dbg(fdev->dev, "IRQ: gsr 0x%.8x\n", gsr);
diff --git a/drivers/dma/fsldma.h b/drivers/dma/fsldma.h
index d7b7a3138b85..01f93123b233 100644
--- a/drivers/dma/fsldma.h
+++ b/drivers/dma/fsldma.h
@@ -232,17 +232,46 @@ static void fsl_iowrite64be(u64 val, u64 __iomem *addr)
out_be32((u32 __iomem *)addr + 1, (u32)val);
}
#endif
-#endif
-
-#if defined(CONFIG_ARM64) || defined(CONFIG_ARM)
+#else
#define fsl_ioread32(p) ioread32(p)
#define fsl_ioread32be(p) ioread32be(p)
#define fsl_iowrite32(v, p) iowrite32(v, p)
#define fsl_iowrite32be(v, p) iowrite32be(v, p)
+
+#ifdef CONFIG_64BIT
#define fsl_ioread64(p) ioread64(p)
#define fsl_ioread64be(p) ioread64be(p)
#define fsl_iowrite64(v, p) iowrite64(v, p)
#define fsl_iowrite64be(v, p) iowrite64be(v, p)
+#else
+static inline u64 fsl_ioread64(const u64 __iomem *addr)
+{
+ u32 val_lo = ioread32((u32 __iomem *)addr);
+ u32 val_hi = ioread32((u32 __iomem *)addr + 1);
+
+ return ((u64)val_hi << 32) + val_lo;
+}
+
+static inline void fsl_iowrite64(u64 val, u64 __iomem *addr)
+{
+ iowrite32(val >> 32, (u32 __iomem *)addr + 1);
+ iowrite32((u32)val, (u32 __iomem *)addr);
+}
+
+static inline u64 fsl_ioread64be(const u64 __iomem *addr)
+{
+ u32 val_hi = ioread32be((u32 __iomem *)addr);
+ u32 val_lo = ioread32be((u32 __iomem *)addr + 1);
+
+ return ((u64)val_hi << 32) + val_lo;
+}
+
+static inline void fsl_iowrite64be(u64 val, u64 __iomem *addr)
+{
+ iowrite32be(val >> 32, (u32 __iomem *)addr);
+ iowrite32be((u32)val, (u32 __iomem *)addr + 1);
+}
+#endif
#endif
#define FSL_DMA_IN(fsl_dma, addr, width) \
--
2.54.0
^ permalink raw reply related
* [PATCHv3 15/15] dmaengine: fsldma: fix kernel-doc param names to match function signatures
From: Rosen Penev @ 2026-06-09 22:19 UTC (permalink / raw)
To: dmaengine
Cc: Vinod Koul, Frank Li, Zhang Wei, Nathan Chancellor,
Nick Desaulniers, Bill Wendling, Justin Stitt, open list,
open list:FREESCALE DMA DRIVER,
open list:CLANG/LLVM BUILD SUPPORT:Keyword:b(?i:clang|llvm)b
In-Reply-To: <20260609221926.35538-1-rosenp@gmail.com>
Fix kernel-doc warnings where the documented parameter names
(@chan) no longer match the actual function signatures (@dchan),
and add the missing @cookie and @txstate parameters to
fsl_tx_status.
These are pre-existing mismatches that predate the recent
devm conversion series.
Assisted-by: opencode:big-pickle
Signed-off-by: Rosen Penev <rosenp@gmail.com>
---
drivers/dma/fsldma.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
index d4c9b81ade0d..c0dbcd09999e 100644
--- a/drivers/dma/fsldma.c
+++ b/drivers/dma/fsldma.c
@@ -685,7 +685,7 @@ static void fsldma_cleanup_descriptors(struct fsldma_chan *chan)
/**
* fsl_dma_alloc_chan_resources - Allocate resources for DMA channel.
- * @chan : Freescale DMA channel
+ * @dchan : Freescale DMA channel
*
* This function will create a dma pool for descriptor allocation.
*
@@ -742,7 +742,7 @@ static void fsldma_free_desc_list_reverse(struct fsldma_chan *chan,
/**
* fsl_dma_free_chan_resources - Free all resources of the channel.
- * @chan : Freescale DMA channel
+ * @dchan : Freescale DMA channel
*/
static void fsl_dma_free_chan_resources(struct dma_chan *dchan)
{
@@ -878,7 +878,7 @@ static int fsl_dma_device_config(struct dma_chan *dchan,
/**
* fsl_dma_memcpy_issue_pending - Issue the DMA start command
- * @chan : Freescale DMA channel
+ * @dchan : Freescale DMA channel
*/
static void fsl_dma_memcpy_issue_pending(struct dma_chan *dchan)
{
@@ -891,7 +891,9 @@ static void fsl_dma_memcpy_issue_pending(struct dma_chan *dchan)
/**
* fsl_tx_status - Determine the DMA status
- * @chan : Freescale DMA channel
+ * @dchan : Freescale DMA channel
+ * @cookie : DMA transaction identifier
+ * @txstate : DMA transaction state
*/
static enum dma_status fsl_tx_status(struct dma_chan *dchan,
dma_cookie_t cookie,
--
2.54.0
^ permalink raw reply related
* [powerpc:merge] BUILD SUCCESS 8023f85ecc78c98f0e261248d66fc990c2d06d0c
From: kernel test robot @ 2026-06-09 22:20 UTC (permalink / raw)
To: Madhavan Srinivasan; +Cc: linuxppc-dev
tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git merge
branch HEAD: 8023f85ecc78c98f0e261248d66fc990c2d06d0c Automatic merge of 'next' into merge (2026-06-08 09:50)
elapsed time: 2507m
configs tested: 171
configs skipped: 4
The following configs have been built successfully.
More configs may be tested in the coming days.
tested configs:
alpha allnoconfig gcc-16.1.0
alpha allyesconfig gcc-16.1.0
alpha defconfig gcc-16.1.0
arc allmodconfig gcc-16.1.0
arc allnoconfig gcc-16.1.0
arc allyesconfig clang-23
arc allyesconfig gcc-16.1.0
arc axs101_defconfig gcc-16.1.0
arc defconfig gcc-16.1.0
arc randconfig-001-20260610 gcc-8.5.0
arc randconfig-002-20260610 gcc-8.5.0
arm allnoconfig clang-23
arm allnoconfig gcc-16.1.0
arm allyesconfig gcc-16.1.0
arm defconfig gcc-16.1.0
arm randconfig-001-20260610 gcc-8.5.0
arm randconfig-002-20260610 gcc-8.5.0
arm randconfig-003-20260610 gcc-8.5.0
arm randconfig-004-20260610 gcc-8.5.0
arm64 allmodconfig clang-23
arm64 allnoconfig gcc-16.1.0
arm64 defconfig gcc-16.1.0
arm64 randconfig-001-20260610 gcc-11.5.0
arm64 randconfig-002-20260610 gcc-11.5.0
arm64 randconfig-003-20260610 gcc-11.5.0
arm64 randconfig-004-20260610 gcc-11.5.0
csky allmodconfig gcc-16.1.0
csky allnoconfig gcc-16.1.0
csky defconfig gcc-16.1.0
csky randconfig-001-20260610 gcc-11.5.0
csky randconfig-002-20260610 gcc-11.5.0
hexagon allmodconfig clang-23
hexagon allmodconfig gcc-16.1.0
hexagon allnoconfig clang-23
hexagon allnoconfig gcc-16.1.0
hexagon defconfig gcc-16.1.0
hexagon randconfig-001-20260610 clang-22
hexagon randconfig-002-20260610 clang-22
i386 allmodconfig clang-22
i386 allmodconfig gcc-14
i386 allnoconfig gcc-14
i386 allnoconfig gcc-16.1.0
i386 allyesconfig clang-22
i386 buildonly-randconfig-001-20260610 gcc-14
i386 buildonly-randconfig-002-20260610 gcc-14
i386 buildonly-randconfig-003-20260610 gcc-14
i386 buildonly-randconfig-004-20260610 gcc-14
i386 buildonly-randconfig-005-20260610 gcc-14
i386 buildonly-randconfig-006-20260610 gcc-14
i386 defconfig gcc-16.1.0
i386 randconfig-011-20260610 gcc-14
i386 randconfig-012-20260610 gcc-14
i386 randconfig-013-20260610 gcc-14
i386 randconfig-014-20260610 gcc-14
i386 randconfig-015-20260610 gcc-14
i386 randconfig-016-20260610 gcc-14
i386 randconfig-017-20260610 gcc-14
loongarch allmodconfig clang-19
loongarch allmodconfig clang-23
loongarch allnoconfig clang-20
loongarch allnoconfig gcc-16.1.0
loongarch defconfig clang-23
loongarch randconfig-001-20260610 clang-22
loongarch randconfig-002-20260610 clang-22
m68k allmodconfig gcc-16.1.0
m68k allnoconfig gcc-16.1.0
m68k allyesconfig gcc-16.1.0
m68k defconfig clang-23
microblaze allnoconfig gcc-16.1.0
microblaze allyesconfig gcc-16.1.0
microblaze defconfig clang-23
mips allmodconfig gcc-16.1.0
mips allnoconfig gcc-16.1.0
mips allyesconfig gcc-16.1.0
nios2 allmodconfig clang-20
nios2 allnoconfig clang-23
nios2 allnoconfig gcc-11.5.0
nios2 defconfig clang-23
nios2 randconfig-001-20260610 clang-22
nios2 randconfig-002-20260610 clang-22
openrisc allmodconfig clang-20
openrisc allmodconfig gcc-16.1.0
openrisc allnoconfig clang-23
openrisc allnoconfig gcc-16.1.0
openrisc defconfig gcc-16.1.0
parisc allmodconfig gcc-16.1.0
parisc allnoconfig clang-23
parisc allnoconfig gcc-16.1.0
parisc allyesconfig gcc-16.1.0
parisc defconfig gcc-16.1.0
parisc randconfig-001-20260610 gcc-8.5.0
parisc randconfig-002-20260610 gcc-8.5.0
parisc64 defconfig clang-23
powerpc allmodconfig gcc-16.1.0
powerpc allnoconfig clang-23
powerpc allnoconfig gcc-16.1.0
powerpc microwatt_defconfig gcc-16.1.0
powerpc randconfig-001-20260610 gcc-8.5.0
powerpc randconfig-002-20260610 gcc-8.5.0
powerpc tqm8548_defconfig clang-23
powerpc64 randconfig-001-20260610 gcc-8.5.0
powerpc64 randconfig-002-20260610 gcc-8.5.0
riscv allmodconfig clang-23
riscv allnoconfig clang-23
riscv allnoconfig gcc-16.1.0
riscv allyesconfig clang-23
riscv defconfig gcc-16.1.0
riscv randconfig-001-20260610 gcc-16.1.0
riscv randconfig-002-20260610 gcc-16.1.0
s390 allmodconfig clang-23
s390 allnoconfig clang-23
s390 allyesconfig gcc-16.1.0
s390 defconfig gcc-16.1.0
s390 randconfig-001-20260610 gcc-16.1.0
s390 randconfig-002-20260610 gcc-16.1.0
sh allmodconfig gcc-16.1.0
sh allnoconfig clang-23
sh allnoconfig gcc-16.1.0
sh allyesconfig gcc-16.1.0
sh defconfig gcc-14
sh randconfig-001-20260610 gcc-16.1.0
sh randconfig-002-20260610 gcc-16.1.0
sparc allnoconfig clang-23
sparc allnoconfig gcc-16.1.0
sparc defconfig gcc-16.1.0
sparc randconfig-001-20260610 gcc-14.3.0
sparc randconfig-002-20260610 gcc-14.3.0
sparc64 allmodconfig clang-20
sparc64 defconfig gcc-14
sparc64 randconfig-001-20260610 gcc-14.3.0
sparc64 randconfig-002-20260610 gcc-14.3.0
um allmodconfig clang-23
um allnoconfig clang-16
um allnoconfig clang-23
um allyesconfig gcc-14
um allyesconfig gcc-16.1.0
um defconfig gcc-14
um i386_defconfig gcc-14
um randconfig-001-20260610 gcc-14.3.0
um randconfig-002-20260610 gcc-14.3.0
um x86_64_defconfig gcc-14
x86_64 allmodconfig clang-22
x86_64 allnoconfig clang-22
x86_64 allnoconfig clang-23
x86_64 allyesconfig clang-22
x86_64 buildonly-randconfig-001-20260610 gcc-14
x86_64 buildonly-randconfig-002-20260610 gcc-14
x86_64 buildonly-randconfig-003-20260610 gcc-14
x86_64 buildonly-randconfig-004-20260610 gcc-14
x86_64 buildonly-randconfig-005-20260610 gcc-14
x86_64 buildonly-randconfig-006-20260610 gcc-14
x86_64 defconfig gcc-14
x86_64 kexec clang-22
x86_64 randconfig-011-20260610 gcc-14
x86_64 randconfig-012-20260610 gcc-14
x86_64 randconfig-013-20260610 gcc-14
x86_64 randconfig-014-20260610 gcc-14
x86_64 randconfig-015-20260610 gcc-14
x86_64 randconfig-016-20260610 gcc-14
x86_64 rhel-9.4 clang-22
x86_64 rhel-9.4-bpf gcc-14
x86_64 rhel-9.4-func clang-22
x86_64 rhel-9.4-kselftests clang-22
x86_64 rhel-9.4-kunit gcc-14
x86_64 rhel-9.4-ltp gcc-14
x86_64 rhel-9.4-rust clang-22
xtensa allnoconfig clang-23
xtensa allnoconfig gcc-16.1.0
xtensa allyesconfig clang-20
xtensa randconfig-001-20260610 gcc-14.3.0
xtensa randconfig-002-20260610 gcc-14.3.0
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply
* [powerpc:next-test] BUILD SUCCESS 90b45dbf59d50e32c4f86072545ff44bec9cb28e
From: kernel test robot @ 2026-06-09 22:32 UTC (permalink / raw)
To: Madhavan Srinivasan; +Cc: linuxppc-dev
tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next-test
branch HEAD: 90b45dbf59d50e32c4f86072545ff44bec9cb28e powerpc: Simplify access_ok()
elapsed time: 2156m
configs tested: 180
configs skipped: 3
The following configs have been built successfully.
More configs may be tested in the coming days.
tested configs:
alpha allnoconfig gcc-16.1.0
alpha allyesconfig gcc-16.1.0
alpha defconfig gcc-16.1.0
arc allmodconfig gcc-16.1.0
arc allnoconfig gcc-16.1.0
arc allyesconfig clang-23
arc allyesconfig gcc-16.1.0
arc axs101_defconfig gcc-16.1.0
arc defconfig gcc-16.1.0
arc randconfig-001-20260610 gcc-8.5.0
arc randconfig-002-20260610 gcc-8.5.0
arm allnoconfig clang-23
arm allnoconfig gcc-16.1.0
arm allyesconfig gcc-16.1.0
arm defconfig gcc-16.1.0
arm randconfig-001-20260610 gcc-8.5.0
arm randconfig-002-20260610 gcc-8.5.0
arm randconfig-003-20260610 gcc-8.5.0
arm randconfig-004-20260610 gcc-8.5.0
arm64 allmodconfig clang-23
arm64 allnoconfig gcc-16.1.0
arm64 defconfig gcc-16.1.0
arm64 randconfig-001-20260610 gcc-11.5.0
arm64 randconfig-002-20260610 gcc-11.5.0
arm64 randconfig-003-20260610 gcc-11.5.0
arm64 randconfig-004-20260610 gcc-11.5.0
csky allmodconfig gcc-16.1.0
csky allnoconfig gcc-16.1.0
csky defconfig gcc-16.1.0
csky randconfig-001-20260610 gcc-11.5.0
csky randconfig-002-20260610 gcc-11.5.0
hexagon allmodconfig clang-23
hexagon allmodconfig gcc-16.1.0
hexagon allnoconfig clang-23
hexagon allnoconfig gcc-16.1.0
hexagon defconfig gcc-16.1.0
hexagon randconfig-001-20260610 clang-22
hexagon randconfig-002-20260610 clang-22
i386 allmodconfig clang-22
i386 allmodconfig gcc-14
i386 allnoconfig gcc-14
i386 allnoconfig gcc-16.1.0
i386 allyesconfig clang-22
i386 buildonly-randconfig-001-20260610 gcc-14
i386 buildonly-randconfig-002-20260610 gcc-14
i386 buildonly-randconfig-003-20260610 gcc-14
i386 buildonly-randconfig-004-20260610 gcc-14
i386 buildonly-randconfig-005-20260610 gcc-14
i386 buildonly-randconfig-006-20260610 gcc-14
i386 defconfig gcc-16.1.0
i386 randconfig-011-20260610 gcc-14
i386 randconfig-012-20260610 gcc-14
i386 randconfig-013-20260610 gcc-14
i386 randconfig-014-20260610 gcc-14
i386 randconfig-015-20260610 gcc-14
i386 randconfig-016-20260610 gcc-14
i386 randconfig-017-20260610 gcc-14
loongarch allmodconfig clang-19
loongarch allmodconfig clang-23
loongarch allnoconfig clang-20
loongarch allnoconfig gcc-16.1.0
loongarch defconfig clang-23
loongarch randconfig-001-20260610 clang-22
loongarch randconfig-002-20260610 clang-22
m68k allmodconfig gcc-16.1.0
m68k allnoconfig gcc-16.1.0
m68k allyesconfig gcc-16.1.0
m68k defconfig clang-23
microblaze allnoconfig gcc-16.1.0
microblaze allyesconfig gcc-16.1.0
microblaze defconfig clang-23
mips allmodconfig gcc-16.1.0
mips allnoconfig gcc-16.1.0
mips allyesconfig gcc-16.1.0
nios2 allmodconfig clang-20
nios2 allmodconfig gcc-11.5.0
nios2 allnoconfig clang-23
nios2 allnoconfig gcc-11.5.0
nios2 defconfig clang-23
nios2 randconfig-001-20260610 clang-22
nios2 randconfig-002-20260610 clang-22
openrisc allmodconfig clang-20
openrisc allmodconfig gcc-16.1.0
openrisc allnoconfig clang-23
openrisc allnoconfig gcc-16.1.0
openrisc defconfig gcc-16.1.0
parisc allmodconfig gcc-16.1.0
parisc allnoconfig clang-23
parisc allnoconfig gcc-16.1.0
parisc allyesconfig clang-23
parisc allyesconfig gcc-16.1.0
parisc defconfig gcc-16.1.0
parisc randconfig-001-20260610 gcc-8.5.0
parisc randconfig-002-20260610 gcc-8.5.0
parisc64 defconfig clang-23
powerpc allmodconfig gcc-16.1.0
powerpc allnoconfig clang-23
powerpc allnoconfig gcc-16.1.0
powerpc microwatt_defconfig gcc-16.1.0
powerpc randconfig-001-20260610 gcc-8.5.0
powerpc randconfig-002-20260610 gcc-8.5.0
powerpc tqm8548_defconfig clang-23
powerpc64 randconfig-001-20260610 gcc-8.5.0
powerpc64 randconfig-002-20260610 gcc-8.5.0
riscv allmodconfig clang-23
riscv allnoconfig clang-23
riscv allnoconfig gcc-16.1.0
riscv allyesconfig clang-23
riscv defconfig gcc-16.1.0
riscv randconfig-001-20260610 gcc-16.1.0
riscv randconfig-002-20260610 gcc-16.1.0
s390 allmodconfig clang-23
s390 allnoconfig clang-23
s390 allyesconfig gcc-16.1.0
s390 defconfig gcc-16.1.0
s390 randconfig-001-20260610 gcc-16.1.0
s390 randconfig-002-20260610 gcc-16.1.0
sh allmodconfig gcc-16.1.0
sh allnoconfig clang-23
sh allnoconfig gcc-16.1.0
sh allyesconfig clang-23
sh allyesconfig gcc-16.1.0
sh defconfig gcc-14
sh randconfig-001-20260610 gcc-16.1.0
sh randconfig-002-20260610 gcc-16.1.0
sparc allnoconfig clang-23
sparc allnoconfig gcc-16.1.0
sparc defconfig gcc-16.1.0
sparc randconfig-001-20260610 gcc-14.3.0
sparc randconfig-002-20260610 gcc-14.3.0
sparc64 allmodconfig clang-20
sparc64 defconfig gcc-14
sparc64 randconfig-001-20260610 gcc-14.3.0
sparc64 randconfig-002-20260610 gcc-14.3.0
um allmodconfig clang-23
um allnoconfig clang-16
um allnoconfig clang-23
um allyesconfig gcc-14
um allyesconfig gcc-16.1.0
um defconfig gcc-14
um i386_defconfig gcc-14
um randconfig-001-20260610 gcc-14.3.0
um randconfig-002-20260610 gcc-14.3.0
um x86_64_defconfig gcc-14
x86_64 allmodconfig clang-22
x86_64 allnoconfig clang-22
x86_64 allnoconfig clang-23
x86_64 allyesconfig clang-22
x86_64 buildonly-randconfig-001-20260610 gcc-14
x86_64 buildonly-randconfig-002-20260610 gcc-14
x86_64 buildonly-randconfig-003-20260610 gcc-14
x86_64 buildonly-randconfig-004-20260610 gcc-14
x86_64 buildonly-randconfig-005-20260610 gcc-14
x86_64 buildonly-randconfig-006-20260610 gcc-14
x86_64 defconfig gcc-14
x86_64 kexec clang-22
x86_64 randconfig-011-20260610 gcc-14
x86_64 randconfig-012-20260610 gcc-14
x86_64 randconfig-013-20260610 gcc-14
x86_64 randconfig-014-20260610 gcc-14
x86_64 randconfig-015-20260610 gcc-14
x86_64 randconfig-016-20260610 gcc-14
x86_64 randconfig-071-20260610 gcc-14
x86_64 randconfig-072-20260610 gcc-14
x86_64 randconfig-073-20260610 gcc-14
x86_64 randconfig-074-20260610 gcc-14
x86_64 randconfig-075-20260610 gcc-14
x86_64 randconfig-076-20260610 gcc-14
x86_64 rhel-9.4 clang-22
x86_64 rhel-9.4-bpf gcc-14
x86_64 rhel-9.4-func clang-22
x86_64 rhel-9.4-kselftests clang-22
x86_64 rhel-9.4-kunit gcc-14
x86_64 rhel-9.4-ltp gcc-14
x86_64 rhel-9.4-rust clang-22
xtensa allnoconfig clang-23
xtensa allnoconfig gcc-16.1.0
xtensa allyesconfig clang-20
xtensa randconfig-001-20260610 gcc-14.3.0
xtensa randconfig-002-20260610 gcc-14.3.0
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply
page: | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox