mmc: dw_mmc: Round up descriptor end to nearest multiple of cacheline size
authorMarek Vasut <marex@denx.de>
Wed, 13 Feb 2019 19:16:20 +0000 (20:16 +0100)
committerMarek Vasut <marex@denx.de>
Mon, 29 Apr 2019 08:08:56 +0000 (10:08 +0200)
The driver currently calculates the end address of cache flush operation
for the DMA descriptors by adding cacheline size to the start address of
the last DMA descriptor. This is not safe, as the cacheline size may be,
in some unlikely cases, smaller than the DMA descriptor size. Replace the
addition with roundup() applied on the end address of the last DMA
descriptor to round it up to the nearest cacheline size multiple.

Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Jaehoon Chung <jh80.chung@samsung.com>
Cc: Simon Glass <sjg@chromium.org>
drivers/mmc/dw_mmc.c

index 2faaa43911b57fbc4d0265e9e2e91641d2b36ef1..1992d611821dc833398ca921b979c153b08e3135 100644 (file)
@@ -74,15 +74,15 @@ static void dwmci_prepare_data(struct dwmci_host *host,
                dwmci_set_idma_desc(cur_idmac, flags, cnt,
                                    (ulong)bounce_buffer + (i * PAGE_SIZE));
 
+               cur_idmac++;
                if (blk_cnt <= 8)
                        break;
                blk_cnt -= 8;
-               cur_idmac++;
                i++;
        } while(1);
 
        data_end = (ulong)cur_idmac;
-       flush_dcache_range(data_start, data_end + ARCH_DMA_MINALIGN);
+       flush_dcache_range(data_start, roundup(data_end, ARCH_DMA_MINALIGN));
 
        ctrl = dwmci_readl(host, DWMCI_CTRL);
        ctrl |= DWMCI_IDMAC_EN | DWMCI_DMA_EN;