Message ID | 1347991528-11255-1-git-send-email-swarren@wwwdotorg.org |
---|---|
State | Accepted |
Commit | 55b523b7d4ab885142f77d388007eb5490ba6bf4 |
Delegated to: | Tom Rini |
Headers | show |
On Tue, Sep 18, 2012 at 12:05:28PM -0600, Stephen Warren wrote: > From: Stephen Warren <swarren@nvidia.com> > > DMA buffer cache invalidation requires that buffers have cache-aligned > buffer locations and sizes. Use memalign() and ALLOC_CACHE_ALIGN_BUFFER() > to ensure this. > > On Tegra at least, without this fix, the following fail commands fail in > u-boot-master/ext4, but succeeded at the branch's branch point in > u-boot/master. With this fix, the commands work again: > > ext2ls mmc 0:1 / > ext2load mmc 0:1 /boot/zImage > > Cc: Uma Shankar <uma.shankar@samsung.com> > Cc: Manjunatha C Achar <a.manjunatha@samsung.com> > Cc: Iqbal Shareef <iqbal.ams@samsung.com> > Cc: Hakgoo Lee <goodguy.lee@samsung.com> > Cc: Wolfgang Denk <wd@denx.de> > Cc: Tom Rini <trini@ti.com> > Signed-off-by: Stephen Warren <swarren@nvidia.com> Applied to u-boot/master, thanks!
diff --git a/fs/ext4/dev.c b/fs/ext4/dev.c index fb62f24..9e85228 100644 --- a/fs/ext4/dev.c +++ b/fs/ext4/dev.c @@ -62,7 +62,7 @@ int ext4fs_set_blk_dev(block_dev_desc_t *rbdd, int part) int ext4fs_devread(int sector, int byte_offset, int byte_len, char *buf) { - char sec_buf[SECTOR_SIZE]; + ALLOC_CACHE_ALIGN_BUFFER(char, sec_buf, SECTOR_SIZE); unsigned block_len; /* Check partition boundaries */ @@ -107,7 +107,7 @@ int ext4fs_devread(int sector, int byte_offset, int byte_len, char *buf) block_len = byte_len & ~(SECTOR_SIZE - 1); if (block_len == 0) { - u8 p[SECTOR_SIZE]; + ALLOC_CACHE_ALIGN_BUFFER(u8, p, SECTOR_SIZE); block_len = SECTOR_SIZE; ext4fs_block_dev_desc->block_read(ext4fs_block_dev_desc->dev, diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c index 083e45e..3deffd5 100644 --- a/fs/ext4/ext4_common.c +++ b/fs/ext4/ext4_common.c @@ -71,7 +71,7 @@ void put_ext4(uint64_t off, void *buf, uint32_t size) uint64_t startblock; uint64_t remainder; unsigned char *temp_ptr = NULL; - unsigned char sec_buf[SECTOR_SIZE]; + ALLOC_CACHE_ALIGN_BUFFER(unsigned char, sec_buf, SECTOR_SIZE); struct ext_filesystem *fs = get_fs(); startblock = off / (uint64_t)SECTOR_SIZE; diff --git a/fs/ext4/ext4_common.h b/fs/ext4/ext4_common.h index 801b8b8..0af625d 100644 --- a/fs/ext4/ext4_common.h +++ b/fs/ext4/ext4_common.h @@ -55,7 +55,12 @@ #define SUPERBLOCK_SIZE 1024 #define F_FILE 1 -#define zalloc(size) calloc(1, size) +static inline void *zalloc(size_t size) +{ + void *p = memalign(ARCH_DMA_MINALIGN, size); + memset(p, 0, size); + return p; +} extern unsigned long part_offset; int ext4fs_read_inode(struct ext2_data *data, int ino,