From b69be54fa438f3d32bfa836205527066a8608873 Mon Sep 17 00:00:00 2001 From: Denis Pynkin <denis.pynkin@collabora.com> Date: Fri, 22 May 2020 01:13:00 +0300 Subject: [PATCH] Backport patches from Apertis U-Boot Add pstore feature and bootcounter new format. Signed-off-by: Denis Pynkin <denis.pynkin@collabora.com> --- ...Add-flag-to-enable-disable-bootcount.patch | 174 ++++++++++++++++++ .../pstore/0001-Add-pstore-command.patch | 6 +- debian/patches/series | 1 + 3 files changed, 178 insertions(+), 3 deletions(-) create mode 100644 debian/patches/apertis/0007-Add-flag-to-enable-disable-bootcount.patch diff --git a/debian/patches/apertis/0007-Add-flag-to-enable-disable-bootcount.patch b/debian/patches/apertis/0007-Add-flag-to-enable-disable-bootcount.patch new file mode 100644 index 000000000..54139f79f --- /dev/null +++ b/debian/patches/apertis/0007-Add-flag-to-enable-disable-bootcount.patch @@ -0,0 +1,174 @@ +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 + diff --git a/debian/patches/apertis/pstore/0001-Add-pstore-command.patch b/debian/patches/apertis/pstore/0001-Add-pstore-command.patch index da47140d5..126eb05ed 100644 --- a/debian/patches/apertis/pstore/0001-Add-pstore-command.patch +++ b/debian/patches/apertis/pstore/0001-Add-pstore-command.patch @@ -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 diff --git a/debian/patches/series b/debian/patches/series index bd3cb2bf7..1dffc6e8b 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -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 -- GitLab