Commit 16b492ce authored by Sergei Antonov's avatar Sergei Antonov Committed by Ulf Hansson

mmc: moxart: set maximum request/block/segment sizes

Per datasheet: maximum block length is 2048 bytes,
data length field is in bits 0-23 of the Data Length Register.

Also for DMA mode we have to take into account rx/tx buffers' sizes.

In my tests this change doubles SD card I/O performance on big files.
Before the change Linux used default request size of 4 KB.
Signed-off-by: default avatarSergei Antonov <saproj@gmail.com>
Link: https://lore.kernel.org/r/20230210143843.369943-1-saproj@gmail.comSigned-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 08623d74
...@@ -611,6 +611,9 @@ static int moxart_probe(struct platform_device *pdev) ...@@ -611,6 +611,9 @@ static int moxart_probe(struct platform_device *pdev)
mmc->f_max = DIV_ROUND_CLOSEST(host->sysclk, 2); mmc->f_max = DIV_ROUND_CLOSEST(host->sysclk, 2);
mmc->f_min = DIV_ROUND_CLOSEST(host->sysclk, CLK_DIV_MASK * 2); mmc->f_min = DIV_ROUND_CLOSEST(host->sysclk, CLK_DIV_MASK * 2);
mmc->ocr_avail = 0xffff00; /* Support 2.0v - 3.6v power. */ mmc->ocr_avail = 0xffff00; /* Support 2.0v - 3.6v power. */
mmc->max_blk_size = 2048; /* Max. block length in REG_DATA_CONTROL */
mmc->max_req_size = DATA_LEN_MASK; /* bits 0-23 in REG_DATA_LENGTH */
mmc->max_blk_count = mmc->max_req_size / 512;
if (IS_ERR(host->dma_chan_tx) || IS_ERR(host->dma_chan_rx)) { if (IS_ERR(host->dma_chan_tx) || IS_ERR(host->dma_chan_rx)) {
if (PTR_ERR(host->dma_chan_tx) == -EPROBE_DEFER || if (PTR_ERR(host->dma_chan_tx) == -EPROBE_DEFER ||
...@@ -628,6 +631,8 @@ static int moxart_probe(struct platform_device *pdev) ...@@ -628,6 +631,8 @@ static int moxart_probe(struct platform_device *pdev)
} }
dev_dbg(dev, "PIO mode transfer enabled\n"); dev_dbg(dev, "PIO mode transfer enabled\n");
host->have_dma = false; host->have_dma = false;
mmc->max_seg_size = mmc->max_req_size;
} else { } else {
dev_dbg(dev, "DMA channels found (%p,%p)\n", dev_dbg(dev, "DMA channels found (%p,%p)\n",
host->dma_chan_tx, host->dma_chan_rx); host->dma_chan_tx, host->dma_chan_rx);
...@@ -646,6 +651,10 @@ static int moxart_probe(struct platform_device *pdev) ...@@ -646,6 +651,10 @@ static int moxart_probe(struct platform_device *pdev)
cfg.src_addr = host->reg_phys + REG_DATA_WINDOW; cfg.src_addr = host->reg_phys + REG_DATA_WINDOW;
cfg.dst_addr = 0; cfg.dst_addr = 0;
dmaengine_slave_config(host->dma_chan_rx, &cfg); dmaengine_slave_config(host->dma_chan_rx, &cfg);
mmc->max_seg_size = min3(mmc->max_req_size,
dma_get_max_seg_size(host->dma_chan_rx->device->dev),
dma_get_max_seg_size(host->dma_chan_tx->device->dev));
} }
if (readl(host->base + REG_BUS_WIDTH) & BUS_WIDTH_4_SUPPORT) if (readl(host->base + REG_BUS_WIDTH) & BUS_WIDTH_4_SUPPORT)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment