Skip to content
Snippets Groups Projects
Commit b69be54f authored by Denis Pynkin's avatar Denis Pynkin
Browse files

Backport patches from Apertis U-Boot


Add pstore feature and bootcounter new format.

Signed-off-by: default avatarDenis Pynkin <denis.pynkin@collabora.com>
parent 739af0fb
No related branches found
No related tags found
No related merge requests found
This commit is part of merge request !25. Comments created here will be created in the context of that merge request.
From cc9425b56bb428ba93c06e850f4e02f5e779509c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Danis?= <frederic.danis@collabora.com>
Date: Wed, 4 Mar 2020 12:27:01 +0100
Subject: [PATCH v2] bootcount_ext: Add flag to enable/disable bootcount
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 8bit
After a successful upgrade, multiple problem during boot sequence may
trigger the altbootcmd process.
This patch adds a version and an upgrade_available entries to the
bootcount file to enable/disable the bootcount check.
When failing to read the bootcount file it will consider that bootcount is
enabled, acting as previously, and update the file accordingly.
The bootcount file is only saved when `upgrade_available` is true, this
allows to save writes to the filesystem.
Signed-off-by: Frédéric Danis <frederic.danis@collabora.com>
---
doc/README.bootcount | 51 +++++++++++++++++++++++++++++++
drivers/bootcount/bootcount_ext.c | 46 ++++++++++++++++++++--------
2 files changed, 85 insertions(+), 12 deletions(-)
create mode 100644 doc/README.bootcount
diff --git a/doc/README.bootcount b/doc/README.bootcount
new file mode 100644
index 00000000..b1c22905
--- /dev/null
+++ b/doc/README.bootcount
@@ -0,0 +1,51 @@
+.. SPDX-License-Identifier: GPL-2.0+
+
+Boot Count Limit
+================
+
+This allows to detect multiple failed attempts to boot Linux.
+
+After a power-on reset, "bootcount" variable will be initialized with 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", thus allowing for more boot
+cycles.
+
+BOOTCOUNT_EXT
+-------------
+
+This adds support for maintaining boot count in a file on an EXT filesystem.
+The file to use is define by:
+
+SYS_BOOTCOUNT_EXT_INTERFACE
+SYS_BOOTCOUNT_EXT_DEVPART
+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 save.
+So the Userspace Application must set the "upgrade_available" and "bootcount"
+variables to 0, if a boot was successfully.
+This also prevents writes on all reboots.
diff --git a/drivers/bootcount/bootcount_ext.c b/drivers/bootcount/bootcount_ext.c
index 075e5908..9639e638 100644
--- a/drivers/bootcount/bootcount_ext.c
+++ b/drivers/bootcount/bootcount_ext.c
@@ -7,11 +7,21 @@
#include <fs.h>
#include <mapmem.h>
-#define BC_MAGIC 0xbc
+#define BC_MAGIC 0xbd
+#define BC_VERSION 1
+
+typedef struct {
+ u8 magic;
+ u8 version;
+ u8 bootcount;
+ u8 upgrade_available;
+} bootcount_ext_t;
+
+static u8 upgrade_available = 1;
void bootcount_store(ulong a)
{
- u8 *buf;
+ bootcount_ext_t *buf;
loff_t len;
int ret;
@@ -21,20 +31,27 @@ void bootcount_store(ulong a)
return;
}
- buf = map_sysmem(CONFIG_SYS_BOOTCOUNT_ADDR, 2);
- buf[0] = BC_MAGIC;
- buf[1] = (a & 0xff);
+ /* Only update bootcount during upgrade process */
+ if (!upgrade_available)
+ return;
+
+ buf = map_sysmem(CONFIG_SYS_BOOTCOUNT_ADDR, sizeof(bootcount_ext_t));
+ buf->magic = BC_MAGIC;
+ buf->version = BC_VERSION;
+ buf->bootcount = (a & 0xff);
+ buf->upgrade_available = upgrade_available;
unmap_sysmem(buf);
ret = fs_write(CONFIG_SYS_BOOTCOUNT_EXT_NAME,
- CONFIG_SYS_BOOTCOUNT_ADDR, 0, 2, &len);
+ CONFIG_SYS_BOOTCOUNT_ADDR, 0, sizeof(bootcount_ext_t),
+ &len);
if (ret != 0)
puts("Error storing bootcount\n");
}
ulong bootcount_load(void)
{
- u8 *buf;
+ bootcount_ext_t *buf;
loff_t len_read;
int ret;
@@ -45,15 +62,20 @@ ulong bootcount_load(void)
}
ret = fs_read(CONFIG_SYS_BOOTCOUNT_EXT_NAME, CONFIG_SYS_BOOTCOUNT_ADDR,
- 0, 2, &len_read);
- if (ret != 0 || len_read != 2) {
+ 0, sizeof(bootcount_ext_t), &len_read);
+ if (ret != 0 || len_read != sizeof(bootcount_ext_t)) {
puts("Error loading bootcount\n");
return 0;
}
- buf = map_sysmem(CONFIG_SYS_BOOTCOUNT_ADDR, 2);
- if (buf[0] == BC_MAGIC)
- ret = buf[1];
+ buf = map_sysmem(CONFIG_SYS_BOOTCOUNT_ADDR, sizeof(bootcount_ext_t));
+ if (buf->magic == BC_MAGIC && buf->version == BC_VERSION) {
+ upgrade_available = buf->upgrade_available;
+ if (upgrade_available)
+ ret = buf->bootcount;
+ } else {
+ puts("Incorrect bootcount file\n");
+ }
unmap_sysmem(buf);
--
2.20.1
......@@ -114,12 +114,12 @@ diff --git a/cmd/Makefile b/cmd/Makefile
index f1dd513a4b..06d7ad7375 100644
--- a/cmd/Makefile
+++ b/cmd/Makefile
@@ -106,6 +106,7 @@ obj-$(CONFIG_CMD_PCI) += pci.o
@@ -110,6 +110,7 @@ obj-$(CONFIG_CMD_PCI) += pci.o
endif
obj-y += pcmcia.o
obj-$(CONFIG_CMD_PINMUX) += pinmux.o
obj-$(CONFIG_CMD_PMC) += pmc.o
+obj-$(CONFIG_CMD_PSTORE) += pstore.o
obj-$(CONFIG_CMD_PXE) += pxe.o
obj-$(CONFIG_CMD_PXE) += pxe.o pxe_utils.o
obj-$(CONFIG_CMD_WOL) += wol.o
obj-$(CONFIG_CMD_QFW) += qfw.o
diff --git a/cmd/pstore.c b/cmd/pstore.c
......
......@@ -30,6 +30,7 @@ pinebook-pro/0005-Add-initial-support-for-the-Pinebook-Pro-laptop-from.patch
# https://patchwork.ozlabs.org/project/uboot/patch/20200420181825.935797-1-pbrobinson@gmail.com/
pinebook-pro/0006-drivers-video-rockchip-fix-building-eDP-and-LVDS-dri.patch
# Apertis patches
apertis/pstore/0001-Add-pstore-command.patch
apertis/pstore/0002-test-Add-PStore-command-tests.patch
apertis/pstore/0003-Fixup-DT-to-pass-PStore-Ramoops-parameters.patch
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment