All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Serge Semin <Sergey.Semin@baikalelectronics.ru>
Cc: Mark Brown <broonie@kernel.org>,
	Serge Semin <fancer.lancer@gmail.com>,
	Georgy Vlasov <Georgy.Vlasov@baikalelectronics.ru>,
	Ramil Zaripov <Ramil.Zaripov@baikalelectronics.ru>,
	Alexey Malahov <Alexey.Malahov@baikalelectronics.ru>,
	Thomas Bogendoerfer <tsbogend@alpha.franken.de>,
	Paul Burton <paulburton@kernel.org>,
	Ralf Baechle <ralf@linux-mips.org>, Arnd Bergmann <arnd@arndb.de>,
	Allison Randal <allison@lohutok.net>,
	Gareth Williams <gareth.williams.jx@renesas.com>,
	Rob Herring <robh+dt@kernel.org>,
	linux-mips@vger.kernel.org, devicetree@vger.kernel.org,
	Jarkko Nikula <jarkko.nikula@linux.intel.com>,
	Wan Ahmad Zainie <wan.ahmad.zainie.wan.mohamad@intel.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	"wuxu.wu" <wuxu.wu@huawei.com>, Clement Leger <cleger@kalray.eu>,
	linux-spi@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 02/19] spi: dw: Add Tx/Rx finish wait methods to the MID DMA
Date: Fri, 15 May 2020 15:01:11 +0300	[thread overview]
Message-ID: <20200515120111.GV185537@smile.fi.intel.com> (raw)
In-Reply-To: <20200515104758.6934-3-Sergey.Semin@baikalelectronics.ru>

On Fri, May 15, 2020 at 01:47:41PM +0300, Serge Semin wrote:
> Since DMA transfers are performed asynchronously with actual SPI
> transaction, then even if DMA transfers are finished it doesn't mean
> all data is actually pushed to the SPI bus. Some data might still be
> in the controller FIFO. This is specifically true for Tx-only
> transfers. In this case if the next SPI transfer is recharged while
> a tail of the previous one is still in FIFO, we'll loose that tail
> data. In order to fix this lets add the wait procedure of the Tx/Rx
> SPI transfers completion after the corresponding DMA transactions
> are finished.

General question, doesn't spi core provides us some helpers like
spi_delay_exec()?

> Co-developed-by: Georgy Vlasov <Georgy.Vlasov@baikalelectronics.ru>
> Signed-off-by: Georgy Vlasov <Georgy.Vlasov@baikalelectronics.ru>
> Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru>
> Cc: Ramil Zaripov <Ramil.Zaripov@baikalelectronics.ru>
> Cc: Alexey Malahov <Alexey.Malahov@baikalelectronics.ru>
> Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
> Cc: Paul Burton <paulburton@kernel.org>
> Cc: Ralf Baechle <ralf@linux-mips.org>
> Cc: Arnd Bergmann <arnd@arndb.de>
> Cc: Allison Randal <allison@lohutok.net>
> Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Cc: Gareth Williams <gareth.williams.jx@renesas.com>
> Cc: Rob Herring <robh+dt@kernel.org>
> Cc: linux-mips@vger.kernel.org
> Cc: devicetree@vger.kernel.org
> 
> ---
> 
> Changelog v2:
> - Use conditional statement instead of the ternary operator in the ref
>   clock getter.

> - Move the patch to the head of the series so one could be picked up to
>   the stable kernels as a fix.

You forgot a Fixes tag.

> ---
>  drivers/spi/spi-dw-mid.c | 50 ++++++++++++++++++++++++++++++++++++++++
>  drivers/spi/spi-dw.h     | 10 ++++++++
>  2 files changed, 60 insertions(+)
> 
> diff --git a/drivers/spi/spi-dw-mid.c b/drivers/spi/spi-dw-mid.c
> index 177e1f5ec62b..7a5ae1506365 100644
> --- a/drivers/spi/spi-dw-mid.c
> +++ b/drivers/spi/spi-dw-mid.c
> @@ -16,7 +16,9 @@
>  #include <linux/irqreturn.h>
>  #include <linux/pci.h>
>  #include <linux/platform_data/dma-dw.h>

> +#include <linux/delay.h>

Keep it in order.

