Those two functions can be used to provide easy bootcount management. Signed-off-by: Lukasz Majewski <lu...@denx.de>
--- Changes in v3: - Unify those functions to also work with common/autoboot.c code - Add enum bootcount_context to distinguish between u-boot proper and SPL Changes in v2: - None include/bootcount.h | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/include/bootcount.h b/include/bootcount.h index e3b3f7028e..16fc657b2a 100644 --- a/include/bootcount.h +++ b/include/bootcount.h @@ -11,6 +11,13 @@ #include <asm/io.h> #include <asm/byteorder.h> +enum bootcount_context { + SPL = 1, + UBOOT, +}; + +#if defined CONFIG_SPL_BOOTCOUNT_LIMIT || defined CONFIG_BOOTCOUNT_LIMIT + #if !defined(CONFIG_SYS_BOOTCOUNT_LE) && !defined(CONFIG_SYS_BOOTCOUNT_BE) # if __BYTE_ORDER == __LITTLE_ENDIAN # define CONFIG_SYS_BOOTCOUNT_LE @@ -40,4 +47,47 @@ static inline u32 raw_bootcount_load(volatile u32 *addr) return in_be32(addr); } #endif + +static inline int bootcount_error(enum bootcount_context bc) +{ + unsigned long bootcount = bootcount_load(); + unsigned long bootlimit = env_get_ulong("bootlimit", 10, 0); + + if (bootlimit && bootcount > bootlimit) { + printf("Warning: Bootlimit (%lu) exceeded.", bootlimit); + if (bc == UBOOT) + printf(" Using altbootcmd."); + printf("\n"); + + return 1; + } + + return 0; +} + +static inline void bootcount_inc(enum bootcount_context bc) +{ + unsigned long bootcount = bootcount_load(); + + if (bc == SPL) { + bootcount_store(++bootcount); + return; + } + + /* Only increment bootcount when no bootcount support in SPL */ +#ifndef CONFIG_SPL_BOOTCOUNT_LIMIT + bootcount++; +#endif + bootcount_store(bootcount); + env_set_ulong("bootcount", bootcount); +} + +#if defined CONFIG_SPL_BUILD && !defined CONFIG_SPL_BOOTCOUNT_LIMIT +void bootcount_store(ulong a) {}; +ulong bootcount_load(void) { return 0; } +#endif /* CONFIG_SPL_BUILD && !CONFIG_SPL_BOOTCOUNT_LIMIT */ +#else +static inline int bootcount_error(enum bootcount_context bc) { return 0; } +static inline void bootcount_inc(enum bootcount_context bc) {} +#endif /* CONFIG_SPL_BOOTCOUNT_LIMIT || CONFIG_BOOTCOUNT_LIMIT */ #endif /* _BOOTCOUNT_H__ */ -- 2.11.0 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot