* [PATCH] mmc: omap_hsmmc: fix DMA API warning
@ 2018-12-11 14:41 Russell King
2018-12-11 15:04 ` Tony Lindgren
2018-12-17 8:07 ` Ulf Hansson
0 siblings, 2 replies; 3+ messages in thread
From: Russell King @ 2018-12-11 14:41 UTC (permalink / raw)
To: Ulf Hansson, Peter Ujfalusi, Tony Lindgren
Cc: linux-omap, linux-mmc, linux-arm-kernel
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@armlinux.org.uk>
---
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
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH] mmc: omap_hsmmc: fix DMA API warning
2018-12-11 14:41 [PATCH] mmc: omap_hsmmc: fix DMA API warning Russell King
@ 2018-12-11 15:04 ` Tony Lindgren
2018-12-17 8:07 ` Ulf Hansson
1 sibling, 0 replies; 3+ messages in thread
From: Tony Lindgren @ 2018-12-11 15:04 UTC (permalink / raw)
To: Russell King
Cc: Peter Ujfalusi, Ulf Hansson, linux-omap, linux-mmc,
linux-arm-kernel
Hi,
* Russell King <rmk+kernel@armlinux.org.uk> [181211 14:41]:
> @@ -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)));
> +
Looks like using min3() here would be handy?
Regards,
Tony
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] mmc: omap_hsmmc: fix DMA API warning
2018-12-11 14:41 [PATCH] mmc: omap_hsmmc: fix DMA API warning Russell King
2018-12-11 15:04 ` Tony Lindgren
@ 2018-12-17 8:07 ` Ulf Hansson
1 sibling, 0 replies; 3+ messages in thread
From: Ulf Hansson @ 2018-12-17 8:07 UTC (permalink / raw)
To: Russell King
Cc: Peter Ujfalusi, Tony Lindgren, linux-omap,
linux-mmc@vger.kernel.org, Linux ARM
On Tue, 11 Dec 2018 at 15:41, Russell King <rmk+kernel@armlinux.org.uk> 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@armlinux.org.uk>
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
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2018-12-17 8:08 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-12-11 14:41 [PATCH] mmc: omap_hsmmc: fix DMA API warning Russell King
2018-12-11 15:04 ` Tony Lindgren
2018-12-17 8:07 ` Ulf Hansson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).