Merge patch series "drivers: bootcount: Add support for ANY filesystem"

Vasileios Amoiridis <vassilisamir@gmail.com> says:

This patch adds support to save the bootcount variable in a file located in
FAT filesystem. Up to now, there was support only for EXT filesystem.
This commit is contained in:
Tom Rini
2024-07-16 12:46:39 -06:00
6 changed files with 84 additions and 78 deletions

View File

@@ -1,53 +0,0 @@
.. SPDX-License-Identifier: GPL-2.0+
Boot Count Limit
================
This is enabled by CONFIG_BOOTCOUNT_LIMIT.
This allows to detect multiple failed attempts to boot Linux.
After a power-on reset, the "bootcount" variable will be initialized to 1, and
each reboot will increment the value by 1.
If, after a reboot, the new value of "bootcount" exceeds the value of
"bootlimit", then instead of the standard boot action (executing the contents of
"bootcmd"), an alternate boot action will be performed, and the contents of
"altbootcmd" will be executed.
If the variable "bootlimit" is not defined in the environment, the Boot Count
Limit feature is disabled. If it is enabled, but "altbootcmd" is not defined,
then U-Boot will drop into interactive mode and remain there.
It is the responsibility of some application code (typically a Linux
application) to reset the variable "bootcount" to 0 when the system booted
successfully, thus allowing for more boot cycles.
CONFIG_BOOTCOUNT_EXT
--------------------
This adds support for maintaining boot count in a file on an EXT filesystem.
The file to use is defined by:
CONFIG_SYS_BOOTCOUNT_EXT_INTERFACE
CONFIG_SYS_BOOTCOUNT_EXT_DEVPART
CONFIG_SYS_BOOTCOUNT_EXT_NAME
The format of the file is:
==== =================
type entry
==== =================
u8 magic
u8 version
u8 bootcount
u8 upgrade_available
==== =================
To prevent unattended usage of "altbootcmd", the "upgrade_available" variable is
used.
If "upgrade_available" is 0, "bootcount" is not saved.
If "upgrade_available" is 1, "bootcount" is saved.
So a userspace application should take care of setting the "upgrade_available"
and "bootcount" variables to 0, if the system boots successfully.
This also avoids writing the "bootcount" information on all reboots.

58
doc/api/bootcount.rst Normal file
View File

@@ -0,0 +1,58 @@
.. SPDX-License-Identifier: GPL-2.0+
Boot Count Limit
================
This is enabled by CONFIG_BOOTCOUNT_LIMIT.
This allows to detect multiple failed attempts to boot Linux.
After a power-on reset, the ``bootcount`` variable will be initialized to 1, and
each reboot will increment the value by 1.
If, after a reboot, the new value of ``bootcount`` exceeds the value of
``bootlimit``, then instead of the standard boot action (executing the contents
of ``bootcmd``), an alternate boot action will be performed, and the contents of
``altbootcmd`` will be executed.
If the variable ``bootlimit`` is not defined in the environment, the Boot Count
Limit feature is disabled. If it is enabled, but ``altbootcmd`` is not defined,
then U-Boot will drop into interactive mode and remain there.
It is the responsibility of some application code (typically a Linux
application) to reset the variable ``bootcount`` to 0 when the system booted
successfully, thus allowing for more boot cycles.
CONFIG_BOOTCOUNT_FS
--------------------
This adds support for maintaining boot count in a file on a filesystem.
Tested filesystems are FAT and EXT. The file to use is defined by:
CONFIG_SYS_BOOTCOUNT_FS_INTERFACE
CONFIG_SYS_BOOTCOUNT_FS_DEVPART
CONFIG_SYS_BOOTCOUNT_FS_NAME
The format of the file is:
.. list-table::
:header-rows: 1
* - type
- entry
* - u8
- magic
* - u8
- version
* - u8
- bootcount
* - u8
- upgrade_available
To prevent unintended usage of ``altbootcmd``, the ``upgrade_available``
variable is used.
If ``upgrade_available`` is 0, ``bootcount`` is not saved.
If ``upgrade_available`` is 1, ``bootcount`` is saved.
So a userspace application should take care of setting the ``upgrade_available``
and ``bootcount`` variables to 0, if the system boots successfully.
This also avoids writing the ``bootcount`` information on all reboots.

View File

@@ -6,6 +6,7 @@ U-Boot API documentation
.. toctree::
:maxdepth: 2
bootcount
clk
dfu
dm

View File

@@ -25,13 +25,13 @@ config BOOTCOUNT_GENERIC
Set to the address where the bootcount and bootcount magic
will be stored.
config BOOTCOUNT_EXT
bool "Boot counter on EXT filesystem"
depends on FS_EXT4
select EXT4_WRITE
config BOOTCOUNT_FS
bool "Boot counter on a filesystem"
help
Add support for maintaining boot count in a file on an EXT
filesystem.
Add support for maintaining boot count in a file on a filesystem.
This requires that you have enabled write support for the filesystem
that will be used by the partition that you configure this feature
for.
config BOOTCOUNT_AM33XX
bool "Boot counter in AM33XX RTC IP block"
@@ -184,26 +184,26 @@ config SYS_BOOTCOUNT_SINGLEWORD
This option enables packing boot count magic value and boot count
into single word (32 bits).
config SYS_BOOTCOUNT_EXT_INTERFACE
string "Interface on which to find boot counter EXT filesystem"
config SYS_BOOTCOUNT_FS_INTERFACE
string "Interface on which to find boot counter filesystem"
default "mmc"
depends on BOOTCOUNT_EXT
depends on BOOTCOUNT_FS
help
Set the interface to use when locating the filesystem to use for the
boot counter.
config SYS_BOOTCOUNT_EXT_DEVPART
string "Partition of the boot counter EXT filesystem"
config SYS_BOOTCOUNT_FS_DEVPART
string "Partition of the boot counter filesystem"
default "0:1"
depends on BOOTCOUNT_EXT
depends on BOOTCOUNT_FS
help
Set the partition to use when locating the filesystem to use for the
boot counter.
config SYS_BOOTCOUNT_EXT_NAME
string "Path and filename of the EXT filesystem based boot counter"
config SYS_BOOTCOUNT_FS_NAME
string "Path and filename of the FS filesystem based boot counter"
default "/boot/failures"
depends on BOOTCOUNT_EXT
depends on BOOTCOUNT_FS
help
Set the filename and path of the file used to store the boot counter.
@@ -211,18 +211,18 @@ config SYS_BOOTCOUNT_ADDR
hex "RAM address used for reading and writing the boot counter"
default 0x44E3E000 if BOOTCOUNT_AM33XX || BOOTCOUNT_AM33XX_NVMEM
default 0xE0115FF8 if ARCH_LS1043A || ARCH_LS1021A
depends on BOOTCOUNT_AM33XX || BOOTCOUNT_GENERIC || BOOTCOUNT_EXT || \
depends on BOOTCOUNT_AM33XX || BOOTCOUNT_GENERIC || BOOTCOUNT_FS || \
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 if BOOTCOUNT_GENERIC || BOOTCOUNT_EXT || \
default 0xB001C041 if BOOTCOUNT_GENERIC || BOOTCOUNT_FS || \
BOOTCOUNT_AM33XX || BOOTCOUNT_ENV || \
BOOTCOUNT_RAM || BOOTCOUNT_AT91 || DM_BOOTCOUNT
default 0xB0 if BOOTCOUNT_AM33XX_NVMEM
depends on BOOTCOUNT_GENERIC || BOOTCOUNT_EXT || \
depends on BOOTCOUNT_GENERIC || BOOTCOUNT_FS || \
BOOTCOUNT_AM33XX || BOOTCOUNT_ENV || \
BOOTCOUNT_RAM || BOOTCOUNT_AT91 || DM_BOOTCOUNT || \
BOOTCOUNT_AM33XX_NVMEM

View File

@@ -6,7 +6,7 @@ obj-$(CONFIG_BOOTCOUNT_AT91) += bootcount_at91.o
obj-$(CONFIG_BOOTCOUNT_AM33XX) += bootcount_davinci.o
obj-$(CONFIG_BOOTCOUNT_RAM) += bootcount_ram.o
obj-$(CONFIG_BOOTCOUNT_ENV) += bootcount_env.o
obj-$(CONFIG_BOOTCOUNT_EXT) += bootcount_ext.o
obj-$(CONFIG_BOOTCOUNT_FS) += bootcount_fs.o
obj-$(CONFIG_BOOTCOUNT_AM33XX_NVMEM) += bootcount_nvmem.o
obj-$(CONFIG_DM_BOOTCOUNT) += bootcount-uclass.o

View File

@@ -25,8 +25,8 @@ void bootcount_store(ulong a)
loff_t len;
int ret;
if (fs_set_blk_dev(CONFIG_SYS_BOOTCOUNT_EXT_INTERFACE,
CONFIG_SYS_BOOTCOUNT_EXT_DEVPART, FS_TYPE_EXT)) {
if (fs_set_blk_dev(CONFIG_SYS_BOOTCOUNT_FS_INTERFACE,
CONFIG_SYS_BOOTCOUNT_FS_DEVPART, FS_TYPE_ANY)) {
puts("Error selecting device\n");
return;
}
@@ -42,7 +42,7 @@ void bootcount_store(ulong a)
buf->upgrade_available = upgrade_available;
unmap_sysmem(buf);
ret = fs_write(CONFIG_SYS_BOOTCOUNT_EXT_NAME,
ret = fs_write(CONFIG_SYS_BOOTCOUNT_FS_NAME,
CONFIG_SYS_BOOTCOUNT_ADDR, 0, sizeof(bootcount_ext_t),
&len);
if (ret != 0)
@@ -55,13 +55,13 @@ ulong bootcount_load(void)
loff_t len_read;
int ret;
if (fs_set_blk_dev(CONFIG_SYS_BOOTCOUNT_EXT_INTERFACE,
CONFIG_SYS_BOOTCOUNT_EXT_DEVPART, FS_TYPE_EXT)) {
if (fs_set_blk_dev(CONFIG_SYS_BOOTCOUNT_FS_INTERFACE,
CONFIG_SYS_BOOTCOUNT_FS_DEVPART, FS_TYPE_ANY)) {
puts("Error selecting device\n");
return 0;
}
ret = fs_read(CONFIG_SYS_BOOTCOUNT_EXT_NAME, CONFIG_SYS_BOOTCOUNT_ADDR,
ret = fs_read(CONFIG_SYS_BOOTCOUNT_FS_NAME, CONFIG_SYS_BOOTCOUNT_ADDR,
0, sizeof(bootcount_ext_t), &len_read);
if (ret != 0 || len_read != sizeof(bootcount_ext_t)) {
puts("Error loading bootcount\n");