From: Stefan Wahren <wahrenst@gmx.net>
To: Gregor Herburger <gregor.herburger@linutronix.de>,
Florian Fainelli <florian.fainelli@broadcom.com>,
Broadcom internal kernel review list
<bcm-kernel-feedback-list@broadcom.com>,
Ray Jui <rjui@broadcom.com>,
Scott Branden <sbranden@broadcom.com>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>, Eric Anholt <eric@anholt.net>
Cc: linux-rpi-kernel@lists.infradead.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, devicetree@vger.kernel.org
Subject: Re: [PATCH RESEND v3 3/4] firmware: raspberrypi: Add reboot mode support
Date: Thu, 3 Sep 2026 19:55:53 +0200 [thread overview]
Message-ID: <95058f69-9d38-4367-aa8c-dffb0ea0ee54@gmx.net> (raw)
In-Reply-To: <20260903-rpi-tryboot-v3-3-ce94c347e932@linutronix.de>
Hi Gregor,
Am 03.09.26 um 16:48 schrieb Gregor Herburger:
> The Raspberry Pi firmware has a tryboot mode where it tries to boot from
> another partition. This can be used to create a A/B update scheme.
>
> To enable this on the next boot, the RPI_FIRMWARE_SET_REBOOT_FLAGS
> message must be sent to the firmware. Add support for this by
> registering a reboot mode driver.
sorry for the delay.
Do you know the consequences in case the firmware doesn't support
RPI_FIRMWARE_SET_REBOOT_FLAGS ?
Best regards
>
> Furthermore, safely registering the reboot mode requires adjusting the
> teardown sequence. Replace the manually called rpi_firmware_put() with a
> devres-managed called (devm_add_action_or_reset). Without this, the
> cleanup function of devm_reboot_mode_register() would trigger a
> use-after-free error by attempting to access the firmware context after
> it had already been freed by rpi_firmware_remove().
>
> Signed-off-by: Gregor Herburger <gregor.herburger@linutronix.de>
> ---
> drivers/firmware/Kconfig | 2 ++
> drivers/firmware/raspberrypi.c | 40 ++++++++++++++++++++++++++----
> include/soc/bcm2835/raspberrypi-firmware.h | 2 ++
> 3 files changed, 39 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig
> index bbd2155d84838..34605bf7c9734 100644
> --- a/drivers/firmware/Kconfig
> +++ b/drivers/firmware/Kconfig
> @@ -115,6 +115,8 @@ config ISCSI_IBFT
> config RASPBERRYPI_FIRMWARE
> tristate "Raspberry Pi Firmware Driver"
> depends on BCM2835_MBOX
> + select POWER_RESET
> + select REBOOT_MODE
> help
> This option enables support for communicating with the firmware on the
> Raspberry Pi.
> diff --git a/drivers/firmware/raspberrypi.c b/drivers/firmware/raspberrypi.c
> index 0aa322e9a2e73..2a0c40b8052e5 100644
> --- a/drivers/firmware/raspberrypi.c
> +++ b/drivers/firmware/raspberrypi.c
> @@ -14,6 +14,7 @@
> #include <linux/of.h>
> #include <linux/of_platform.h>
> #include <linux/platform_device.h>
> +#include <linux/reboot-mode.h>
> #include <linux/slab.h>
> #include <soc/bcm2835/raspberrypi-firmware.h>
>
> @@ -29,6 +30,7 @@ struct rpi_firmware {
> struct mbox_client cl;
> struct mbox_chan *chan; /* The property channel. */
> struct completion c;
> + struct reboot_mode_driver reboot_mode;
> u32 enabled;
>
> struct kref consumers;
> @@ -273,10 +275,37 @@ static void devm_rpi_firmware_put(void *data)
> rpi_firmware_put(fw);
> }
>
> +static int rpi_firmware_reboot_mode_write(struct reboot_mode_driver *reboot,
> + unsigned int magic)
> +{
> + struct rpi_firmware *fw = container_of(reboot, struct rpi_firmware,
> + reboot_mode);
> + __le32 fw_magic = cpu_to_le32(magic);
> +
> + if (!magic)
> + return 0;
> +
> + return rpi_firmware_property(fw, RPI_FIRMWARE_SET_REBOOT_FLAGS,
> + &fw_magic, sizeof(fw_magic));
> +}
> +
> +static void rpi_register_reboot_mode(struct device *dev, struct rpi_firmware *fw)
> +{
> + int ret;
> +
> + fw->reboot_mode.dev = dev;
> + fw->reboot_mode.write = rpi_firmware_reboot_mode_write;
> + ret = devm_reboot_mode_register(dev, &fw->reboot_mode);
> + if (ret)
> + dev_err(dev, "Failed to register reboot mode: %d\n", ret);
> +
> +}
> +
> static int rpi_firmware_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> struct rpi_firmware *fw;
> + int ret;
>
> /*
> * Memory will be freed by rpi_firmware_delete() once all users have
> @@ -292,7 +321,7 @@ static int rpi_firmware_probe(struct platform_device *pdev)
>
> fw->chan = mbox_request_channel(&fw->cl, 0);
> if (IS_ERR(fw->chan)) {
> - int ret = PTR_ERR(fw->chan);
> + ret = PTR_ERR(fw->chan);
> kfree(fw);
> return dev_err_probe(dev, ret, "Failed to get mbox channel\n");
> }
> @@ -302,9 +331,14 @@ static int rpi_firmware_probe(struct platform_device *pdev)
>
> platform_set_drvdata(pdev, fw);
>
> + ret = devm_add_action_or_reset(dev, devm_rpi_firmware_put, fw);
> + if (ret)
> + return ret;
> +
> rpi_firmware_print_firmware_revision(fw);
> rpi_register_hwmon_driver(dev, fw);
> rpi_register_clk_driver(dev);
> + rpi_register_reboot_mode(dev, fw);
>
> return 0;
> }
> @@ -321,14 +355,10 @@ static void rpi_firmware_shutdown(struct platform_device *pdev)
>
> static void rpi_firmware_remove(struct platform_device *pdev)
> {
> - struct rpi_firmware *fw = platform_get_drvdata(pdev);
> -
> platform_device_unregister(rpi_hwmon);
> rpi_hwmon = NULL;
> platform_device_unregister(rpi_clk);
> rpi_clk = NULL;
> -
> - rpi_firmware_put(fw);
> }
>
> static const struct of_device_id rpi_firmware_of_match[] = {
> diff --git a/include/soc/bcm2835/raspberrypi-firmware.h b/include/soc/bcm2835/raspberrypi-firmware.h
> index 66cc5a426c3c5..f905bff0fb3ea 100644
> --- a/include/soc/bcm2835/raspberrypi-firmware.h
> +++ b/include/soc/bcm2835/raspberrypi-firmware.h
> @@ -81,6 +81,7 @@ 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_NOTIFY_DISPLAY_DONE = 0x00030066,
> RPI_FIRMWARE_SET_CLOCK_STATE = 0x00038001,
> RPI_FIRMWARE_SET_CLOCK_RATE = 0x00038002,
> @@ -92,6 +93,7 @@ enum rpi_firmware_property_tag {
> RPI_FIRMWARE_SET_SDHOST_CLOCK = 0x00038042,
> RPI_FIRMWARE_SET_GPIO_CONFIG = 0x00038043,
> RPI_FIRMWARE_SET_PERIPH_REG = 0x00038045,
> + RPI_FIRMWARE_SET_REBOOT_FLAGS = 0x00038064,
>
> /* Dispmanx TAGS */
> RPI_FIRMWARE_FRAMEBUFFER_ALLOCATE = 0x00040001,
>
next prev parent reply other threads:[~2026-09-03 17:55 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-03 14:48 [PATCH RESEND v3 0/4] firmware: raspberrypi: Add support for the tryboot mode Gregor Herburger
2026-09-03 14:48 ` [PATCH RESEND v3 1/4] firmware: raspberrypi: reorder rpi_firmware_property_tag enum Gregor Herburger
2026-09-03 14:48 ` [PATCH RESEND v3 2/4] dt-bindings: raspberrypi,bcm2835-firmware: Include 'reboot-mode.yaml' Gregor Herburger
2026-09-03 14:48 ` [PATCH RESEND v3 3/4] firmware: raspberrypi: Add reboot mode support Gregor Herburger
2026-09-03 15:08 ` sashiko-bot
2026-09-03 20:30 ` Gregor Herburger
2026-09-03 17:55 ` Stefan Wahren [this message]
2026-09-03 20:41 ` Gregor Herburger
2026-09-03 18:08 ` Stefan Wahren
2026-09-03 20:31 ` Gregor Herburger
2026-09-03 14:48 ` [PATCH RESEND v3 4/4] arm64: dts: broadcom: bcm2712: Add reboot modes to firmware node Gregor Herburger
-- strict thread matches above, loose matches on Subject: below --
2026-07-30 10:59 [PATCH RESEND v3 0/4] firmware: raspberrypi: Add support for the tryboot mode Gregor Herburger
2026-07-30 10:59 ` [PATCH RESEND v3 3/4] firmware: raspberrypi: Add reboot mode support Gregor Herburger
2026-07-30 11:11 ` sashiko-bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=95058f69-9d38-4367-aa8c-dffb0ea0ee54@gmx.net \
--to=wahrenst@gmx.net \
--cc=bcm-kernel-feedback-list@broadcom.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=eric@anholt.net \
--cc=florian.fainelli@broadcom.com \
--cc=gregor.herburger@linutronix.de \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rpi-kernel@lists.infradead.org \
--cc=rjui@broadcom.com \
--cc=robh@kernel.org \
--cc=sbranden@broadcom.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.