瀏覽代碼

bootcount: Fix misaligned cache operation

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@gmail.com>
Acked-by: Stefano Babic <sbabic@denx.de>
Alex Kiernan 5 年之前
父節點
當前提交
fe9805fc7f
共有 1 個文件被更改,包括 10 次插入3 次删除
  1. 10 3
      drivers/bootcount/bootcount.c

+ 10 - 3
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)