From 758694ff076255115b6cd936b13108db3773ee57 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Thu, 11 Oct 2018 00:13:54 +0200 Subject: [PATCH] bootcount: Make bootcount magic configurable Add new Kconfig option, SYS_BOOTCOUNT_MAGIC, to select the boot counter magic word. This can be useful ie. in case the entire boot counter register is not usable. Signed-off-by: Marek Vasut Cc: Tom Rini --- drivers/bootcount/Kconfig | 6 ++++++ drivers/bootcount/bootcount.c | 8 ++++---- drivers/bootcount/bootcount_at91.c | 11 ++++++----- drivers/bootcount/bootcount_davinci.c | 4 ++-- drivers/bootcount/bootcount_ram.c | 2 +- include/common.h | 1 - 6 files changed, 19 insertions(+), 13 deletions(-) diff --git a/drivers/bootcount/Kconfig b/drivers/bootcount/Kconfig index 9a0bd51..6703363 100644 --- a/drivers/bootcount/Kconfig +++ b/drivers/bootcount/Kconfig @@ -127,4 +127,10 @@ config SYS_BOOTCOUNT_ADDR help Set the address used for reading and writing the boot counter. +config SYS_BOOTCOUNT_MAGIC + hex "Magic value for the boot counter" + default 0xB001C041 + help + Set the magic value used for the boot counter. + endif diff --git a/drivers/bootcount/bootcount.c b/drivers/bootcount/bootcount.c index 646c563..66c1284 100644 --- a/drivers/bootcount/bootcount.c +++ b/drivers/bootcount/bootcount.c @@ -16,13 +16,13 @@ __weak void bootcount_store(ulong a) uintptr_t flush_end; #if defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD) - raw_bootcount_store(reg, (BOOTCOUNT_MAGIC & 0xffff0000) | a); + raw_bootcount_store(reg, (CONFIG_SYS_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); + raw_bootcount_store(reg + 4, CONFIG_SYS_BOOTCOUNT_MAGIC); flush_end = roundup(CONFIG_SYS_BOOTCOUNT_ADDR + 8, CONFIG_SYS_CACHELINE_SIZE); @@ -37,12 +37,12 @@ __weak ulong bootcount_load(void) #if defined(CONFIG_SYS_BOOTCOUNT_SINGLEWORD) u32 tmp = raw_bootcount_load(reg); - if ((tmp & 0xffff0000) != (BOOTCOUNT_MAGIC & 0xffff0000)) + if ((tmp & 0xffff0000) != (CONFIG_SYS_BOOTCOUNT_MAGIC & 0xffff0000)) return 0; else return (tmp & 0x0000ffff); #else - if (raw_bootcount_load(reg + 4) != BOOTCOUNT_MAGIC) + if (raw_bootcount_load(reg + 4) != CONFIG_SYS_BOOTCOUNT_MAGIC) return 0; else return raw_bootcount_load(reg); diff --git a/drivers/bootcount/bootcount_at91.c b/drivers/bootcount/bootcount_at91.c index 3092ba5..c4ab5ce 100644 --- a/drivers/bootcount/bootcount_at91.c +++ b/drivers/bootcount/bootcount_at91.c @@ -6,15 +6,16 @@ #include /* - * We combine the BOOTCOUNT_MAGIC and bootcount in one 32-bit register. - * This is done so we need to use only one of the four GPBR registers. + * We combine the CONFIG_SYS_BOOTCOUNT_MAGIC and bootcount in one 32-bit + * register. This is done so we need to use only one of the four GPBR + * registers. */ void bootcount_store(ulong a) { at91_gpbr_t *gpbr = (at91_gpbr_t *) ATMEL_BASE_GPBR; - writel((BOOTCOUNT_MAGIC & 0xffff0000) | (a & 0x0000ffff), - &gpbr->reg[AT91_GPBR_INDEX_BOOTCOUNT]); + writel((CONFIG_SYS_BOOTCOUNT_MAGIC & 0xffff0000) | (a & 0x0000ffff), + &gpbr->reg[AT91_GPBR_INDEX_BOOTCOUNT]); } ulong bootcount_load(void) @@ -22,7 +23,7 @@ ulong bootcount_load(void) at91_gpbr_t *gpbr = (at91_gpbr_t *) ATMEL_BASE_GPBR; ulong val = readl(&gpbr->reg[AT91_GPBR_INDEX_BOOTCOUNT]); - if ((val & 0xffff0000) != (BOOTCOUNT_MAGIC & 0xffff0000)) + if ((val & 0xffff0000) != (CONFIG_SYS_BOOTCOUNT_MAGIC & 0xffff0000)) return 0; else return val & 0x0000ffff; diff --git a/drivers/bootcount/bootcount_davinci.c b/drivers/bootcount/bootcount_davinci.c index 7101ad9..6326957 100644 --- a/drivers/bootcount/bootcount_davinci.c +++ b/drivers/bootcount/bootcount_davinci.c @@ -24,7 +24,7 @@ void bootcount_store(ulong a) writel(RTC_KICK0R_WE, ®->kick0r); writel(RTC_KICK1R_WE, ®->kick1r); raw_bootcount_store(®->scratch2, - (BOOTCOUNT_MAGIC & 0xffff0000) | (a & 0x0000ffff)); + (CONFIG_SYS_BOOTCOUNT_MAGIC & 0xffff0000) | (a & 0x0000ffff)); } ulong bootcount_load(void) @@ -34,7 +34,7 @@ ulong bootcount_load(void) (struct davinci_rtc *)CONFIG_SYS_BOOTCOUNT_ADDR; val = raw_bootcount_load(®->scratch2); - if ((val & 0xffff0000) != (BOOTCOUNT_MAGIC & 0xffff0000)) + if ((val & 0xffff0000) != (CONFIG_SYS_BOOTCOUNT_MAGIC & 0xffff0000)) return 0; else return val & 0x0000ffff; diff --git a/drivers/bootcount/bootcount_ram.c b/drivers/bootcount/bootcount_ram.c index e514a57..edef367 100644 --- a/drivers/bootcount/bootcount_ram.c +++ b/drivers/bootcount/bootcount_ram.c @@ -28,7 +28,7 @@ void bootcount_store(ulong a) size += gd->bd->bi_dram[i].size; save_addr = (ulong *)(size - BOOTCOUNT_ADDR); writel(a, save_addr); - writel(BOOTCOUNT_MAGIC, &save_addr[1]); + writel(CONFIG_SYS_BOOTCOUNT_MAGIC, &save_addr[1]); for (i = 0; i < REPEAT_PATTERN; i++) writel(patterns[i % NBR_OF_PATTERNS], diff --git a/include/common.h b/include/common.h index 83b3bdc..8b9f859 100644 --- a/include/common.h +++ b/include/common.h @@ -385,7 +385,6 @@ uint dpram_alloc(uint size); uint dpram_alloc_align(uint size,uint align); void bootcount_store (ulong); ulong bootcount_load (void); -#define BOOTCOUNT_MAGIC 0xB001C041 /* $(CPU)/.../ */ void mii_init (void);