mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 13:53:33 +00:00
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: Sergei Antonov <saproj@gmail.com> Link: https://lore.kernel.org/r/20230210143843.369943-1-saproj@gmail.com Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
parent
08623d741e
commit
16b492ce0a
1 changed files with 9 additions and 0 deletions
|
@ -611,6 +611,9 @@ static int moxart_probe(struct platform_device *pdev)
|
|||
mmc->f_max = DIV_ROUND_CLOSEST(host->sysclk, 2);
|
||||
mmc->f_min = DIV_ROUND_CLOSEST(host->sysclk, CLK_DIV_MASK * 2);
|
||||
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 (PTR_ERR(host->dma_chan_tx) == -EPROBE_DEFER ||
|
||||
|
@ -628,6 +631,8 @@ static int moxart_probe(struct platform_device *pdev)
|
|||
}
|
||||
dev_dbg(dev, "PIO mode transfer enabled\n");
|
||||
host->have_dma = false;
|
||||
|
||||
mmc->max_seg_size = mmc->max_req_size;
|
||||
} else {
|
||||
dev_dbg(dev, "DMA channels found (%p,%p)\n",
|
||||
host->dma_chan_tx, host->dma_chan_rx);
|
||||
|
@ -646,6 +651,10 @@ static int moxart_probe(struct platform_device *pdev)
|
|||
cfg.src_addr = host->reg_phys + REG_DATA_WINDOW;
|
||||
cfg.dst_addr = 0;
|
||||
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)
|
||||
|
|
Loading…
Reference in a new issue