uboot/include/bootcount.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/*
   3 * (C) Copyright 2012
   4 * Stefan Roese, DENX Software Engineering, sr@denx.de.
   5 */
   6#ifndef _BOOTCOUNT_H__
   7#define _BOOTCOUNT_H__
   8
   9#include <common.h>
  10#include <asm/io.h>
  11#include <asm/byteorder.h>
  12
  13#if defined(CONFIG_SPL_BOOTCOUNT_LIMIT) || defined(CONFIG_BOOTCOUNT_LIMIT)
  14
  15#if !defined(CONFIG_SYS_BOOTCOUNT_LE) && !defined(CONFIG_SYS_BOOTCOUNT_BE)
  16# if __BYTE_ORDER == __LITTLE_ENDIAN
  17#  define CONFIG_SYS_BOOTCOUNT_LE
  18# else
  19#  define CONFIG_SYS_BOOTCOUNT_BE
  20# endif
  21#endif
  22
  23#ifdef CONFIG_SYS_BOOTCOUNT_LE
  24static inline void raw_bootcount_store(volatile u32 *addr, u32 data)
  25{
  26        out_le32(addr, data);
  27}
  28
  29static inline u32 raw_bootcount_load(volatile u32 *addr)
  30{
  31        return in_le32(addr);
  32}
  33#else
  34static inline void raw_bootcount_store(volatile u32 *addr, u32 data)
  35{
  36        out_be32(addr, data);
  37}
  38
  39static inline u32 raw_bootcount_load(volatile u32 *addr)
  40{
  41        return in_be32(addr);
  42}
  43#endif
  44
  45DECLARE_GLOBAL_DATA_PTR;
  46static inline int bootcount_error(void)
  47{
  48        unsigned long bootcount = bootcount_load();
  49        unsigned long bootlimit = env_get_ulong("bootlimit", 10, 0);
  50
  51        if (bootlimit && bootcount > bootlimit) {
  52                printf("Warning: Bootlimit (%lu) exceeded.", bootlimit);
  53                if (!(gd->flags & GD_FLG_SPL_INIT))
  54                        printf(" Using altbootcmd.");
  55                printf("\n");
  56
  57                return 1;
  58        }
  59
  60        return 0;
  61}
  62
  63static inline void bootcount_inc(void)
  64{
  65        unsigned long bootcount = bootcount_load();
  66
  67        if (gd->flags & GD_FLG_SPL_INIT) {
  68                bootcount_store(++bootcount);
  69                return;
  70        }
  71
  72#ifndef CONFIG_SPL_BUILD
  73        /* Only increment bootcount when no bootcount support in SPL */
  74#ifndef CONFIG_SPL_BOOTCOUNT_LIMIT
  75        bootcount_store(++bootcount);
  76#endif
  77        env_set_ulong("bootcount", bootcount);
  78#endif /* !CONFIG_SPL_BUILD */
  79}
  80
  81#if defined(CONFIG_SPL_BUILD) && !defined(CONFIG_SPL_BOOTCOUNT_LIMIT)
  82void bootcount_store(ulong a) {};
  83ulong bootcount_load(void) { return 0; }
  84#endif /* CONFIG_SPL_BUILD && !CONFIG_SPL_BOOTCOUNT_LIMIT */
  85#else
  86static inline int bootcount_error(void) { return 0; }
  87static inline void bootcount_inc(void) {}
  88#endif /* CONFIG_SPL_BOOTCOUNT_LIMIT || CONFIG_BOOTCOUNT_LIMIT */
  89#endif /* _BOOTCOUNT_H__ */
  90