>  
> +#define WAIT_RETRIES	5
>  #define RX_BUSY		0
>  #define TX_BUSY		1
>  
> @@ -141,6 +143,28 @@ static enum dma_slave_buswidth convert_dma_width(u32 dma_width) {
>  	return DMA_SLAVE_BUSWIDTH_UNDEFINED;
>  }
>  
> +static inline bool dw_spi_dma_tx_busy(struct dw_spi *dws)
> +{
> +	return !(dw_readl(dws, DW_SPI_SR) & SR_TF_EMPT);
> +}
> +
> +static void dw_spi_dma_wait_tx_done(struct dw_spi *dws)
> +{
> +	int retry = WAIT_RETRIES;
> +	unsigned long ns;
> +
> +	ns = (NSEC_PER_SEC / spi_get_clk(dws)) * dws->n_bytes * BITS_PER_BYTE;
> +	ns *= dw_readl(dws, DW_SPI_TXFLR);
> +

> +	while (dw_spi_dma_tx_busy(dws) && retry--)
> +		ndelay(ns);

This misses power management for CPU and do you really need this to be atomic?
At the end why not to use readx_poll_timeout() ?

> +	if (retry < 0) {

Usually we do

	unsigned int retries = NNNN;

	do {
		...
	} while (--retries);
	if (!retries)
		...

But in any case, see above.

> +		dev_err(&dws->master->dev, "Tx hanged up\n");
> +		dws->master->cur_msg->status = -EIO;
> +	}
> +}

Same comments to Rx part.

