[U-Boot] [PATCH] fat: Use cache aligned buffers for fat_opendir

Before this patch one could receive following errors when executing "fatls" command on machine with cache enabled (ex i.MX6Q) :
=> fatls mmc 0:1 CACHE: Misaligned operation at range [4f59dfc8, 4f59e7c8] CACHE: Misaligned operation at range [4f59dfc8, 4f59e7c8] ERROR: v7_outer_cache_inval_range - start address is not aligned - 0x4f59dfc8 ERROR: v7_outer_cache_inval_range - stop address is not aligned - 0x4f59e7c8 CACHE: Misaligned operation at range [4f59dfc8, 4f59e7c8] CACHE: Misaligned operation at range [4f59dfc8, 4f59e7c8] ERROR: v7_outer_cache_inval_range - start address is not aligned - 0x4f59dfc8 ERROR: v7_outer_cache_inval_range - stop address is not aligned - 0x4f59e7c8
To alleviate this problem - the calloc()s have been replaced with malloc_cache_aligned() and memset().
After those changes the buffers are properly aligned (with both start address and size) to SoC cache line.
Fixes: 09fa964bba80 ("fs/fat: Fix 'CACHE: Misaligned operation at range' warnings") Suggested-by: Lukasz Majewski lukma@denx.de Signed-off-by: Neil Armstrong narmstrong@baylibre.com --- fs/fat/fat.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/fs/fat/fat.c b/fs/fat/fat.c index 7fe7843..d16883f 100644 --- a/fs/fat/fat.c +++ b/fs/fat/fat.c @@ -1149,11 +1149,13 @@ typedef struct {
int fat_opendir(const char *filename, struct fs_dir_stream **dirsp) { - fat_dir *dir = calloc(1, sizeof(*dir)); + fat_dir *dir; int ret;
+ dir = malloc_cache_aligned(sizeof(*dir)); if (!dir) return -ENOMEM; + memset(dir, 0, sizeof(*dir));
ret = fat_itr_root(&dir->itr, &dir->fsdata); if (ret)

On Fri, 24 Nov 2017 09:54:41 +0100 Neil Armstrong narmstrong@baylibre.com wrote:
Before this patch one could receive following errors when executing "fatls" command on machine with cache enabled (ex i.MX6Q) :
=> fatls mmc 0:1 CACHE: Misaligned operation at range [4f59dfc8, 4f59e7c8] CACHE: Misaligned operation at range [4f59dfc8, 4f59e7c8] ERROR: v7_outer_cache_inval_range - start address is not aligned - 0x4f59dfc8 ERROR: v7_outer_cache_inval_range - stop address is not aligned - 0x4f59e7c8 CACHE: Misaligned operation at range [4f59dfc8, 4f59e7c8] CACHE: Misaligned operation at range [4f59dfc8, 4f59e7c8] ERROR: v7_outer_cache_inval_range - start address is not aligned - 0x4f59dfc8 ERROR: v7_outer_cache_inval_range - stop address is not aligned - 0x4f59e7c8
To alleviate this problem - the calloc()s have been replaced with malloc_cache_aligned() and memset().
After those changes the buffers are properly aligned (with both start address and size) to SoC cache line.
Fixes: 09fa964bba80 ("fs/fat: Fix 'CACHE: Misaligned operation at range' warnings") Suggested-by: Lukasz Majewski lukma@denx.de Signed-off-by: Neil Armstrong narmstrong@baylibre.com
fs/fat/fat.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/fs/fat/fat.c b/fs/fat/fat.c index 7fe7843..d16883f 100644 --- a/fs/fat/fat.c +++ b/fs/fat/fat.c @@ -1149,11 +1149,13 @@ typedef struct {
int fat_opendir(const char *filename, struct fs_dir_stream **dirsp) {
- fat_dir *dir = calloc(1, sizeof(*dir));
fat_dir *dir; int ret;
dir = malloc_cache_aligned(sizeof(*dir)); if (!dir) return -ENOMEM;
memset(dir, 0, sizeof(*dir));
ret = fat_itr_root(&dir->itr, &dir->fsdata); if (ret)
Reviewed-by: Lukasz Majewski lukma@denx.de
Best regards,
Lukasz Majewski
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de

Hi Neil,
On Fri, Nov 24, 2017 at 6:54 AM, Neil Armstrong narmstrong@baylibre.com wrote:
Before this patch one could receive following errors when executing "fatls" command on machine with cache enabled (ex i.MX6Q) :
=> fatls mmc 0:1 CACHE: Misaligned operation at range [4f59dfc8, 4f59e7c8] CACHE: Misaligned operation at range [4f59dfc8, 4f59e7c8] ERROR: v7_outer_cache_inval_range - start address is not aligned - 0x4f59dfc8 ERROR: v7_outer_cache_inval_range - stop address is not aligned - 0x4f59e7c8 CACHE: Misaligned operation at range [4f59dfc8, 4f59e7c8] CACHE: Misaligned operation at range [4f59dfc8, 4f59e7c8] ERROR: v7_outer_cache_inval_range - start address is not aligned - 0x4f59dfc8 ERROR: v7_outer_cache_inval_range - stop address is not aligned - 0x4f59e7c8
To alleviate this problem - the calloc()s have been replaced with malloc_cache_aligned() and memset().
After those changes the buffers are properly aligned (with both start address and size) to SoC cache line.
Fixes: 09fa964bba80 ("fs/fat: Fix 'CACHE: Misaligned operation at range' warnings") Suggested-by: Lukasz Majewski lukma@denx.de Signed-off-by: Neil Armstrong narmstrong@baylibre.com
Thanks for the fix:
Reviewed-by: Fabio Estevam fabio.estevam@nxp.com

On Fri, Nov 24, 2017 at 09:54:41AM +0100, Neil Armstrong wrote:
Before this patch one could receive following errors when executing "fatls" command on machine with cache enabled (ex i.MX6Q) :
=> fatls mmc 0:1 CACHE: Misaligned operation at range [4f59dfc8, 4f59e7c8] CACHE: Misaligned operation at range [4f59dfc8, 4f59e7c8] ERROR: v7_outer_cache_inval_range - start address is not aligned - 0x4f59dfc8 ERROR: v7_outer_cache_inval_range - stop address is not aligned - 0x4f59e7c8 CACHE: Misaligned operation at range [4f59dfc8, 4f59e7c8] CACHE: Misaligned operation at range [4f59dfc8, 4f59e7c8] ERROR: v7_outer_cache_inval_range - start address is not aligned - 0x4f59dfc8 ERROR: v7_outer_cache_inval_range - stop address is not aligned - 0x4f59e7c8
To alleviate this problem - the calloc()s have been replaced with malloc_cache_aligned() and memset().
After those changes the buffers are properly aligned (with both start address and size) to SoC cache line.
Fixes: 09fa964bba80 ("fs/fat: Fix 'CACHE: Misaligned operation at range' warnings") Suggested-by: Lukasz Majewski lukma@denx.de Signed-off-by: Neil Armstrong narmstrong@baylibre.com Reviewed-by: Lukasz Majewski lukma@denx.de Reviewed-by: Fabio Estevam fabio.estevam@nxp.com
Applied to u-boot/master, thanks!
participants (4)
-
Fabio Estevam
-
Lukasz Majewski
-
Neil Armstrong
-
Tom Rini