Skip to content

Commit

Permalink
rockchip/64: fix again periodic dma and audio stuttering
Browse files Browse the repository at this point in the history
  • Loading branch information
paolosabatino authored and igorpecovnik committed Feb 23, 2025
1 parent d19444b commit 86691d1
Show file tree
Hide file tree
Showing 14 changed files with 284 additions and 192 deletions.
2 changes: 1 addition & 1 deletion patch/kernel/archive/rockchip-6.12/armbian.series
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@
patches.armbian/general-linux-export-mm-trace-rss-stats.patch
patches.armbian/general-pl330-01-fix-periodic-transfers.patch
patches.armbian/general-pl330-02-add-support-for-interleaved-transfers.patch
patches.armbian/general-pl330-03-fix-data-race-on-tx-transfers.patch
patches.armbian/general-pl330-04-bigger-mcode-buffer.patch
patches.armbian/general-pl330-05-fix-unbalanced-power-down.patch
patches.armbian/general-pl330-06-fix-buffer-underruns.patch
patches.armbian/general-rk322x-gpio-ir-driver.patch
patches.armbian/general-rockchip-various-fixes.patch
patches.armbian/ir-keymap-rk322x-box.patch
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
From 4acf270a6310f5e2dbadac1d5f21d8e7477fade6 Mon Sep 17 00:00:00 2001
From: Paolo Sabatino <paolo.sabatino@gmail.com>
Date: Sun, 16 Feb 2025 11:15:55 +0100
Subject: [PATCH] pl330: fix buffer underrun with cyclic dma

userspace applications (notably, pulseaudio) were
suffering frequent buffer underruns when cyclic DMA
was handled by controller itself. This patch fixes
the buffer underruns avoiding to juggle with the
descriptor state, keeping it in BUSY state as long
as it is actual transfer is progressing.
---
drivers/dma/pl330.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c
index 208e2a089a4d..6dac00995765 100644
--- a/drivers/dma/pl330.c
+++ b/drivers/dma/pl330.c
@@ -1737,11 +1737,11 @@ static void dma_pl330_rqcb(struct dma_pl330_desc *desc, enum pl330_op_err err)
if (!pch)
return;

- spin_lock_irqsave(&pch->lock, flags);
-
- desc->status = DONE;
-
- spin_unlock_irqrestore(&pch->lock, flags);
+ if (!desc->cyclic) {
+ spin_lock_irqsave(&pch->lock, flags);
+ desc->status = DONE;
+ spin_unlock_irqrestore(&pch->lock, flags);
+ }

tasklet_schedule(&pch->task);
}
@@ -2256,23 +2256,23 @@ static void pl330_tasklet(struct tasklet_struct *t)

/* Pick up ripe tomatoes */
list_for_each_entry_safe(desc, _dt, &pch->work_list, node) {
- if (desc->status == DONE) {
- if (!desc->cyclic) {
- dma_cookie_complete(&desc->txd);
- list_move_tail(&desc->node, &pch->completed_list);
- } else {
- struct dmaengine_desc_callback cb;

+ if (desc->cyclic) {
+ if (desc->status == BUSY || desc->status == DONE) {
+ struct dmaengine_desc_callback cb;
desc->status = BUSY;
dmaengine_desc_get_callback(&desc->txd, &cb);
-
if (dmaengine_desc_callback_valid(&cb)) {
spin_unlock_irqrestore(&pch->lock, flags);
dmaengine_desc_callback_invoke(&cb, NULL);
spin_lock_irqsave(&pch->lock, flags);
}
}
+ } else if (desc->status == DONE) {
+ dma_cookie_complete(&desc->txd);
+ list_move_tail(&desc->node, &pch->completed_list);
}
+
}

/* Try to submit a req imm. next to the last completed cookie */
--
2.43.0

2 changes: 1 addition & 1 deletion patch/kernel/archive/rockchip-6.12/series.conf
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@
patches.armbian/general-linux-export-mm-trace-rss-stats.patch
patches.armbian/general-pl330-01-fix-periodic-transfers.patch
patches.armbian/general-pl330-02-add-support-for-interleaved-transfers.patch
patches.armbian/general-pl330-03-fix-data-race-on-tx-transfers.patch
patches.armbian/general-pl330-04-bigger-mcode-buffer.patch
patches.armbian/general-pl330-05-fix-unbalanced-power-down.patch
patches.armbian/general-pl330-06-fix-buffer-underruns.patch
patches.armbian/general-rk322x-gpio-ir-driver.patch
patches.armbian/general-rockchip-various-fixes.patch
patches.armbian/ir-keymap-rk322x-box.patch
Expand Down
2 changes: 1 addition & 1 deletion patch/kernel/archive/rockchip-6.13/armbian.series
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@
patches.armbian/general-linux-export-mm-trace-rss-stats.patch
patches.armbian/general-pl330-01-fix-periodic-transfers.patch
patches.armbian/general-pl330-02-add-support-for-interleaved-transfers.patch
patches.armbian/general-pl330-03-fix-data-race-on-tx-transfers.patch
patches.armbian/general-pl330-04-bigger-mcode-buffer.patch
patches.armbian/general-pl330-05-fix-unbalanced-power-down.patch
patches.armbian/general-pl330-06-fix-buffer-underruns.patch
patches.armbian/general-rk322x-gpio-ir-driver.patch
patches.armbian/general-rockchip-various-fixes.patch
patches.armbian/ir-keymap-rk322x-box.patch
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
From 4acf270a6310f5e2dbadac1d5f21d8e7477fade6 Mon Sep 17 00:00:00 2001
From: Paolo Sabatino <paolo.sabatino@gmail.com>
Date: Sun, 16 Feb 2025 11:15:55 +0100
Subject: [PATCH] pl330: fix buffer underrun with cyclic dma

userspace applications (notably, pulseaudio) were
suffering frequent buffer underruns when cyclic DMA
was handled by controller itself. This patch fixes
the buffer underruns avoiding to juggle with the
descriptor state, keeping it in BUSY state as long
as it is actual transfer is progressing.
---
drivers/dma/pl330.c | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c
index 208e2a089a4d..6dac00995765 100644
--- a/drivers/dma/pl330.c
+++ b/drivers/dma/pl330.c
@@ -1737,11 +1737,11 @@ static void dma_pl330_rqcb(struct dma_pl330_desc *desc, enum pl330_op_err err)
if (!pch)
return;

- spin_lock_irqsave(&pch->lock, flags);
-
- desc->status = DONE;
-
- spin_unlock_irqrestore(&pch->lock, flags);
+ if (!desc->cyclic) {
+ spin_lock_irqsave(&pch->lock, flags);
+ desc->status = DONE;
+ spin_unlock_irqrestore(&pch->lock, flags);
+ }

tasklet_schedule(&pch->task);
}
@@ -2256,23 +2256,23 @@ static void pl330_tasklet(struct tasklet_struct *t)

/* Pick up ripe tomatoes */
list_for_each_entry_safe(desc, _dt, &pch->work_list, node) {
- if (desc->status == DONE) {
- if (!desc->cyclic) {
- dma_cookie_complete(&desc->txd);
- list_move_tail(&desc->node, &pch->completed_list);
- } else {
- struct dmaengine_desc_callback cb;

+ if (desc->cyclic) {
+ if (desc->status == BUSY || desc->status == DONE) {
+ struct dmaengine_desc_callback cb;
desc->status = BUSY;
dmaengine_desc_get_callback(&desc->txd, &cb);
-
if (dmaengine_desc_callback_valid(&cb)) {
spin_unlock_irqrestore(&pch->lock, flags);
dmaengine_desc_callback_invoke(&cb, NULL);
spin_lock_irqsave(&pch->lock, flags);
}
}
+ } else if (desc->status == DONE) {
+ dma_cookie_complete(&desc->txd);
+ list_move_tail(&desc->node, &pch->completed_list);
}
+
}

/* Try to submit a req imm. next to the last completed cookie */
--
2.43.0

2 changes: 1 addition & 1 deletion patch/kernel/archive/rockchip-6.13/series.conf
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@
patches.armbian/general-linux-export-mm-trace-rss-stats.patch
patches.armbian/general-pl330-01-fix-periodic-transfers.patch
patches.armbian/general-pl330-02-add-support-for-interleaved-transfers.patch
patches.armbian/general-pl330-03-fix-data-race-on-tx-transfers.patch
patches.armbian/general-pl330-04-bigger-mcode-buffer.patch
patches.armbian/general-pl330-05-fix-unbalanced-power-down.patch
patches.armbian/general-pl330-06-fix-buffer-underruns.patch
patches.armbian/general-rk322x-gpio-ir-driver.patch
patches.armbian/general-rockchip-various-fixes.patch
patches.armbian/ir-keymap-rk322x-box.patch
Expand Down

This file was deleted.

Loading

0 comments on commit 86691d1

Please sign in to comment.