1 /* 2 * (C) Copyright 2010-2012 3 * Stefan Roese, DENX Software Engineering, sr@denx.de. 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 8 #include <bootcount.h> 9 #include <linux/compiler.h> 10 11 /* 12 * Only override CONFIG_SYS_BOOTCOUNT_ADDR if not already defined. This 13 * way, some boards can define it directly in their config header. 14 */ 15 #if !defined(CONFIG_SYS_BOOTCOUNT_ADDR) 16 17 #if defined(CONFIG_QE) 18 #include <linux/immap_qe.h> 19 #define CONFIG_SYS_BOOTCOUNT_ADDR (CONFIG_SYS_IMMR + 0x110000 + \ 20 QE_MURAM_SIZE - 2 * sizeof(u32)) 21 #endif /* defined(CONFIG_QE) */ 22 23 #endif /* !defined(CONFIG_SYS_BOOTCOUNT_ADDR) */ 24 25 /* Now implement the generic default functions */ 26 #if defined(CONFIG_SYS_BOOTCOUNT_ADDR) 27 __weak void bootcount_store(ulong a) 28 { 29 void *reg = (void *)CONFIG_SYS_BOOTCOUNT_ADDR; 30 31 #if defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD) 32 raw_bootcount_store(reg, (BOOTCOUNT_MAGIC & 0xffff0000) | a); 33 #else 34 raw_bootcount_store(reg, a); 35 raw_bootcount_store(reg + 4, BOOTCOUNT_MAGIC); 36 #endif /* defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD */ 37 } 38 39 __weak ulong bootcount_load(void) 40 { 41 void *reg = (void *)CONFIG_SYS_BOOTCOUNT_ADDR; 42 43 #if defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD) 44 u32 tmp = raw_bootcount_load(reg); 45 46 if ((tmp & 0xffff0000) != (BOOTCOUNT_MAGIC & 0xffff0000)) 47 return 0; 48 else 49 return (tmp & 0x0000ffff); 50 #else 51 if (raw_bootcount_load(reg + 4) != BOOTCOUNT_MAGIC) 52 return 0; 53 else 54 return raw_bootcount_load(reg); 55 #endif /* defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD) */ 56 } 57 #endif /* defined(CONFIG_SYS_BOOTCOUNT_ADDR) */ 58