This patch consolidates bootcount_{store|load} for ARM by implementing a common version in arch/arm/lib/bootcount.c. This code is now used by all ARM variants that currently have these functions implemented.
Also supports two different bootcount versions: a) Use 2 separate words (2 * 32bit) to store the bootcounter b) Use only 1 word (2 * 16bit) to store the bootcounter The latter was already used by AT91. Signed-off-by: Anatolij Gustschin <ag...@denx.de> --- arch/arm/cpu/arm926ejs/at91/cpu.c | 34 ------------------------- arch/arm/cpu/ixp/cpu.c | 22 ---------------- arch/arm/lib/Makefile | 1 + arch/arm/lib/bootcount.c | 49 +++++++++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 56 deletions(-) create mode 100644 arch/arm/lib/bootcount.c diff --git a/arch/arm/cpu/arm926ejs/at91/cpu.c b/arch/arm/cpu/arm926ejs/at91/cpu.c index 141a7d1..1094f8c 100644 --- a/arch/arm/cpu/arm926ejs/at91/cpu.c +++ b/arch/arm/cpu/arm926ejs/at91/cpu.c @@ -35,13 +35,6 @@ #define CONFIG_SYS_AT91_MAIN_CLOCK 0 #endif -/* - * The at91sam9260 has 4 GPBR (0-3), we'll use the last one, nr 3, - * to keep track of the bootcount. - */ -#define AT91_GPBR_BOOTCOUNT_REGISTER 3 -#define AT91_BOOTCOUNT_ADDRESS (AT91_GPBR + 4*AT91_GPBR_BOOTCOUNT_REGISTER) - int arch_cpu_init(void) { return at91_clock_init(CONFIG_SYS_AT91_MAIN_CLOCK); @@ -63,30 +56,3 @@ int print_cpuinfo(void) return 0; } #endif - -#ifdef CONFIG_BOOTCOUNT_LIMIT -/* - * Just as the mpc5xxx, we combine the BOOTCOUNT_MAGIC and boocount - * in one 32-bit register. This is done, as the AT91SAM9260 only has - * 4 GPBR. - */ -void bootcount_store (ulong a) -{ - volatile ulong *save_addr = - (volatile ulong *)(AT91_BASE_SYS + AT91_BOOTCOUNT_ADDRESS); - - *save_addr = (BOOTCOUNT_MAGIC & 0xffff0000) | (a & 0x0000ffff); -} - -ulong bootcount_load (void) -{ - volatile ulong *save_addr = - (volatile ulong *)(AT91_BASE_SYS + AT91_BOOTCOUNT_ADDRESS); - - if ((*save_addr & 0xffff0000) != (BOOTCOUNT_MAGIC & 0xffff0000)) - return 0; - else - return (*save_addr & 0x0000ffff); -} - -#endif /* CONFIG_BOOTCOUNT_LIMIT */ diff --git a/arch/arm/cpu/ixp/cpu.c b/arch/arm/cpu/ixp/cpu.c index ce275e5..b35b1cd 100644 --- a/arch/arm/cpu/ixp/cpu.c +++ b/arch/arm/cpu/ixp/cpu.c @@ -112,28 +112,6 @@ void pci_init(void) } */ -#ifdef CONFIG_BOOTCOUNT_LIMIT - -void bootcount_store (ulong a) -{ - volatile ulong *save_addr = (volatile ulong *)(CONFIG_SYS_BOOTCOUNT_ADDR); - - save_addr[0] = a; - save_addr[1] = BOOTCOUNT_MAGIC; -} - -ulong bootcount_load (void) -{ - volatile ulong *save_addr = (volatile ulong *)(CONFIG_SYS_BOOTCOUNT_ADDR); - - if (save_addr[1] != BOOTCOUNT_MAGIC) - return 0; - else - return save_addr[0]; -} - -#endif /* CONFIG_BOOTCOUNT_LIMIT */ - int cpu_eth_init(bd_t *bis) { #ifdef CONFIG_IXP4XX_NPE diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index 0293348..4d26fe7 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile @@ -44,6 +44,7 @@ COBJS-y += cache-cp15.o endif COBJS-y += interrupts.o COBJS-y += reset.o +COBJS-$(CONFIG_BOOTCOUNT_LIMIT) += bootcount.o SRCS := $(GLSOBJS:.o=.S) $(GLCOBJS:.o=.c) \ $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) diff --git a/arch/arm/lib/bootcount.c b/arch/arm/lib/bootcount.c new file mode 100644 index 0000000..22f96bd --- /dev/null +++ b/arch/arm/lib/bootcount.c @@ -0,0 +1,49 @@ +#include <common.h> + +#ifdef CONFIG_AT91SAM9260 +#include <asm/arch/hardware.h> + +/* + * The at91sam9260 has 4 GPBR (0-3), we'll use the last one, nr 3, + * to keep track of the bootcount. + */ +#define AT91_GPBR_BOOTCOUNT_REGISTER 3 +#define AT91_BOOTCOUNT_ADDRESS (AT91_GPBR + 4 * AT91_GPBR_BOOTCOUNT_REGISTER) +#define CONFIG_SYS_BOOTCOUNT_ADDR (AT91_BASE_SYS + AT91_BOOTCOUNT_ADDRESS) +/* + * Just as the mpc5xxx, we combine the BOOTCOUNT_MAGIC and bootcount + * in one 32-bit register. This is done, as the AT91SAM9260 only has + * 4 GPBR. + */ +#define CONFIG_SYS_BOOTCOUNT_SINGLEWORD + +#endif /* CONFIG_AT91SAM9260 */ + +void bootcount_store(ulong a) +{ + volatile ulong *addr = (volatile ulong *)(CONFIG_SYS_BOOTCOUNT_ADDR); + +#if defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD) + addr[0] = (BOOTCOUNT_MAGIC & 0xffff0000) | (a & 0x0000ffff); +#else + addr[0] = a; + addr[1] = BOOTCOUNT_MAGIC; +#endif +} + +ulong bootcount_load(void) +{ + volatile ulong *addr = (volatile ulong *)(CONFIG_SYS_BOOTCOUNT_ADDR); + +#if defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD) + if ((addr[0] & 0xffff0000) == (BOOTCOUNT_MAGIC & 0xffff0000)) + return addr[0] & 0x0000ffff; + else + return 0; +#else + if (addr[1] == BOOTCOUNT_MAGIC) + return addr[0]; + else + return 0; +#endif +} -- 1.7.0.4 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot