mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Sam Asadi <asadi.samuel@gmail.com>
To: gregkh@linuxfoundation.org
Cc: devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org,
	Russell King - ARM Linux <linux@arm.linux.org.uk>,
	Russell King <rmk+kernel@arm.linux.org.uk>,
	Vinod Koul <vinod.koul@intel.com>,
	sam-the-6 <asadi.samuel@gmail.com>
Subject: [PATCH 13/94] Update imx-sdma cyclic handling to report residue
Date: Tue, 15 Jul 2014 20:00:28 +0300	[thread overview]
Message-ID: <1405443709-15288-13-git-send-email-asadi.samuel@gmail.com> (raw)
In-Reply-To: <1405443709-15288-1-git-send-email-asadi.samuel@gmail.com>

From: Russell King - ARM Linux <linux@arm.linux.org.uk>

I received a report this morning from one of the Novena developers that
the behaviour of the iMX6 ASoC codec driver (using imx-pcm-dma.c) was
sub-optimal under high system load.

While there are issues relating to system load remaining, upon reviewing
the ASoC imx-pcm-dma.c driver, it was noticed that it not using the
residue support, because SDMA doesn't support it.  This has the effect
that SDMA has to make multiple calls into the ASoC and ALSA code, one
for each period.

Since ALSA's snd_pcm_elapsed() does not need to be called multiple times
and it is entirely sufficient to call it once to update ALSA with the
current buffer position via the pointer method, we can do better here.
We can also avoid stopping the DMA entirely, just like real cyclic DMA
implementations behave.  While this means that we replay some old samples,
this is a nicer behaviour than having audio stop and restart.

The changes to achieve this are relatively minor - imx-sdma.c can track
where the DMA is to the nearest descriptor boundary - it does this
already when deciding how many callbacks to issue.  In doing this,
buf_tail always points at the descriptor which will complete next.

The residue is defined by the bytes remaining to the end of the buffer,
when the buffer is viewed as a single block of memory [start...end].
So, when we start out, there's a full buffer worth of residue, and this
counts down as we approach the end of the buffer, eventually becoming
zero at the end, before returning to the full buffer worth when we
wrap back to the start.

Moving the walking of the descriptors into the interrupt handler means
that we can update the BD_DONE flag at interrupt time, thus avoiding
a delayed tasklet stopping the cyclic DMA.

