[U-Boot] [PATCH] bootcount: Fix misaligned cache operation

Alex Kiernan alex.kiernan at gmail.com
Wed Jul 25 11:45:58 UTC 2018


1947c2d2a0 introduces cache line flushes for the bootcounter, but if
the start address is not aligned then the flush causes warnings of
the form:

  CACHE: Misaligned operation at range [4030b7fc, 4030b83c]

Align both the start and end of the buffer (possibly crossing multiple
lines).

Fixes: 1947c2d2a0 ("bootcount: flush after storing the bootcounter")
Signed-off-by: Alex Kiernan <alex.kiernan at gmail.com>
---

 drivers/bootcount/bootcount.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/bootcount/bootcount.c b/drivers/bootcount/bootcount.c
index a3162c97ed..646c563f8a 100644
--- a/drivers/bootcount/bootcount.c
+++ b/drivers/bootcount/bootcount.c
@@ -11,16 +11,23 @@
 __weak void bootcount_store(ulong a)
 {
 	void *reg = (void *)CONFIG_SYS_BOOTCOUNT_ADDR;
+	uintptr_t flush_start = rounddown(CONFIG_SYS_BOOTCOUNT_ADDR,
+					  CONFIG_SYS_CACHELINE_SIZE);
+	uintptr_t flush_end;
 
 #if defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD)
 	raw_bootcount_store(reg, (BOOTCOUNT_MAGIC & 0xffff0000) | a);
+
+	flush_end = roundup(CONFIG_SYS_BOOTCOUNT_ADDR + 4,
+			    CONFIG_SYS_CACHELINE_SIZE);
 #else
 	raw_bootcount_store(reg, a);
 	raw_bootcount_store(reg + 4, BOOTCOUNT_MAGIC);
+
+	flush_end = roundup(CONFIG_SYS_BOOTCOUNT_ADDR + 8,
+			    CONFIG_SYS_CACHELINE_SIZE);
 #endif /* defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD */
-	flush_dcache_range(CONFIG_SYS_BOOTCOUNT_ADDR,
-				CONFIG_SYS_BOOTCOUNT_ADDR +
-				CONFIG_SYS_CACHELINE_SIZE);
+	flush_dcache_range(flush_start, flush_end);
 }
 
 __weak ulong bootcount_load(void)
-- 
2.17.1



More information about the U-Boot mailing list