lkml.org 
[lkml]   [2017]   [Dec]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 42/95] mmc: sdhci: Avoid swiotlb buffer being full
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Ulf Hansson <ulf.hansson@linaro.org>

    commit 250dcd11466e06df64b92520e2c56bdae453581b upstream.

    The commit de3ee99b097d ("mmc: Delete bounce buffer handling") deletes the
    bounce buffer handling, but also causes the max_req_size for sdhci to be
    increased, in case when max_segs == 1. This causes errors for sdhci-pci
    Ricoh variant, about the swiotlb buffer to become full.

    Fix the issue, by taking IO_TLB_SEGSIZE and IO_TLB_SHIFT into account when
    deciding the max_req_size for sdhci.

    Reported-by: Jiri Slaby <jslaby@suse.cz>
    Fixes: de3ee99b097d ("mmc: Delete bounce buffer handling")
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Tested-by: Jiri Slaby <jslaby@suse.cz>
    Acked-by: Adrian Hunter <adrian.hunter@intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/mmc/host/sdhci.c | 28 ++++++++++++++++++----------
    1 file changed, 18 insertions(+), 10 deletions(-)

    --- a/drivers/mmc/host/sdhci.c
    +++ b/drivers/mmc/host/sdhci.c
    @@ -21,6 +21,7 @@
    #include <linux/dma-mapping.h>
    #include <linux/slab.h>
    #include <linux/scatterlist.h>
    +#include <linux/swiotlb.h>
    #include <linux/regulator/consumer.h>
    #include <linux/pm_runtime.h>
    #include <linux/of.h>
    @@ -3651,22 +3652,29 @@ int sdhci_setup_host(struct sdhci_host *
    spin_lock_init(&host->lock);

    /*
    + * Maximum number of sectors in one transfer. Limited by SDMA boundary
    + * size (512KiB). Note some tuning modes impose a 4MiB limit, but this
    + * is less anyway.
    + */
    + mmc->max_req_size = 524288;
    +
    + /*
    * Maximum number of segments. Depends on if the hardware
    * can do scatter/gather or not.
    */
    - if (host->flags & SDHCI_USE_ADMA)
    + if (host->flags & SDHCI_USE_ADMA) {
    mmc->max_segs = SDHCI_MAX_SEGS;
    - else if (host->flags & SDHCI_USE_SDMA)
    + } else if (host->flags & SDHCI_USE_SDMA) {
    mmc->max_segs = 1;
    - else /* PIO */
    + if (swiotlb_max_segment()) {
    + unsigned int max_req_size = (1 << IO_TLB_SHIFT) *
    + IO_TLB_SEGSIZE;
    + mmc->max_req_size = min(mmc->max_req_size,
    + max_req_size);
    + }
    + } else { /* PIO */
    mmc->max_segs = SDHCI_MAX_SEGS;
    -
    - /*
    - * Maximum number of sectors in one transfer. Limited by SDMA boundary
    - * size (512KiB). Note some tuning modes impose a 4MiB limit, but this
    - * is less anyway.
    - */
    - mmc->max_req_size = 524288;
    + }

    /*
    * Maximum segment size. Could be one segment with the maximum number

    \
     
     \ /
      Last update: 2017-12-04 17:23    [W:9.565 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site