This means that the residue can be calculated from (total descriptors -
buf_tail) * descriptor size.  This is what the change below does.  We
update imx-pcm-dma.c to remove the NO_RESIDUE flag since we now provide
the residue.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Tested-by: Shawn Guo <shawn.guo@linaro.org>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: sam-the-6 <asadi.samuel@gmail.com>
---
 drivers/dma/imx-sdma.c      |   22 ++++++++++++++++++----
 sound/soc/fsl/imx-pcm-dma.c |    1 -
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c
index 1287146..14867e3 100644
--- a/drivers/dma/imx-sdma.c
+++ b/drivers/dma/imx-sdma.c
@@ -255,6 +255,7 @@ struct sdma_channel {
 	enum dma_slave_buswidth		word_size;
 	unsigned int			buf_tail;
 	unsigned int			num_bd;
+	unsigned int			period_len;
 	struct sdma_buffer_descriptor	*bd;
 	dma_addr_t			bd_phys;
 	unsigned int			pc_from_device, pc_to_device;
@@ -593,6 +594,12 @@ static void sdma_event_disable(struct sdma_channel *sdmac, unsigned int event)
 
 static void sdma_handle_channel_loop(struct sdma_channel *sdmac)
 {
+	if (sdmac->desc.callback)
+		sdmac->desc.callback(sdmac->desc.callback_param);
+}
+
+static void sdma_update_channel_loop(struct sdma_channel *sdmac)
+{
 	struct sdma_buffer_descriptor *bd;
 
 	/*
@@ -611,9 +618,6 @@ static void sdma_handle_channel_loop(struct sdma_channel *sdmac)
 		bd->mode.status |= BD_DONE;
 		sdmac->buf_tail++;
 		sdmac->buf_tail %= sdmac->num_bd;
-
-		if (sdmac->desc.callback)
-			sdmac->desc.callback(sdmac->desc.callback_param);
 	}
 }
 
@@ -669,6 +673,9 @@ static irqreturn_t sdma_int_handler(int irq, void *dev_id)
 		int channel = fls(stat) - 1;
 		struct sdma_channel *sdmac = &sdma->channel[channel];
 
+		if (sdmac->flags & IMX_DMA_SG_LOOP)
+			sdma_update_channel_loop(sdmac);
+
 		tasklet_schedule(&sdmac->tasklet);
 
 		__clear_bit(channel, &stat);
@@ -1129,6 +1136,7 @@ static struct dma_async_tx_descriptor *sdma_prep_dma_cyclic(
 	sdmac->status = DMA_IN_PROGRESS;
 
 	sdmac->buf_tail = 0;
+	sdmac->period_len = period_len;
 
 	sdmac->flags |= IMX_DMA_SG_LOOP;
 	sdmac->direction = direction;
@@ -1225,9 +1233,15 @@ static enum dma_status sdma_tx_status(struct dma_chan *chan,
 				      struct dma_tx_state *txstate)
 {
 	struct sdma_channel *sdmac = to_sdma_chan(chan);
+	u32 residue;
+
+	if (sdmac->flags & IMX_DMA_SG_LOOP)
+		residue = (sdmac->num_bd - sdmac->buf_tail) * sdmac->period_len;
+	else
+		residue = sdmac->chn_count - sdmac->chn_real_count;
 
 	dma_set_tx_state(txstate, chan->completed_cookie, chan->cookie,
-			sdmac->chn_count - sdmac->chn_real_count);
+			 residue);
 
 	return sdmac->status;
 }
diff --git a/sound/soc/fsl/imx-pcm-dma.c b/sound/soc/fsl/imx-pcm-dma.c
index 0849b7b..0db94f49 100644
--- a/sound/soc/fsl/imx-pcm-dma.c
+++ b/sound/soc/fsl/imx-pcm-dma.c
@@ -59,7 +59,6 @@ int imx_pcm_dma_init(struct platform_device *pdev)
 {
 	return devm_snd_dmaengine_pcm_register(&pdev->dev,
 		&imx_dmaengine_pcm_config,
-		SND_DMAENGINE_PCM_FLAG_NO_RESIDUE |
 		SND_DMAENGINE_PCM_FLAG_COMPAT);
 }
 EXPORT_SYMBOL_GPL(imx_pcm_dma_init);
-- 
1.7.10.4


  parent reply	other threads:[~2014-07-15 17:26 UTC|newest]

Thread overview: 99+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-15 17:00 [PATCH 01/94] ARM: shmobile: Add DT and defconfigs to MAINTAINERS Sam Asadi
2014-07-15 17:00 ` [PATCH 02/94] clk: ti: apll: not allocating enough data Sam Asadi
2014-07-15 17:00 ` [PATCH 03/94] clk: ti: dra7: return error code in failure case Sam Asadi
2014-07-15 17:00 ` [PATCH 04/94] clk: ti: am43x: Fix boot with CONFIG_SOC_AM33XX disabled Sam Asadi
2014-07-15 17:00 ` [PATCH 05/94] clk: ti: set CLK_SET_RATE_NO_REPARENT for ti,mux-clock Sam Asadi
2014-07-15 17:00 ` [PATCH 06/94] clk: samsung: fix several typos to fix boot on s3c2410 Sam Asadi
2014-07-15 17:00 ` [PATCH 07/94] clk: samsung: add more aliases for s3c24xx Sam Asadi
2014-07-15 17:00 ` [PATCH 08/94] clk: samsung: exynos4: Remove SRC_MASK_ISP gates Sam Asadi
2014-07-15 17:00 ` [PATCH 09/94] clk: s3c64xx: Hookup SPI clocks correctly Sam Asadi
2014-07-15 17:00 ` [PATCH 10/94] clk/exynos5250: fix bit number for tv sysmmu clock Sam Asadi
2014-07-15 17:00 ` [PATCH 11/94] clk: exynos5420: Remove aclk66_peric from the clock tree description Sam Asadi
2014-07-15 17:00 ` [PATCH 12/94] dma: cppi41: handle 0-length packets Sam Asadi
2014-07-15 17:00 ` Sam Asadi [this message]
2014-07-15 17:00 ` [PATCH 14/94] clk: s2mps11: Fix double free corruption during driver unbind Sam Asadi
2014-07-15 17:00 ` [PATCH 15/94] clk: sunxi: fix devm_ioremap_resource error detection code Sam Asadi
2014-07-15 17:00 ` [PATCH 16/94] ARM: kprobes: Prevent known test failures stopping other tests running Sam Asadi
2014-07-15 17:00 ` [PATCH 17/94] ARM: kprobes: Disallow instructions with PC and register specified shift Sam Asadi
2014-07-15 17:00 ` [PATCH 18/94] ARM: kprobes: Fix test code compilation errors for ARMv4 targets Sam Asadi
2014-07-15 17:00 ` [PATCH 19/94] clk: qcom: HDMI source sel is 3 not 2 Sam Asadi
2014-07-15 17:00 ` [PATCH 20/94] ARM: dts: dra7xx-clocks: Fix the l3 and l4 clock rates Sam Asadi
2014-07-15 17:00 ` [PATCH 21/94] ARM: EXYNOS: Fix the check for non-smp configuration Sam Asadi
2014-07-15 17:00 ` [PATCH 22/94] ARM: dts: fix pwm-cells in pwm node for exynos4 Sam Asadi
2014-07-15 17:00 ` [PATCH 23/94] clocksource: exynos_mct: Fix ftrace Sam Asadi
2014-07-15 17:00 ` [PATCH 24/94] clocksource: exynos_mct: Register the timer for stable udelay Sam Asadi
2014-07-15 17:00 ` [PATCH 25/94] iio: hid-sensor-press: Fix return values Sam Asadi
2014-07-15 17:00 ` [PATCH 26/94] iio: hid-sensor-accel-3d: " Sam Asadi
2014-07-15 17:00 ` [PATCH 27/94] iio: hid-sensor-magn-3d: " Sam Asadi
2014-07-15 17:00 ` [PATCH 28/94] iio: hid-sensor-als: " Sam Asadi
2014-07-15 17:00 ` [PATCH 29/94] iio: hid-sensor-gyro-3d: " Sam Asadi
2014-07-15 17:00 ` [PATCH 30/94] iio: hid-sensor-prox: " Sam Asadi
2014-07-15 17:00 ` [PATCH 31/94] ext4: fix unjournalled bg descriptor while initializing inode bitmap Sam Asadi
2014-07-15 17:00 ` [PATCH 32/94] ext4: clarify error count warning messages Sam Asadi
2014-07-15 17:00 ` [PATCH 33/94] ext4: clarify ext4_error message in ext4_mb_generate_buddy_error() Sam Asadi
2014-07-15 17:00 ` [PATCH 34/94] ext4: disable synchronous transaction batching if max_batch_time==0 Sam Asadi
2014-07-15 17:00 ` [PATCH 35/94] ARM: OMAP3: PRM/CM: Add back macros used by TI DSP/Bridge driver Sam Asadi
2014-07-15 17:00 ` [PATCH 36/94] ARM: DRA7: hwmod: Fixup SATA hwmod Sam Asadi
2014-07-15 17:00 ` [PATCH 37/94] ARM: DRA7: hwmod: Add SYSCONFIG for usb_otg_ss Sam Asadi
2014-07-15 17:00 ` [PATCH 38/94] ARM: OMAP2+: clock/dpll: fix _dpll_test_fint arithmetics overflow Sam Asadi
2014-07-15 17:00 ` [PATCH 39/94] iio:tcs3472: Check for buffer enabled and locking Sam Asadi
2014-07-15 17:00 ` [PATCH 40/94] USB: cp210x: add support for Corsair usb dongle Sam Asadi
2014-07-15 17:00 ` [PATCH 41/94] usb: option: Add ID for Telewell TW-LTE 4G v2 Sam Asadi
2014-07-15 17:00 ` [PATCH 42/94] ARM: DRA7/AM43XX: fix header definition for omap44xx_restart Sam Asadi
2014-07-15 17:00 ` [PATCH 43/94] ARM: dts: dra7-evm: Make VDDA_1V8_PHY supply always on Sam Asadi
2014-07-15 17:00 ` [PATCH 44/94] ARM: OMAP2+: create dsp device only on OMAP3 SoCs Sam Asadi
2014-07-15 17:01 ` [PATCH 45/94] ARM: OMAP2+: Make GPMC skip disabled devices Sam Asadi
2014-07-15 17:01 ` [PATCH 46/94] ARM: dts: am335x-evm: Enable the McASP FIFO for audio Sam Asadi
2014-07-16  5:40   ` Peter Ujfalusi
2014-07-15 17:01 ` [PATCH 47/94] ARM: dts: am335x-evmsk: " Sam Asadi
2014-07-15 17:01 ` [PATCH 48/94] ARM: dts: Fix TI CPSW Phy mode selection on IGEP COM AQUILA Sam Asadi
2014-07-15 17:01 ` [PATCH 49/94] ARM: l2c: fix revision checking Sam Asadi
2014-07-15 17:01 ` [PATCH 50/94] ARM: EXYNOS: Update secondary boot addr for secure mode Sam Asadi
2014-07-15 17:01 ` [PATCH 51/94] ARM: dts: Update the parent for Audss clocks in Exynos5420 Sam Asadi
2014-07-15 17:01 ` [PATCH 52/94] ARM: imx: fix shared gate clock Sam Asadi
2014-07-15 17:01 ` [PATCH 53/94] ARM: OMAP2+: Remove non working OMAP HDMI audio initialization Sam Asadi
2014-07-15 17:01 ` [PATCH 54/94] iio: ti_am335x_adc: Fix: Use same step id at FIFOs both ends Sam Asadi
2014-07-15 17:01 ` [PATCH 55/94] Drivers: hv: vmbus: Fix a bug in the channel callback dispatch code Sam Asadi
2014-07-15 17:01 ` [PATCH 56/94] Drivers: hv: util: Fix a bug in the KVP code Sam Asadi
2014-07-15 17:01 ` [PATCH 57/94] USB: ftdi_sio: Add extra PID Sam Asadi
2014-07-15 17:01 ` [PATCH 58/94] i8k: Fix non-SMP operation Sam Asadi
2014-08-18 23:19   ` i8k: Don't revert affinity in i8k_smm Con Kolivas
2014-08-19  2:32     ` Guenter Roeck
2014-08-19 12:34       ` Con Kolivas
2014-07-15 17:01 ` [PATCH 59/94] m68k: Fix boot regression on machines with RAM at non-zero Sam Asadi
2014-07-15 17:01 ` [PATCH 60/94] ARM: EXYNOS: Add support for clock handling in power domain Sam Asadi
2014-07-15 17:01 ` [PATCH 61/94] clk: exynos5420: Add IDs for clocks used in PD mfc Sam Asadi
2014-07-15 17:01 ` [PATCH 62/94] ARM: dts: Add clock property for mfc_pd in exynos5420 Sam Asadi
2014-07-15 17:01 ` [PATCH 63/94] ARM: EXYNOS: Register cpuidle device only on exynos4210 and 5250 Sam Asadi
2014-07-15 17:01 ` [PATCH 64/94] serial: Test for no tx data on tx restart Sam Asadi
2014-07-15 17:01 ` [PATCH 65/94] serial: arc_uart: Use uart_circ_empty() for open-coded comparison Sam Asadi
2014-07-15 17:01 ` [PATCH 66/94] m68k: Export mach_random_get_entropy to modules Sam Asadi
2014-07-15 17:01 ` [PATCH 67/94] ext4: revert commit which was causing fs corruption after journal replays Sam Asadi
2014-07-15 17:01 ` [PATCH 68/94] serial: imx: Fix build breakage Sam Asadi
2014-07-15 17:01 ` [PATCH 69/94] serial: sh-sci: Add device tree support for r8a7{778,740,3a4} and sh73a0 Sam Asadi
2014-07-15 17:01 ` [PATCH 70/94] USB: serial: ftdi_sio: Add Infineon Triboard Sam Asadi
2014-07-15 17:01 ` [PATCH 71/94] phy: sun4i: depend on RESET_CONTROLLER Sam Asadi
2014-07-15 17:01 ` [PATCH 72/94] phy: omap-usb2: fix devm_ioremap_resource error detection code Sam Asadi
2014-07-15 17:01 ` [PATCH 73/94] drivers: phy: phy-samsung-usb2.c: Add missing MODULE_DEVICE_TABLE Sam Asadi
2014-07-15 17:01 ` [PATCH 74/94] phy: core: Fix error path in phy_create() Sam Asadi
2014-07-15 17:01 ` [PATCH 75/94] phy: omap-usb2: Balance pm_runtime_enable() on probe failure and remove Sam Asadi
2014-07-15 17:01 ` [PATCH 76/94] ARM: at91: at91sam9x5: add clocks for usb device Sam Asadi
2014-07-15 17:01 ` [PATCH 77/94] Documentation/Changes: clean up mcelog paragraph Sam Asadi
2014-07-15 17:01 ` [PATCH 78/94] scripts/kernel-doc: handle object-like macros Sam Asadi
2014-07-15 17:01 ` [PATCH 79/94] DocBook: fix mtdnand typos Sam Asadi
2014-07-15 17:01 ` [PATCH 80/94] DocBook: fix various typos Sam Asadi
2014-07-15 17:01 ` [PATCH 81/94] Documenation/laptops: rename and update hpfall.c Sam Asadi
2014-07-15 17:01 ` [PATCH 82/94] ext4: fix a potential deadlock in __ext4_es_shrink() Sam Asadi
2014-07-15 17:01 ` [PATCH 83/94] ext4: fix potential null pointer dereference in ext4_free_inode Sam Asadi
2014-07-15 17:01 ` [PATCH 84/94] parisc: add serial ports of C8000/1GHz machine to hardware database Sam Asadi
2014-07-15 17:01 ` [PATCH 85/94] parisc: fix fanotify_mark() syscall on 32bit compat kernel Sam Asadi
2014-07-15 17:01 ` [PATCH 86/94] parisc: drop unused defines and header includes Sam Asadi
2014-07-15 17:01 ` [PATCH 87/94] clk: spear3xx: Use proper control register offset Sam Asadi
2014-07-15 17:01 ` [PATCH 88/94] clk: spear3xx: Set proper clock parent of uart1/2 Sam Asadi
2014-07-15 17:01 ` [PATCH 89/94] Linux 3.16-rc5 Sam Asadi
2014-07-15 17:37   ` Valdis.Kletnieks
2014-07-15 17:01 ` [PATCH 90/94] Staging: comedi: 8253.h fixed by removing 'return' from generic func Sam Asadi
2014-07-15 17:01 ` [PATCH 91/94] Staging: comedi: 8255: fixed by adding an empthy line Sam Asadi
2014-07-15 17:01 ` [PATCH 92/94] Staging: comedi: adl_pci9118: fixed style issues Sam Asadi
2014-07-15 17:01 ` [PATCH 93/94] Staging: comedi: 3 files revised " Sam Asadi
2014-07-15 17:01 ` [PATCH 94/94] Staging: commedi: 8253.h: style issue fixed Sam Asadi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1405443709-15288-13-git-send-email-asadi.samuel@gmail.com \
    --to=asadi.samuel@gmail.com \
    --cc=devel@driverdev.osuosl.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=rmk+kernel@arm.linux.org.uk \
    --cc=vinod.koul@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®