am335x, guardian: software update available status is stored in AM3352 RTC scracth register

RTC second scratch register[32-bit]:
  -zero byte hold boot count value
  -first byte hold update available state
  -second byte hold version
  -third byte hold magic number

Signed-off-by: Gireesh Hiremath <Gireesh.Hiremath@in.bosch.com>

Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
Link: https://lore.kernel.org/r/20210611161350.2141-17-Gireesh.Hiremath@in.bosch.com
Gbp-Pq: Topic apertis/guardian
Gbp-Pq: Name am335x-guardian-software-update-available-status-is-store.patch
This commit is contained in:
Gireesh Hiremath
2021-06-11 16:13:48 +00:00
committed by Lokesh Vutla
parent 9cd380ef5f
commit caf9478624
3 changed files with 89 additions and 3 deletions

View File

@@ -42,6 +42,25 @@ config BOOTCOUNT_AM33XX
This requires the RTC clocks, etc, to be enabled prior to use and
not all boards with this IP block on it will have the RTC in use.
config BOOTCOUNT_AM33XX_NVMEM
bool "Boot counter in AM33XX RTC IP block with upgrade_available flag"
depends on AM33XX
select SPL_AM33XX_ENABLE_RTC32K_OSC if AM33XX
help
Add support for maintaining bootcount,upgrade_available,
version and BOOTMAGIC in a AM33xx RTC IP block
scratch register2.
A bootcount driver for the RTC IP block found on many TI platforms.
This requires the RTC clocks, etc, to be enabled prior to use and
not all boards with this IP block on it will have the RTC in use.
If there is upgrade in software then "upgrade_available" is 1,
"bootcount" is incremented otherwise "upgrade_available" and
"bootcount" is always 0. So the Userspace Application must set
the "upgrade_available" and "bootcount" variable to 0, if a boot
was successfully.
config BOOTCOUNT_ENV
bool "Boot counter in environment"
help
@@ -177,16 +196,25 @@ config SYS_BOOTCOUNT_EXT_NAME
config SYS_BOOTCOUNT_ADDR
hex "RAM address used for reading and writing the boot counter"
default 0x44E3E000 if BOOTCOUNT_AM33XX
default 0x44E3E000 if BOOTCOUNT_AM33XX || BOOTCOUNT_AM33XX_NVMEM
default 0xE0115FF8 if ARCH_LS1043A || ARCH_LS1021A
depends on BOOTCOUNT_AM33XX || BOOTCOUNT_GENERIC || BOOTCOUNT_EXT || \
BOOTCOUNT_I2C
BOOTCOUNT_I2C || BOOTCOUNT_AM33XX_NVMEM
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
default 0xB001C041 if BOOTCOUNT_GENERIC || BOOTCOUNT_EXT || \
BOOTCOUNT_AM33XX || BOOTCOUNT_ENV || \
BOOTCOUNT_RAM || BOOTCOUNT_I2C || \
BOOTCOUNT_AT91 || DM_BOOTCOUNT
default 0xB0 if BOOTCOUNT_AM33XX_NVMEM
depends on BOOTCOUNT_GENERIC || BOOTCOUNT_EXT || \
BOOTCOUNT_AM33XX || BOOTCOUNT_ENV || \
BOOTCOUNT_RAM || BOOTCOUNT_I2C || \
BOOTCOUNT_AT91 || DM_BOOTCOUNT || \
BOOTCOUNT_AM33XX_NVMEM
help
Set the magic value used for the boot counter.

View File

@@ -8,6 +8,7 @@ obj-$(CONFIG_BOOTCOUNT_RAM) += bootcount_ram.o
obj-$(CONFIG_BOOTCOUNT_ENV) += bootcount_env.o
obj-$(CONFIG_BOOTCOUNT_I2C) += bootcount_i2c.o
obj-$(CONFIG_BOOTCOUNT_EXT) += bootcount_ext.o
obj-$(CONFIG_BOOTCOUNT_AM33XX_NVMEM) += bootcount_nvmem.o
obj-$(CONFIG_DM_BOOTCOUNT) += bootcount-uclass.o
obj-$(CONFIG_DM_BOOTCOUNT_RTC) += rtc.o

View File

@@ -0,0 +1,57 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* (C) Copyright 2011
* Heiko Schocher, DENX Software Engineering, hs@denx.de.
* (C) Copyright 2018 Robert Bosch Power Tools GmbH.
*
* A bootcount driver for the RTC IP block found on many TI platforms.
* This requires the RTC clocks, etc, to be enabled prior to use and
* not all boards with this IP block on it will have the RTC in use.
*/
#include <bootcount.h>
#include <asm/davinci_rtc.h>
#define BC_VERSION 2
void bootcount_store(ulong bootcount)
{
u8 upgrade_available = 0;
ulong val = 0;
struct davinci_rtc *reg =
(struct davinci_rtc *)CONFIG_SYS_BOOTCOUNT_ADDR;
val = raw_bootcount_load(&reg->scratch2);
upgrade_available = (val >> 8) & 0x000000ff;
/* Only update bootcount during upgrade process */
if (!upgrade_available)
bootcount = 0;
val = (bootcount & 0x000000ff) |
(upgrade_available << 8) |
(BC_VERSION << 16) |
(CONFIG_SYS_BOOTCOUNT_MAGIC << 24);
/*
* write RTC kick registers to enable write
* for RTC Scratch registers. Scratch register 2 is
* used for bootcount value.
*/
writel(RTC_KICK0R_WE, &reg->kick0r);
writel(RTC_KICK1R_WE, &reg->kick1r);
raw_bootcount_store(&reg->scratch2, val);
}
ulong bootcount_load(void)
{
unsigned long val = 0;
struct davinci_rtc *reg =
(struct davinci_rtc *)CONFIG_SYS_BOOTCOUNT_ADDR;
val = raw_bootcount_load(&reg->scratch2);
if ((val >> 24) != CONFIG_SYS_BOOTCOUNT_MAGIC)
return 0;
else
return val & 0x000000ff;
}