> +
>  /*
>   * dws->dma_chan_busy is set before the dma transfer starts, callback for tx
>   * channel will clear a corresponding bit.
> @@ -149,6 +173,8 @@ static void dw_spi_dma_tx_done(void *arg)
>  {
>  	struct dw_spi *dws = arg;
>  
> +	dw_spi_dma_wait_tx_done(dws);
> +
>  	clear_bit(TX_BUSY, &dws->dma_chan_busy);
>  	if (test_bit(RX_BUSY, &dws->dma_chan_busy))
>  		return;
> @@ -188,6 +214,28 @@ static struct dma_async_tx_descriptor *dw_spi_dma_prepare_tx(struct dw_spi *dws,
>  	return txdesc;
>  }
>  
> +static inline bool dw_spi_dma_rx_busy(struct dw_spi *dws)
> +{
> +	return !!(dw_readl(dws, DW_SPI_SR) & SR_RF_NOT_EMPT);
> +}
> +
> +static void dw_spi_dma_wait_rx_done(struct dw_spi *dws)
> +{
> +	int retry = WAIT_RETRIES;
> +	unsigned long ns;
> +
> +	ns = (NSEC_PER_SEC / spi_get_clk(dws)) * dws->n_bytes * BITS_PER_BYTE;
> +	ns *= dw_readl(dws, DW_SPI_RXFLR);
> +
> +	while (dw_spi_dma_rx_busy(dws) && retry--)
> +		ndelay(ns);
> +
> +	if (retry < 0) {
> +		dev_err(&dws->master->dev, "Rx hanged up\n");
> +		dws->master->cur_msg->status = -EIO;
> +	}
> +}
> +
>  /*
>   * dws->dma_chan_busy is set before the dma transfer starts, callback for rx
>   * channel will clear a corresponding bit.
> @@ -196,6 +244,8 @@ static void dw_spi_dma_rx_done(void *arg)
>  {
>  	struct dw_spi *dws = arg;
>  
> +	dw_spi_dma_wait_rx_done(dws);
> +
>  	clear_bit(RX_BUSY, &dws->dma_chan_busy);
>  	if (test_bit(TX_BUSY, &dws->dma_chan_busy))
>  		return;
> diff --git a/drivers/spi/spi-dw.h b/drivers/spi/spi-dw.h
> index e92d43b9a9e6..81364f501b7e 100644
> --- a/drivers/spi/spi-dw.h
> +++ b/drivers/spi/spi-dw.h
> @@ -210,6 +210,16 @@ static inline void spi_set_clk(struct dw_spi *dws, u16 div)
>  	dw_writel(dws, DW_SPI_BAUDR, div);
>  }
>  
> +static inline u32 spi_get_clk(struct dw_spi *dws)
> +{
> +	u32 div = dw_readl(dws, DW_SPI_BAUDR);
> +
> +	if (!div)
> +		return 0;
> +
> +	return dws->max_freq / div;
> +}
> +
>  /* Disable IRQ bits */
>  static inline void spi_mask_intr(struct dw_spi *dws, u32 mask)
>  {
> -- 
> 2.25.1
> 

-- 
With Best Regards,
Andy Shevchenko



  parent reply	other threads:[~2020-05-15 12:01 UTC|newest]

Thread overview: 106+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-08 13:29 [PATCH 00/17] spi: dw: Add generic DW DMA controller support Serge Semin
2020-05-08 13:29 ` [PATCH 01/17] dt-bindings: spi: Convert DW SPI binding to DT schema Serge Semin
2020-05-08 19:39   ` Andy Shevchenko
2020-05-12 20:28     ` Serge Semin
2020-05-12 20:35       ` Andy Shevchenko
2020-05-08 13:29 ` [PATCH 02/17] dt-bindings: spi: dw: Add DMA properties bindings Serge Semin
2020-05-08 13:29 ` [PATCH 04/17] spi: dw: Cleanup generic DW DMA code namings Serge Semin
2020-05-08 19:43   ` Andy Shevchenko
2020-05-12 21:26     ` Serge Semin
2020-05-12 21:37       ` Andy Shevchenko
2020-05-08 13:29 ` [PATCH 06/17] spi: dw: Add DW SPI DMA/PCI/MMIO dependency on DW SPI core Serge Semin
2020-05-08 13:29 ` [PATCH 08/17] spi: dw: Clear DMAC register when done or stopped Serge Semin
2020-05-08 17:31   ` Mark Brown
2020-05-13 11:56     ` Serge Semin
2020-05-08 13:29 ` [PATCH 09/17] spi: dw: Enable interrupts in accordance with DMA xfer mode Serge Semin
2020-05-08 13:29 ` [PATCH 10/17] spi: dw: Parameterize the DMA Rx/Tx burst length Serge Semin
2020-05-08 13:29 ` [PATCH 12/17] spi: dw: Fix dma_slave_config used partly uninitialized Serge Semin
2020-05-08 19:20   ` Andy Shevchenko
2020-05-08 13:29 ` [PATCH 13/17] spi: dw: Initialize paddr in DW SPI MMIO private data Serge Semin
2020-05-08 19:21   ` Andy Shevchenko
2020-05-13 12:30     ` Serge Semin
2020-05-08 13:33 ` [PATCH 00/17] spi: dw: Add generic DW DMA controller support Mark Brown
2020-05-12 20:07   ` Serge Semin
2020-05-13 10:23     ` Mark Brown
2020-05-13 11:04       ` Serge Semin
2020-05-13 11:21         ` Mark Brown
2020-05-13 11:42           ` Serge Semin
     [not found] ` <20200508132943.9826-8-Sergey.Semin@baikalelectronics.ru>
2020-05-08 17:30   ` [PATCH 07/17] spi: dw: Add Tx/Rx finish wait methods to DMA Mark Brown
     [not found]     ` <20200513113555.mjivjk374giopnea@mobilestation>
2020-05-13 11:36       ` Mark Brown
2020-05-08 17:36 ` [PATCH 00/17] spi: dw: Add generic DW DMA controller support Mark Brown
2020-05-08 19:16   ` Andy Shevchenko
2020-05-12 20:34     ` Serge Semin
2020-05-12 20:30   ` Serge Semin
     [not found] ` <20200508132943.9826-15-Sergey.Semin@baikalelectronics.ru>
2020-05-08 19:23   ` [PATCH 14/17] spi: dw: Add DMA support to the DW SPI MMIO driver Andy Shevchenko
     [not found] ` <20200508132943.9826-17-Sergey.Semin@baikalelectronics.ru>
2020-05-08 19:27   ` [PATCH 16/17] spi: dw: Fix Rx-only DMA transfers Andy Shevchenko
     [not found] ` <20200508132943.9826-18-Sergey.Semin@baikalelectronics.ru>
2020-05-08 19:30   ` [PATCH 17/17] spi: dw: Use regset32 DebugFS method to create a registers file Andy Shevchenko
     [not found]     ` <20200513124422.z6ctlmvipwer45q4@mobilestation>
2020-05-13 14:41       ` Andy Shevchenko
2020-05-08 19:33 ` [PATCH 00/17] spi: dw: Add generic DW DMA controller support Andy Shevchenko
     [not found] ` <20200508132943.9826-12-Sergey.Semin@baikalelectronics.ru>
2020-05-08 19:39   ` [PATCH 11/17] spi: dw: Fix native CS being unset Linus Walleij
     [not found]     ` <20200513001347.dyt357erev7vzy3l@mobilestation>
2020-05-14  8:31       ` Linus Walleij
     [not found]         ` <20200514115558.e6cqnuxqyqkysfn7@mobilestation>
2020-05-14 12:22           ` Andy Shevchenko
2020-05-14 13:03             ` Mark Brown
2020-05-14 14:35           ` Mark Brown
     [not found] ` <20200508132943.9826-4-Sergey.Semin@baikalelectronics.ru>
2020-05-08 19:41   ` [PATCH 03/17] spi: dw: Split up the generic DMA code and Intel MID driver Andy Shevchenko
     [not found] ` <20200508132943.9826-6-Sergey.Semin@baikalelectronics.ru>
2020-05-08 19:44   ` [PATCH 05/17] spi: dw: Discard static DW DMA slave structures Andy Shevchenko
2020-05-15 10:47 ` [PATCH v2 00/19] spi: dw: Add generic DW DMA controller support Serge Semin
2020-05-15 10:47   ` [PATCH v2 01/19] dt-bindings: spi: dw: Add Tx/Rx DMA properties Serge Semin
2020-05-15 11:51     ` Andy Shevchenko
2020-05-15 12:27       ` Mark Brown
2020-05-15 15:43         ` Serge Semin
2020-05-15 10:47   ` [PATCH v2 03/19] spi: dw: Clear DMAC register when done or stopped Serge Semin
2020-05-15 12:01     ` Andy Shevchenko
2020-05-15 16:42     ` Mark Brown
2020-05-15 17:21       ` Serge Semin
2020-05-15 10:47   ` [PATCH v2 05/19] spi: dw: Enable interrupts in accordance with DMA xfer mode Serge Semin
2020-05-15 12:27     ` Andy Shevchenko
2020-05-16 14:06       ` Serge Semin
2020-05-15 10:47   ` [PATCH v2 09/19] spi: dw: Parameterize the DMA Rx/Tx burst length Serge Semin
2020-05-15 14:01     ` Andy Shevchenko
     [not found]       ` <20200516143353.hw6nny5hbwgiyxfw@mobilestation>
2020-05-18 11:01         ` Andy Shevchenko
2020-05-18 12:41           ` Serge Semin
2020-05-15 10:47   ` [PATCH v2 10/19] spi: dw: Use DMA max burst to set the request thresholds Serge Semin
2020-05-15 14:38     ` Andy Shevchenko
     [not found]       ` <20200516200133.wmaqnfjbr7234fzo@mobilestation>
2020-05-18 11:03         ` Andy Shevchenko
2020-05-18 12:43           ` Mark Brown
2020-05-18 12:52           ` Serge Semin
2020-05-18 13:25             ` Andy Shevchenko
2020-05-18 13:43               ` Serge Semin
2020-05-18 14:48                 ` Andy Shevchenko
2020-05-18 14:59                   ` Serge Semin
2020-05-15 10:47   ` [PATCH v2 11/19] spi: dw: Initialize paddr in DW SPI MMIO private data Serge Semin
2020-05-15 14:39     ` Andy Shevchenko
2020-05-15 10:47   ` [PATCH v2 14/19] spi: dw: Remove DW DMA code dependency from DW_DMAC_PCI Serge Semin
2020-05-15 15:02     ` Andy Shevchenko
2020-05-15 10:47   ` [PATCH v2 15/19] spi: dw: Add DW SPI DMA/PCI/MMIO dependency on the DW SPI core Serge Semin
2020-05-15 15:03     ` Andy Shevchenko
2020-05-15 10:47   ` [PATCH v2 17/19] spi: dw: Add DMA support to the DW SPI MMIO driver Serge Semin
2020-05-15 15:08     ` Andy Shevchenko
2020-05-15 10:47   ` [PATCH v2 19/19] dt-bindings: spi: Convert DW SPI binding to DT schema Serge Semin
2020-05-16 20:59     ` Serge Semin
2020-05-15 11:49   ` [PATCH v2 00/19] spi: dw: Add generic DW DMA controller support Andy Shevchenko
2020-05-15 15:30     ` Serge Semin
     [not found]   ` <20200515104758.6934-3-Sergey.Semin@baikalelectronics.ru>
2020-05-15 12:01     ` Andy Shevchenko [this message]
2020-05-15 12:18       ` [PATCH v2 02/19] spi: dw: Add Tx/Rx finish wait methods to the MID DMA Mark Brown
2020-05-15 12:37         ` Andy Shevchenko
2020-05-15 12:41           ` Mark Brown
     [not found]             ` <20200515200250.zjsv5uaftwqcnwud@mobilestation>
2020-05-18 10:51               ` Mark Brown
     [not found]                 ` <20200518110453.w3ko5a5yzwyr73ir@mobilestation>
2020-05-18 11:11                   ` Mark Brown
     [not found]       ` <20200515194058.pmpd4wa7lw2dle3g@mobilestation>
2020-05-18 10:55         ` Andy Shevchenko
     [not found]   ` <20200515104758.6934-5-Sergey.Semin@baikalelectronics.ru>
2020-05-15 12:05     ` [PATCH v2 04/19] spi: dw: Fix native CS being unset Andy Shevchenko
     [not found]   ` <20200515104758.6934-7-Sergey.Semin@baikalelectronics.ru>
2020-05-15 12:34     ` [PATCH v2 06/19] spi: dw: Discard static DW DMA slave structures Andy Shevchenko
     [not found]       ` <20200516142030.kburieaxjg4n7c42@mobilestation>
2020-05-18 11:00         ` Andy Shevchenko
2020-05-18 11:38           ` Andy Shevchenko
     [not found]             ` <20200518123242.xoosc4pcj7heo4he@mobilestation>
2020-05-18 13:22               ` Andy Shevchenko
     [not found]   ` <20200515104758.6934-8-Sergey.Semin@baikalelectronics.ru>
2020-05-15 12:38     ` [PATCH v2 07/19] spi: dw: Discard unused void priv pointer Andy Shevchenko
     [not found]   ` <20200515104758.6934-9-Sergey.Semin@baikalelectronics.ru>
2020-05-15 13:03     ` [PATCH v2 08/19] spi: dw: Discard dma_width member of the dw_spi structure Andy Shevchenko
     [not found]       ` <20200515130559.psq2zwfhovt6rzhl@mobilestation>
2020-05-15 13:49         ` Andy Shevchenko
     [not found]           ` <20200515141627.pqdaic6wksatusl6@mobilestation>
2020-05-15 15:00             ` Andy Shevchenko
     [not found]   ` <20200515104758.6934-13-Sergey.Semin@baikalelectronics.ru>
2020-05-15 14:40     ` [PATCH v2 12/19] spi: dw: Fix Rx-only DMA transfers Andy Shevchenko
2020-05-15 16:55       ` Mark Brown
     [not found]   ` <20200515104758.6934-14-Sergey.Semin@baikalelectronics.ru>
2020-05-15 14:51     ` [PATCH v2 13/19] spi: dw: Move Non-DMA code to the DW PCIe-SPI driver Andy Shevchenko
     [not found]       ` <20200516201724.7q5uhxmzpr6xjooj@mobilestation>
     [not found]         ` <20200518125850.jnhaqlr2ticu3ivs@mobilestation>
2020-05-18 13:00           ` Mark Brown
     [not found]   ` <20200515104758.6934-19-Sergey.Semin@baikalelectronics.ru>
2020-05-15 15:10     ` [PATCH v2 18/19] spi: dw: Use regset32 DebugFS method to create regdump file Andy Shevchenko
     [not found]       ` <20200516204634.td52orxfnh7iewg6@mobilestation>
2020-05-18 11:18         ` Andy Shevchenko
     [not found]           ` <20200518140825.jnkfpybxnwq7fx2m@mobilestation>
2020-05-18 15:06             ` Andy Shevchenko
2020-05-15 18:21   ` [PATCH v2 00/19] spi: dw: Add generic DW DMA controller support Mark Brown

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=20200515120111.GV185537@smile.fi.intel.com \
    --to=andriy.shevchenko@linux.intel.com \
    --cc=Alexey.Malahov@baikalelectronics.ru \
    --cc=Georgy.Vlasov@baikalelectronics.ru \
    --cc=Ramil.Zaripov@baikalelectronics.ru \
    --cc=Sergey.Semin@baikalelectronics.ru \
    --cc=allison@lohutok.net \
    --cc=arnd@arndb.de \
    --cc=broonie@kernel.org \
    --cc=cleger@kalray.eu \
    --cc=devicetree@vger.kernel.org \
    --cc=fancer.lancer@gmail.com \
    --cc=gareth.williams.jx@renesas.com \
    --cc=jarkko.nikula@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mips@vger.kernel.org \
    --cc=linux-spi@vger.kernel.org \
    --cc=paulburton@kernel.org \
    --cc=ralf@linux-mips.org \
    --cc=robh+dt@kernel.org \
    --cc=tglx@linutronix.de \
    --cc=tsbogend@alpha.franken.de \
    --cc=wan.ahmad.zainie.wan.mohamad@intel.com \
    --cc=wuxu.wu@huawei.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 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.