[U-Boot] [PATCH 4/5] mmc: Create dcache flush and invalidate convenience methods

Anton Staaf robotboy at chromium.org
Thu Oct 13 23:57:07 CEST 2011


With the enabling of data caches in U-Boot flushing and invalidating MMC
buffers will need to be done in all MMC drivers.  These utility functions
simplify that task slightly.

Signed-off-by: Anton Staaf <robotboy at chromium.org>
Cc: Andy Fleming <afleming at gmail.com>
---
 drivers/mmc/mmc.c |   23 +++++++++++++++++++++++
 include/mmc.h     |   10 ++++++++++
 2 files changed, 33 insertions(+), 0 deletions(-)

diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 391bc2b..5001bb1 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -47,6 +47,29 @@ int __board_mmc_getcd(u8 *cd, struct mmc *mmc) {
 int board_mmc_getcd(u8 *cd, struct mmc *mmc)__attribute__((weak,
 	alias("__board_mmc_getcd")));
 
+/*
+ * Flush the data cache lines associated with the given mmc_data structs buffer.
+ */
+void mmc_dcache_flush(struct mmc_data *data)
+{
+	unsigned long start = (unsigned long) data->dest;
+	unsigned long stop = start + (data->blocksize * data->blocks);
+
+	flush_dcache_range(start, stop);
+}
+
+/*
+ * Invalidate the data cache lines associated with the given mmc_data structs
+ * buffer.
+ */
+void mmc_dcache_invalidate(struct mmc_data *data)
+{
+	unsigned long start = (unsigned long) data->dest;
+	unsigned long stop = start + (data->blocksize * data->blocks);
+
+	invalidate_dcache_range(start, stop);
+}
+
 int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
 {
 #ifdef CONFIG_MMC_TRACE
diff --git a/include/mmc.h b/include/mmc.h
index 53aff9b..94be2e1 100644
--- a/include/mmc.h
+++ b/include/mmc.h
@@ -315,6 +315,16 @@ int get_mmc_num(void);
 int board_mmc_getcd(u8 *cd, struct mmc *mmc);
 int mmc_switch_part(int dev_num, unsigned int part_num);
 
+/*
+ * Given an mmc_data struct these flush and invalidate the cache range covered
+ * by the mmc_data buffer.  A flush should be done before starting a DMA
+ * transfer from the mmc_data struct.  An invalidate should be done after a
+ * DMA transfer finishes that wrote to the memory referenced in the mmc_data
+ * struct.
+ */
+void mmc_dcache_flush(struct mmc_data *data);
+void mmc_dcache_invalidate(struct mmc_data *data);
+
 #ifdef CONFIG_GENERIC_MMC
 int atmel_mci_init(void *regs);
 #define mmc_host_is_spi(mmc)	((mmc)->host_caps & MMC_MODE_SPI)
-- 
1.7.3.1



More information about the U-Boot mailing list