1
0
Fork 0
mirror of https://github.com/Ysurac/openmptcprouter.git synced 2025-02-15 04:42:02 +00:00
openmptcprouter/root/target/linux/bcm27xx/patches-5.14/0305-firmware-raspberrypi-Add-support-for-tryonce-reboot-.patch
Ycarus (Yannick Chabanois) 5c593832cc Add 5.14 patches for RPI
2021-10-01 16:58:58 +02:00

79 lines
3.2 KiB
Diff

From d2e182f2ad020fef8a7d0cce371fbe3515f96f24 Mon Sep 17 00:00:00 2001
From: Tim Gover <tim.gover@raspberrypi.com>
Date: Tue, 20 Oct 2020 11:55:37 +0100
Subject: [PATCH 305/552] firmware: raspberrypi: Add support for tryonce reboot
flag
Define a new mailbox (SET_REBOOT_FLAGS) which may be used to
pass optional flags to the Raspberry Pi firmware that changes
the behaviour of the bootloader and firmware during a reboot.
Currently this just defines the 'tryboot' flag which causes
the firmware to load tryboot.txt instead config.txt. This
alternate configuration file can be used to specify the
path of an alternate firmware and kernels allowing a fallback
mechanism to be implemented for OS upgrades.
---
drivers/firmware/raspberrypi.c | 25 ++++++++++++++++++++--
include/soc/bcm2835/raspberrypi-firmware.h | 2 ++
2 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/drivers/firmware/raspberrypi.c b/drivers/firmware/raspberrypi.c
index f31b782fb3ba..1d0aa4b8a5b1 100644
--- a/drivers/firmware/raspberrypi.c
+++ b/drivers/firmware/raspberrypi.c
@@ -193,6 +193,7 @@ static int rpi_firmware_notify_reboot(struct notifier_block *nb,
{
struct rpi_firmware *fw;
struct platform_device *pdev = g_pdev;
+ u32 reboot_flags = 0;
if (!pdev)
return 0;
@@ -201,8 +202,28 @@ static int rpi_firmware_notify_reboot(struct notifier_block *nb,
if (!fw)
return 0;
- (void)rpi_firmware_property(fw, RPI_FIRMWARE_NOTIFY_REBOOT,
- 0, 0);
+ // The partition id is the first parameter followed by zero or
+ // more flags separated by spaces indicating the reason for the reboot.
+ //
+ // 'tryboot': Sets a one-shot flag which is cleared upon reboot and
+ // causes the tryboot.txt to be loaded instead of config.txt
+ // by the bootloader and the start.elf firmware.
+ //
+ // This is intended to allow automatic fallback to a known
+ // good image if an OS/FW upgrade fails.
+ //
+ // N.B. The firmware mechanism for storing reboot flags may vary
+ // on different Raspberry Pi models.
+ if (data && strstr(data, " tryboot"))
+ reboot_flags |= 0x1;
+
+ // The mailbox might have been called earlier, directly via vcmailbox
+ // so only overwrite if reboot flags are passed to the reboot command.
+ if (reboot_flags)
+ (void)rpi_firmware_property(fw, RPI_FIRMWARE_SET_REBOOT_FLAGS,
+ &reboot_flags, sizeof(reboot_flags));
+
+ (void)rpi_firmware_property(fw, RPI_FIRMWARE_NOTIFY_REBOOT, NULL, 0);
return 0;
}
diff --git a/include/soc/bcm2835/raspberrypi-firmware.h b/include/soc/bcm2835/raspberrypi-firmware.h
index 23f51be65801..0eca333ad2be 100644
--- a/include/soc/bcm2835/raspberrypi-firmware.h
+++ b/include/soc/bcm2835/raspberrypi-firmware.h
@@ -93,6 +93,8 @@ enum rpi_firmware_property_tag {
RPI_FIRMWARE_GET_POE_HAT_VAL = 0x00030049,
RPI_FIRMWARE_SET_POE_HAT_VAL = 0x00030050,
RPI_FIRMWARE_NOTIFY_XHCI_RESET = 0x00030058,
+ RPI_FIRMWARE_GET_REBOOT_FLAGS = 0x00030064,
+ RPI_FIRMWARE_SET_REBOOT_FLAGS = 0x00038064,
/* Dispmanx TAGS */
RPI_FIRMWARE_FRAMEBUFFER_ALLOCATE = 0x00040001,
--
2.33.0