MX28: MMC: Avoid DMA DCache race condition
authorMarek Vasut <marex@denx.de>
Fri, 31 Aug 2012 16:18:10 +0000 (16:18 +0000)
committerStefano Babic <sbabic@denx.de>
Thu, 6 Sep 2012 12:17:55 +0000 (14:17 +0200)
This patch prevents dcache-related problem. The problem manifested
itself on the SPI driver, this is just a port to the MMC driver.

The scenario is the same. In case an "mmc read" is issued to a
buffer which was written right before it and data cache is enabled,
the cache eviction might happen during the DMA transfer into the
buffer, therefore corrupting the buffer. Clear any cache lines that
might contain the buffer to prevent such issue.

Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Fabio Estevam <festevam@gmail.com>
Cc: Otavio Salvador <otavio@ossystems.com.br>
Cc: Stefano Babic <sbabic@denx.de>
drivers/mmc/mxsmmc.c

index 9a98c6b85be99c91f1f32af46cb384242b4a82e4..c80b41b1925c88b9ba2d3305aeeb06f7307adbca 100644 (file)
@@ -119,6 +119,10 @@ static int mxsmmc_send_cmd_dma(struct mxsmmc_priv *priv, struct mmc_data *data)
                        (uint32_t)(priv->desc->cmd.address + cache_data_count));
        }
 
+       /* Invalidate the area, so no writeback into the RAM races with DMA */
+       invalidate_dcache_range((uint32_t)priv->desc->cmd.address,
+                       (uint32_t)(priv->desc->cmd.address + cache_data_count));
+
        priv->desc->cmd.data |= MXS_DMA_DESC_IRQ | MXS_DMA_DESC_DEC_SEM |
                                (data_count << MXS_DMA_DESC_BYTES_OFFSET);