bootcount: Fix misaligned cache operation
authorAlex Kiernan <alex.kiernan@gmail.com>
Wed, 25 Jul 2018 11:45:58 +0000 (11:45 +0000)
committerTom Rini <trini@konsulko.com>
Fri, 3 Aug 2018 23:53:54 +0000 (19:53 -0400)
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 [4030b7fc4030b83c]

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>
drivers/bootcount/bootcount.c

index a3162c97edd3d9a01a64645e91a1ba662c6bc537..646c563f8a4a5f7d400ff1af39a77ea822fbf19e 100644 (file)
 __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)