Commit 4f6627ac authored by Rui Sousa's avatar Rui Sousa Committed by Russell King

[ARM] 4568/1: fix l2x0 cache invalidate handling of unaligned addresses

The l2x0_inv_range() function doesn't handle unaligned addresses
correctly. It's necessary to clean the cache lines that are at the
start and end of the invalidate range, if the addresses are not aligned,
to prevent corruption of other data sharing the same cache line.
Signed-off-by: default avatarRui Sousa <rui.p.m.sousa@gmail.com>
Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent c2f82897
...@@ -57,7 +57,17 @@ static void l2x0_inv_range(unsigned long start, unsigned long end) ...@@ -57,7 +57,17 @@ static void l2x0_inv_range(unsigned long start, unsigned long end)
{ {
unsigned long addr; unsigned long addr;
if (start & (CACHE_LINE_SIZE - 1)) {
start &= ~(CACHE_LINE_SIZE - 1); start &= ~(CACHE_LINE_SIZE - 1);
sync_writel(start, L2X0_CLEAN_INV_LINE_PA, 1);
start += CACHE_LINE_SIZE;
}
if (end & (CACHE_LINE_SIZE - 1)) {
end &= ~(CACHE_LINE_SIZE - 1);
sync_writel(end, L2X0_CLEAN_INV_LINE_PA, 1);
}
for (addr = start; addr < end; addr += CACHE_LINE_SIZE) for (addr = start; addr < end; addr += CACHE_LINE_SIZE)
sync_writel(addr, L2X0_INV_LINE_PA, 1); sync_writel(addr, L2X0_INV_LINE_PA, 1);
cache_sync(); cache_sync();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment