Re: [PATCH] mmc: omap_hsmmc: fix DMA API warning

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 11 Dec 2018 at 15:41, Russell King <rmk+kernel@xxxxxxxxxxxxxxx> wrote:
>
> While booting with rootfs on MMC, the following warning is encountered
> on OMAP4430:
>
> omap-dma-engine 4a056000.dma-controller: DMA-API: mapping sg segment longer than device claims to support [len=69632] [max=65536]
>
> This is because the DMA engine has a default maximum segment size of 64K
> but HSMMC sets:
>
>         mmc->max_blk_size = 512;       /* Block Length at max can be 1024 */
>         mmc->max_blk_count = 0xFFFF;    /* No. of Blocks is 16 bits */
>         mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
>         mmc->max_seg_size = mmc->max_req_size;
>
> which ends up telling the block layer that we support a maximum segment
> size of 65535*512, which exceeds the advertised DMA engine capabilities.
>
> Fix this by clamping the maximum segment size to the lower of the
> maximum request size and of the DMA engine device used for either DMA
> channel.
>
> Signed-off-by: Russell King <rmk+kernel@xxxxxxxxxxxxxxx>

I have applied this for fixes, amending the change by modifying the
min-min check to min3 according to the suggestion from Tony.
I assumed adding a stable tag makes sense so I did, however, please
tell if you want me to drop that.

Thanks and kind regards
Uffe


> ---
>  drivers/mmc/host/omap_hsmmc.c | 12 +++++++++++-
>  1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
> index 467d889a1638..55100974fb95 100644
> --- a/drivers/mmc/host/omap_hsmmc.c
> +++ b/drivers/mmc/host/omap_hsmmc.c
> @@ -1909,7 +1909,6 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
>         mmc->max_blk_size = 512;       /* Block Length at max can be 1024 */
>         mmc->max_blk_count = 0xFFFF;    /* No. of Blocks is 16 bits */
>         mmc->max_req_size = mmc->max_blk_size * mmc->max_blk_count;
> -       mmc->max_seg_size = mmc->max_req_size;
>
>         mmc->caps |= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
>                      MMC_CAP_WAIT_WHILE_BUSY | MMC_CAP_ERASE | MMC_CAP_CMD23;
> @@ -1939,6 +1938,17 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
>                 goto err_irq;
>         }
>
> +       /*
> +        * Limit the maximum segment size to the lower of the request size
> +        * and the DMA engine device segment size limits.  In reality, with
> +        * 32-bit transfers, the DMA engine can do longer segments than this
> +        * but there is no way to represent that in the DMA model - if we
> +        * increase this figure here, we get warnings from the DMA API debug.
> +        */
> +       mmc->max_seg_size = min(mmc->max_req_size,
> +                               min(dma_get_max_seg_size(host->rx_chan->device->dev),
> +                                   dma_get_max_seg_size(host->tx_chan->device->dev)));
> +
>         /* Request IRQ for MMC operations */
>         ret = devm_request_irq(&pdev->dev, host->irq, omap_hsmmc_irq, 0,
>                         mmc_hostname(mmc), host);
> --
> 2.7.4
>



[Index of Archives]     [Linux Memonry Technology]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux