public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] mmc:dcache: Cache line size aligned internal MMC buffers
@ 2011-08-19  9:25 Lukasz Majewski
  2011-08-19 13:57 ` Mike Frysinger
  0 siblings, 1 reply; 55+ messages in thread
From: Lukasz Majewski @ 2011-08-19  9:25 UTC (permalink / raw)
  To: u-boot

MMC operations are performed on cache line size aligned buffers.
In the current MMC implementation it is allowed to pass buffer 
with arbitrary alignment.
In this patch assumption has been made, that it is better to align the buffer
on the MMC framework boundary, than in a number of u-boot subsystems, which are
using MMC.

Signed-off-by: Lukasz Majewski <l.majewski@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
CC: Andy Fleming <afleming@gmail.com>
CC: Albert ARIBAUD <albert.u.boot@aribaud.net>
---
 drivers/mmc/mmc.c |   30 +++++++++++++++++++++++++++---
 1 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
index 5f79a17..47e94c8 100644
--- a/drivers/mmc/mmc.c
+++ b/drivers/mmc/mmc.c
@@ -263,6 +263,7 @@ mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)
 	struct mmc_cmd cmd;
 	struct mmc_data data;
 	int timeout = 1000;
+	void *cache_align_buf;
 
 	if ((start + blkcnt) > mmc->block_dev.lba) {
 		printf("MMC: block number 0x%lx exceeds max(0x%lx)\n",
@@ -283,13 +284,22 @@ mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)
 	cmd.resp_type = MMC_RSP_R1;
 	cmd.flags = 0;
 
-	data.src = src;
+	cache_align_buf = memalign(get_dcache_line_size(),
+				   mmc->write_bl_len * blkcnt);
+
+	if (!cache_align_buf)
+		return -ENOMEM;
+
+	memcpy(cache_align_buf, src, mmc->write_bl_len * blkcnt);
+
+	data.src = cache_align_buf;
 	data.blocks = blkcnt;
 	data.blocksize = mmc->write_bl_len;
 	data.flags = MMC_DATA_WRITE;
 
 	if (mmc_send_cmd(mmc, &cmd, &data)) {
 		printf("mmc write failed\n");
+		free(cache_align_buf);
 		return 0;
 	}
 
@@ -303,6 +313,7 @@ mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)
 		cmd.flags = 0;
 		if (mmc_send_cmd(mmc, &cmd, NULL)) {
 			printf("mmc fail to send stop cmd\n");
+			free(cache_align_buf);
 			return 0;
 		}
 
@@ -310,6 +321,7 @@ mmc_write_blocks(struct mmc *mmc, ulong start, lbaint_t blkcnt, const void*src)
 		mmc_send_status(mmc, timeout);
 	}
 
+	free(cache_align_buf);
 	return blkcnt;
 }
 
@@ -342,6 +354,7 @@ int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start, lbaint_t blkcnt)
 	struct mmc_cmd cmd;
 	struct mmc_data data;
 	int timeout = 1000;
+	void *cache_align_buf;
 
 	if (blkcnt > 1)
 		cmd.cmdidx = MMC_CMD_READ_MULTIPLE_BLOCK;
@@ -356,13 +369,21 @@ int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start, lbaint_t blkcnt)
 	cmd.resp_type = MMC_RSP_R1;
 	cmd.flags = 0;
 
-	data.dest = dst;
+	cache_align_buf = memalign(get_dcache_line_size(),
+				   mmc->read_bl_len * blkcnt);
+
+	if (!cache_align_buf)
+		return -ENOMEM;
+
+	data.dest = cache_align_buf;
 	data.blocks = blkcnt;
 	data.blocksize = mmc->read_bl_len;
 	data.flags = MMC_DATA_READ;
 
-	if (mmc_send_cmd(mmc, &cmd, &data))
+	if (mmc_send_cmd(mmc, &cmd, &data)) {
+		free(cache_align_buf);
 		return 0;
+	}
 
 	if (blkcnt > 1) {
 		cmd.cmdidx = MMC_CMD_STOP_TRANSMISSION;
@@ -371,6 +392,7 @@ int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start, lbaint_t blkcnt)
 		cmd.flags = 0;
 		if (mmc_send_cmd(mmc, &cmd, NULL)) {
 			printf("mmc fail to send stop cmd\n");
+			free(cache_align_buf);
 			return 0;
 		}
 
@@ -378,6 +400,8 @@ int mmc_read_blocks(struct mmc *mmc, void *dst, ulong start, lbaint_t blkcnt)
 		mmc_send_status(mmc, timeout);
 	}
 
+	memcpy(dst, cache_align_buf, mmc->read_bl_len * blkcnt);
+	free(cache_align_buf);
 	return blkcnt;
 }
 
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 55+ messages in thread

end of thread, other threads:[~2011-08-29 23:05 UTC | newest]

Thread overview: 55+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-08-19  9:25 [U-Boot] [PATCH] mmc:dcache: Cache line size aligned internal MMC buffers Lukasz Majewski
2011-08-19 13:57 ` Mike Frysinger
2011-08-19 15:28   ` Lukasz Majewski
2011-08-19 15:35     ` Mike Frysinger
2011-08-22  7:29       ` Lukasz Majewski
2011-08-22 16:08         ` Mike Frysinger
2011-08-22 16:42           ` Anton Staaf
2011-08-22 16:52             ` Marek Vasut
2011-08-22 17:17             ` Mike Frysinger
2011-08-22 18:15               ` Anton Staaf
2011-08-22 18:31                 ` Mike Frysinger
2011-08-22 18:57                   ` Anton Staaf
2011-08-23  9:19                     ` Lukasz Majewski
2011-08-23 17:00                       ` Anton Staaf
2011-08-23 17:30                       ` Mike Frysinger
2011-08-23 18:12                         ` Anton Staaf
2011-08-23 18:35                           ` Mike Frysinger
2011-08-23 18:36                           ` Mike Frysinger
2011-08-23 18:46                             ` Anton Staaf
2011-08-23 20:12                           ` Wolfgang Denk
2011-08-23 20:27                             ` Anton Staaf
2011-08-23 20:37                               ` Mike Frysinger
2011-08-23 21:06                                 ` Anton Staaf
2011-08-23 21:32                                   ` Mike Frysinger
2011-08-23 21:09                                 ` Wolfgang Denk
2011-08-23 21:32                                   ` Mike Frysinger
2011-08-23 21:48                                     ` Anton Staaf
2011-08-24 16:16                                       ` Mike Frysinger
2011-08-23 22:42                                     ` Wolfgang Denk
2011-08-24  3:00                                       ` Mike Frysinger
2011-08-24 10:07                                         ` Lukasz Majewski
2011-08-24 13:25                                           ` Wolfgang Denk
2011-08-24 14:31                                             ` Lukasz Majewski
2011-08-24 16:20                                             ` Mike Frysinger
2011-08-24 17:27                                             ` Anton Staaf
2011-08-24 18:06                                               ` Mike Frysinger
2011-08-24 18:12                                               ` Wolfgang Denk
2011-08-24 18:25                                                 ` Anton Staaf
2011-08-24 19:04                                                   ` Wolfgang Denk
2011-08-24 20:12                                                     ` Anton Staaf
2011-08-24 19:18                                                   ` Lukasz Majewski
2011-08-24 20:13                                                     ` Anton Staaf
2011-08-29 20:12                                                       ` Anton Staaf
2011-08-29 20:35                                                         ` Wolfgang Denk
2011-08-29 21:08                                                           ` Anton Staaf
2011-08-29 20:47                                                         ` Scott Wood
2011-08-29 20:58                                                           ` Anton Staaf
2011-08-29 21:23                                                             ` Scott Wood
2011-08-29 21:54                                                               ` Anton Staaf
2011-08-29 22:03                                                                 ` Scott Wood
2011-08-29 22:49                                                                   ` Anton Staaf
2011-08-29 23:01                                                                     ` Scott Wood
2011-08-29 23:05                                                                       ` Anton Staaf
2011-08-23 20:35                             ` Mike Frysinger
2011-08-23  8:42           ` Lukasz Majewski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox