Re: [PATCH] mmc: tmio: simplify the DMA mode test

2018-10-15 Thread Ulf Hansson
On 12 October 2018 at 17:03, Masahiro Yamada
 wrote:
> host->chan_{rx,tx} represents the DMA capability of the platform.
> Even if DMA is supported, there are cases where we want to use PIO,
> for example, data length is short enough as commit 5f52c3552946
> ("mmc: tmio: use PIO for short transfers") mentioned.
>
> Regarding the hardware control flow, we are interested in whether DMA
> is currently enabled or not, instead of whether the platform has the
> DMA capability.
>
> Hence, the several conditionals in tmio_mmc_core.c end up with
> checking host->chan_{rx,tx} and !host->force_pio. This is not nice.
>
> Let's flip the flag host->force_pio into host->dma_on.
>
> host->dma_on represents whether the DMA is currently enabled or not.
> This flag is set false in the beginning of each command, then should
> be set true by tmio_mmc_start_dma() when the DMA is turned on.
>
> Signed-off-by: Masahiro Yamada 

Applied for next, thanks!

Kind regards
Uffe

> ---
>
>  drivers/mmc/host/renesas_sdhi_internal_dmac.c |  3 ++-
>  drivers/mmc/host/renesas_sdhi_sys_dmac.c  | 10 --
>  drivers/mmc/host/tmio_mmc.h   |  2 +-
>  drivers/mmc/host/tmio_mmc_core.c  | 14 +++---
>  drivers/mmc/host/uniphier-sd.c|  6 --
>  5 files changed, 18 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/mmc/host/renesas_sdhi_internal_dmac.c 
> b/drivers/mmc/host/renesas_sdhi_internal_dmac.c
> index ca0b439..885676b 100644
> --- a/drivers/mmc/host/renesas_sdhi_internal_dmac.c
> +++ b/drivers/mmc/host/renesas_sdhi_internal_dmac.c
> @@ -201,13 +201,14 @@ renesas_sdhi_internal_dmac_start_dma(struct 
> tmio_mmc_host *host,
> renesas_sdhi_internal_dmac_dm_write(host, DM_DTRAN_ADDR,
> sg_dma_address(sg));
>
> +   host->dma_on = true;
> +
> return;
>
>  force_pio_with_unmap:
> dma_unmap_sg(&host->pdev->dev, sg, host->sg_len, 
> mmc_get_dma_dir(data));
>
>  force_pio:
> -   host->force_pio = true;
> renesas_sdhi_internal_dmac_enable_dma(host, false);
>  }
>
> diff --git a/drivers/mmc/host/renesas_sdhi_sys_dmac.c 
> b/drivers/mmc/host/renesas_sdhi_sys_dmac.c
> index 5389c48..3c97831 100644
> --- a/drivers/mmc/host/renesas_sdhi_sys_dmac.c
> +++ b/drivers/mmc/host/renesas_sdhi_sys_dmac.c
> @@ -213,10 +213,8 @@ static void renesas_sdhi_sys_dmac_start_dma_rx(struct 
> tmio_mmc_host *host)
> goto pio;
> }
>
> -   if (sg->length < TMIO_MMC_MIN_DMA_LEN) {
> -   host->force_pio = true;
> +   if (sg->length < TMIO_MMC_MIN_DMA_LEN)
> return;
> -   }
>
> /* The only sg element can be unaligned, use our bounce buffer then */
> if (!aligned) {
> @@ -240,6 +238,7 @@ static void renesas_sdhi_sys_dmac_start_dma_rx(struct 
> tmio_mmc_host *host)
> desc = NULL;
> ret = cookie;
> }
> +   host->dma_on = true;
> }
>  pio:
> if (!desc) {
> @@ -286,10 +285,8 @@ static void renesas_sdhi_sys_dmac_start_dma_tx(struct 
> tmio_mmc_host *host)
> goto pio;
> }
>
> -   if (sg->length < TMIO_MMC_MIN_DMA_LEN) {
> -   host->force_pio = true;
> +   if (sg->length < TMIO_MMC_MIN_DMA_LEN)
> return;
> -   }
>
> /* The only sg element can be unaligned, use our bounce buffer then */
> if (!aligned) {
> @@ -318,6 +315,7 @@ static void renesas_sdhi_sys_dmac_start_dma_tx(struct 
> tmio_mmc_host *host)
> desc = NULL;
> ret = cookie;
> }
> +   host->dma_on = true;
> }
>  pio:
> if (!desc) {
> diff --git a/drivers/mmc/host/tmio_mmc.h b/drivers/mmc/host/tmio_mmc.h
> index 18b4308..1c3bdad 100644
> --- a/drivers/mmc/host/tmio_mmc.h
> +++ b/drivers/mmc/host/tmio_mmc.h
> @@ -142,7 +142,7 @@ struct tmio_mmc_host {
> struct tmio_mmc_data *pdata;
>
> /* DMA support */
> -   boolforce_pio;
> +   booldma_on;
> struct dma_chan *chan_rx;
> struct dma_chan *chan_tx;
> struct tasklet_struct   dma_issue;
> diff --git a/drivers/mmc/host/tmio_mmc_core.c 
> b/drivers/mmc/host/tmio_mmc_core.c
> index a571106..38be3fc 100644
> --- a/drivers/mmc/host/tmio_mmc_core.c
> +++ b/drivers/mmc/host/tmio_mmc_core.c
> @@ -364,7 +364,7 @@ static void tmio_mmc_pio_irq(struct tmio_mmc_host *host)
> unsigned int count;
> unsigned long flags;
>
> -   if ((host->chan_tx || host->chan_rx) && !host->force_pio) {
> +   if (host->dma_on) {
> pr_err("PIO IRQ in DMA mode!\n");
> return;
> } else if (!data) {
> @@ -436,7 +436,7 @@ void tmio_mmc_do_data_irq(struct tmio_mmc_host *host)
>  */
>
> if (data->flags & MMC_DATA_READ) {
> -   if (host->chan_rx && !

Re: [PATCH] mmc: tmio: simplify the DMA mode test

2018-10-15 Thread Wolfram Sang
On Mon, Oct 15, 2018 at 12:36:36AM +0200, Wolfram Sang wrote:
> On Sat, Oct 13, 2018 at 12:03:08AM +0900, Masahiro Yamada wrote:
> > host->chan_{rx,tx} represents the DMA capability of the platform.
> > Even if DMA is supported, there are cases where we want to use PIO,
> > for example, data length is short enough as commit 5f52c3552946
> > ("mmc: tmio: use PIO for short transfers") mentioned.
> > 
> > Regarding the hardware control flow, we are interested in whether DMA
> > is currently enabled or not, instead of whether the platform has the
> > DMA capability.
> > 
> > Hence, the several conditionals in tmio_mmc_core.c end up with
> > checking host->chan_{rx,tx} and !host->force_pio. This is not nice.
> > 
> > Let's flip the flag host->force_pio into host->dma_on.
> > 
> > host->dma_on represents whether the DMA is currently enabled or not.
> > This flag is set false in the beginning of each command, then should
> > be set true by tmio_mmc_start_dma() when the DMA is turned on.
> > 
> > Signed-off-by: Masahiro Yamada 
> 
> I like it. Much easier to read!
> 
> Reviewed-by: Wolfram Sang 

Tested on R-Car H3 ES1.0 and ES2.0, M3N, and H2. No regressions,
especially no performance regressions (since "when to enable DMA" code
was refactored).

Tested-by: Wolfram Sang 



signature.asc
Description: PGP signature


Re: [PATCH] mmc: tmio: simplify the DMA mode test

2018-10-14 Thread Wolfram Sang
On Sat, Oct 13, 2018 at 12:03:08AM +0900, Masahiro Yamada wrote:
> host->chan_{rx,tx} represents the DMA capability of the platform.
> Even if DMA is supported, there are cases where we want to use PIO,
> for example, data length is short enough as commit 5f52c3552946
> ("mmc: tmio: use PIO for short transfers") mentioned.
> 
> Regarding the hardware control flow, we are interested in whether DMA
> is currently enabled or not, instead of whether the platform has the
> DMA capability.
> 
> Hence, the several conditionals in tmio_mmc_core.c end up with
> checking host->chan_{rx,tx} and !host->force_pio. This is not nice.
> 
> Let's flip the flag host->force_pio into host->dma_on.
> 
> host->dma_on represents whether the DMA is currently enabled or not.
> This flag is set false in the beginning of each command, then should
> be set true by tmio_mmc_start_dma() when the DMA is turned on.
> 
> Signed-off-by: Masahiro Yamada 

I like it. Much easier to read!

Reviewed-by: Wolfram Sang 

Also here, I'd like to test this on Monday on some more devices.



signature.asc
Description: PGP signature