
Folks,
Stephen Warren has posted an internal bug regarding the cache alignment 'warnings' seen on Tegra20 boards when accessing MMC. Here's the gist:
Executing "mmc dev 0" still yields cache warnings:
Tegra20 (Harmony) # mmc dev 0 ERROR: v7_dcache_inval_range- stop address is not aligned- 0x3fb69908 mmc0 is current device
I carry the patch below to turn these off, but I'd like to drop it.
commit 37bccb3c67897a8944c458d511dac06389ea8f1e Author: Stephen Warren <swarren@nvidia.com > Date: Mon Apr 30 11:39:27 2012 -0600
HACK: Disable cache alignment warnings
They are very annoying and noisy
diff --git a/arch/arm/cpu/armv7/cache_v7.c b/arch/arm/cpu/armv7/cache_v7.c index 1b4e808..9031ea1 100644 --- a/arch/arm/cpu/armv7/cache_v7.c +++ b/arch/arm/cpu/armv7/cache_v7.c @@ -185,8 +185,10 @@ static void v7_dcache_inval_range(u32 start, u32 stop, u32 line_len) * invalidate the first cache-line */ if (start & (line_len- 1)) { +#if 0 printf("ERROR: %s- start address is not aligned- 0x%08x\n", __func__, start); +#endif /* move to next cache line */ start = (start + line_len- 1) & ~(line_len- 1); } @@ -196,8 +198,10 @@ static void v7_dcache_inval_range(u32 start, u32 stop, u32 line_len) * invalidate the last cache-line */ if (stop & (line_len- 1)) { +#if 0 printf("ERROR: %s- stop address is not aligned- 0x%08x\n", __func__, stop); +#endif /* align to the beginning of this cache line */ stop &= ~(line_len- 1); } diff --git a/arch/arm/lib/cache-pl310.c b/arch/arm/lib/cache-pl310.c index 21d13f7..d8a343c 100644 --- a/arch/arm/lib/cache-pl310.c +++ b/arch/arm/lib/cache-pl310.c @@ -94,8 +94,10 @@ void v7_outer_cache_inval_range(u32 start, u32 stop) * invalidate the first cache-line */ if (start & (line_size- 1)) { +#if 0 printf("ERROR: %s- start address is not aligned- 0x%08x\n", __func__, start); +#endif /* move to next cache line */ start = (start + line_size- 1) & ~(line_size- 1); } @@ -105,8 +107,10 @@ void v7_outer_cache_inval_range(u32 start, u32 stop) * invalidate the last cache-line */ if (stop & (line_size- 1)) { +#if 0 printf("ERROR: %s- stop address is not aligned- 0x%08x\n", __func__, stop); +#endif /* align to the beginning of this cache line */ stop &= ~(line_size- 1); }
There have been patches in the past (IIRC) that have tried to ensure all callers (FS, MMC driver, USB driver, etc.) force their buffers to the appropriate alignment, but I don't know that we can ever correct every instance, now or in the future.
Can we start a discussion about what we can do about this warning? Adding an appropriate #ifdef (CONFIG_SYS_NO_CACHE_ALIGNMENT_WARNINGS, etc.) where Stephen put his #if 0's would be one approach, or changing the printf() to a debug(), perhaps. As far as I can tell, these alignment 'errors' don't seem to produce bad data in the transfer.
Thanks,
Tom