All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH RESEND v3 0/4] firmware: raspberrypi: Add support for the tryboot mode
@ 2026-07-30 10:59 Gregor Herburger
  2026-07-30 10:59 ` [PATCH RESEND v3 1/4] firmware: raspberrypi: reorder rpi_firmware_property_tag enum Gregor Herburger
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Gregor Herburger @ 2026-07-30 10:59 UTC (permalink / raw)
  To: Florian Fainelli, Broadcom internal kernel review list, Ray Jui,
	Scott Branden, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Eric Anholt, Stefan Wahren
  Cc: linux-rpi-kernel, linux-arm-kernel, linux-kernel, devicetree,
	Gregor Herburger, Krzysztof Kozlowski

This adds support for the tryboot mode on Raspberry Pis. As there is no
documentation other than the downstream implementation [0] the
implementation is based on this.

I tested this on Raspberry Pi 5 and therefore I only added the
properties to this devicetree. But afaik this should work on all
Raspberry Pis. I will add it to the correspondings dts if I get some
hardware to test it.

[0] https://github.com/raspberrypi/linux/commit/eb56da0c1925c07e8929ce4c9fe8aeafa7cb8c7b

---
Changes in v3:
- fix use-after-free error by using devm_add_action_or_reset
- ensure endianness of magic byte
- refactor reboot mode registration into separate function
- Link to v2: https://patch.msgid.link/20260630-rpi-tryboot-v2-0-f68d2dc6aa27@linutronix.de

Changes in v2:
- Remove unnecessary reboot_mode_unregister().
- dt-binding: restrict to mode-{normal,tryboot} and only allow 32bit value.
- Link to v1: https://patch.msgid.link/20260626-rpi-tryboot-v1-0-490b1c4c4970@linutronix.de

---
Gregor Herburger (4):
      firmware: raspberrypi: reorder rpi_firmware_property_tag enum
      dt-bindings: raspberrypi,bcm2835-firmware: Include 'reboot-mode.yaml'
      firmware: raspberrypi: Add reboot mode support
      arm64: dts: broadcom: bcm2712: Add reboot modes to firmware node

 .../arm/bcm/raspberrypi,bcm2835-firmware.yaml      |  9 +++++
 .../boot/dts/broadcom/bcm2712-rpi-5-b-base.dtsi    |  2 ++
 drivers/firmware/Kconfig                           |  2 ++
 drivers/firmware/raspberrypi.c                     | 40 +++++++++++++++++++---
 include/soc/bcm2835/raspberrypi-firmware.h         | 22 ++++++------
 5 files changed, 60 insertions(+), 15 deletions(-)
---
base-commit: 8cd9520d35a6c38db6567e97dd93b1f11f185dc6
change-id: 20260623-rpi-tryboot-4292c92b0727

Best regards,
--
Gregor Herburger <gregor.herburger@linutronix.de>
-- 
Gregor Herburger <gregor.herburger@linutronix.de>



^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH RESEND v3 1/4] firmware: raspberrypi: reorder rpi_firmware_property_tag enum
  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 ` Gregor Herburger
  2026-07-30 11:04   ` sashiko-bot
  2026-07-30 10:59 ` [PATCH RESEND v3 2/4] dt-bindings: raspberrypi,bcm2835-firmware: Include 'reboot-mode.yaml' Gregor Herburger
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 9+ messages in thread
From: Gregor Herburger @ 2026-07-30 10:59 UTC (permalink / raw)
  To: Florian Fainelli, Broadcom internal kernel review list, Ray Jui,
	Scott Branden, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Eric Anholt, Stefan Wahren
  Cc: linux-rpi-kernel, linux-arm-kernel, linux-kernel, devicetree,
	Gregor Herburger

The enum was once ordered by tag values. The later added tags were added
in a different order. Reorder the tags again.

No functional change intended.

Signed-off-by: Gregor Herburger <gregor.herburger@linutronix.de>
---
 include/soc/bcm2835/raspberrypi-firmware.h | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/include/soc/bcm2835/raspberrypi-firmware.h b/include/soc/bcm2835/raspberrypi-firmware.h
index e1f87fbfe554..66cc5a426c3c 100644
--- a/include/soc/bcm2835/raspberrypi-firmware.h
+++ b/include/soc/bcm2835/raspberrypi-firmware.h
@@ -72,26 +72,26 @@ enum rpi_firmware_property_tag {
 	RPI_FIRMWARE_GET_EDID_BLOCK =                         0x00030020,
 	RPI_FIRMWARE_GET_CUSTOMER_OTP =                       0x00030021,
 	RPI_FIRMWARE_GET_DOMAIN_STATE =                       0x00030030,
+	RPI_FIRMWARE_GET_GPIO_STATE =                         0x00030041,
+	RPI_FIRMWARE_GET_GPIO_CONFIG =                        0x00030043,
+	RPI_FIRMWARE_GET_PERIPH_REG =                         0x00030045,
 	RPI_FIRMWARE_GET_THROTTLED =                          0x00030046,
 	RPI_FIRMWARE_GET_CLOCK_MEASURED =                     0x00030047,
 	RPI_FIRMWARE_NOTIFY_REBOOT =                          0x00030048,
+	RPI_FIRMWARE_GET_POE_HAT_VAL =                        0x00030049,
+	RPI_FIRMWARE_SET_POE_HAT_VAL =                        0x00030050,
+	RPI_FIRMWARE_NOTIFY_XHCI_RESET =                      0x00030058,
+	RPI_FIRMWARE_NOTIFY_DISPLAY_DONE =                    0x00030066,
 	RPI_FIRMWARE_SET_CLOCK_STATE =                        0x00038001,
 	RPI_FIRMWARE_SET_CLOCK_RATE =                         0x00038002,
 	RPI_FIRMWARE_SET_VOLTAGE =                            0x00038003,
 	RPI_FIRMWARE_SET_TURBO =                              0x00038009,
 	RPI_FIRMWARE_SET_CUSTOMER_OTP =                       0x00038021,
 	RPI_FIRMWARE_SET_DOMAIN_STATE =                       0x00038030,
-	RPI_FIRMWARE_GET_GPIO_STATE =                         0x00030041,
 	RPI_FIRMWARE_SET_GPIO_STATE =                         0x00038041,
 	RPI_FIRMWARE_SET_SDHOST_CLOCK =                       0x00038042,
-	RPI_FIRMWARE_GET_GPIO_CONFIG =                        0x00030043,
 	RPI_FIRMWARE_SET_GPIO_CONFIG =                        0x00038043,
-	RPI_FIRMWARE_GET_PERIPH_REG =                         0x00030045,
 	RPI_FIRMWARE_SET_PERIPH_REG =                         0x00038045,
-	RPI_FIRMWARE_GET_POE_HAT_VAL =                        0x00030049,
-	RPI_FIRMWARE_SET_POE_HAT_VAL =                        0x00030050,
-	RPI_FIRMWARE_NOTIFY_XHCI_RESET =                      0x00030058,
-	RPI_FIRMWARE_NOTIFY_DISPLAY_DONE =                    0x00030066,
 
 	/* Dispmanx TAGS */
 	RPI_FIRMWARE_FRAMEBUFFER_ALLOCATE =                   0x00040001,
@@ -107,7 +107,6 @@ enum rpi_firmware_property_tag {
 	RPI_FIRMWARE_FRAMEBUFFER_GET_PALETTE =                0x0004000b,
 	RPI_FIRMWARE_FRAMEBUFFER_GET_TOUCHBUF =               0x0004000f,
 	RPI_FIRMWARE_FRAMEBUFFER_GET_GPIOVIRTBUF =            0x00040010,
-	RPI_FIRMWARE_FRAMEBUFFER_RELEASE =                    0x00048001,
 	RPI_FIRMWARE_FRAMEBUFFER_TEST_PHYSICAL_WIDTH_HEIGHT = 0x00044003,
 	RPI_FIRMWARE_FRAMEBUFFER_TEST_VIRTUAL_WIDTH_HEIGHT =  0x00044004,
 	RPI_FIRMWARE_FRAMEBUFFER_TEST_DEPTH =                 0x00044005,
@@ -117,6 +116,7 @@ enum rpi_firmware_property_tag {
 	RPI_FIRMWARE_FRAMEBUFFER_TEST_OVERSCAN =              0x0004400a,
 	RPI_FIRMWARE_FRAMEBUFFER_TEST_PALETTE =               0x0004400b,
 	RPI_FIRMWARE_FRAMEBUFFER_TEST_VSYNC =                 0x0004400e,
+	RPI_FIRMWARE_FRAMEBUFFER_RELEASE =                    0x00048001,
 	RPI_FIRMWARE_FRAMEBUFFER_SET_PHYSICAL_WIDTH_HEIGHT =  0x00048003,
 	RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_WIDTH_HEIGHT =   0x00048004,
 	RPI_FIRMWARE_FRAMEBUFFER_SET_DEPTH =                  0x00048005,
@@ -125,10 +125,10 @@ enum rpi_firmware_property_tag {
 	RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_OFFSET =         0x00048009,
 	RPI_FIRMWARE_FRAMEBUFFER_SET_OVERSCAN =               0x0004800a,
 	RPI_FIRMWARE_FRAMEBUFFER_SET_PALETTE =                0x0004800b,
-	RPI_FIRMWARE_FRAMEBUFFER_SET_TOUCHBUF =               0x0004801f,
-	RPI_FIRMWARE_FRAMEBUFFER_SET_GPIOVIRTBUF =            0x00048020,
 	RPI_FIRMWARE_FRAMEBUFFER_SET_VSYNC =                  0x0004800e,
 	RPI_FIRMWARE_FRAMEBUFFER_SET_BACKLIGHT =              0x0004800f,
+	RPI_FIRMWARE_FRAMEBUFFER_SET_TOUCHBUF =               0x0004801f,
+	RPI_FIRMWARE_FRAMEBUFFER_SET_GPIOVIRTBUF =            0x00048020,
 
 	RPI_FIRMWARE_VCHIQ_INIT =                             0x00048010,
 

-- 
2.47.3



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH RESEND v3 2/4] dt-bindings: raspberrypi,bcm2835-firmware: Include 'reboot-mode.yaml'
  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 1/4] firmware: raspberrypi: reorder rpi_firmware_property_tag enum Gregor Herburger
@ 2026-07-30 10:59 ` Gregor Herburger
  2026-07-30 10:59 ` [PATCH RESEND v3 3/4] firmware: raspberrypi: Add reboot mode support Gregor Herburger
  2026-07-30 10:59 ` [PATCH RESEND v3 4/4] arm64: dts: broadcom: bcm2712: Add reboot modes to firmware node Gregor Herburger
  3 siblings, 0 replies; 9+ messages in thread
From: Gregor Herburger @ 2026-07-30 10:59 UTC (permalink / raw)
  To: Florian Fainelli, Broadcom internal kernel review list, Ray Jui,
	Scott Branden, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Eric Anholt, Stefan Wahren
  Cc: linux-rpi-kernel, linux-arm-kernel, linux-kernel, devicetree,
	Krzysztof Kozlowski, Gregor Herburger

The Raspberry Pi firmware allows to set a reboot mode called tryboot
that allows to try booting from a different partition to allow updating
of the boot partition. Allow reboot mode properties by referencing the
reboot-mode schema. The firmware allows a 32bit value to be sent as
reboot flag so restrict the maxItems to 1.

Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
Signed-off-by: Gregor Herburger <gregor.herburger@linutronix.de>
---
 .../bindings/arm/bcm/raspberrypi,bcm2835-firmware.yaml           | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/Documentation/devicetree/bindings/arm/bcm/raspberrypi,bcm2835-firmware.yaml b/Documentation/devicetree/bindings/arm/bcm/raspberrypi,bcm2835-firmware.yaml
index 983ea80eaec9..28c571386046 100644
--- a/Documentation/devicetree/bindings/arm/bcm/raspberrypi,bcm2835-firmware.yaml
+++ b/Documentation/devicetree/bindings/arm/bcm/raspberrypi,bcm2835-firmware.yaml
@@ -133,6 +133,15 @@ properties:
     required:
       - compatible
 
+  mode-normal:
+    maxItems: 1
+
+  mode-tryboot:
+    maxItems: 1
+
+allOf:
+  - $ref: /schemas/power/reset/reboot-mode.yaml#
+
 required:
   - compatible
   - mboxes

-- 
2.47.3


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH RESEND v3 3/4] firmware: raspberrypi: Add reboot mode support
  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 1/4] firmware: raspberrypi: reorder rpi_firmware_property_tag enum Gregor Herburger
  2026-07-30 10:59 ` [PATCH RESEND v3 2/4] dt-bindings: raspberrypi,bcm2835-firmware: Include 'reboot-mode.yaml' Gregor Herburger
@ 2026-07-30 10:59 ` Gregor Herburger
  2026-07-30 11:11   ` sashiko-bot
  2026-07-30 10:59 ` [PATCH RESEND v3 4/4] arm64: dts: broadcom: bcm2712: Add reboot modes to firmware node Gregor Herburger
  3 siblings, 1 reply; 9+ messages in thread
From: Gregor Herburger @ 2026-07-30 10:59 UTC (permalink / raw)
  To: Florian Fainelli, Broadcom internal kernel review list, Ray Jui,
	Scott Branden, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Eric Anholt, Stefan Wahren
  Cc: linux-rpi-kernel, linux-arm-kernel, linux-kernel, devicetree,
	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.

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 bbd2155d8483..34605bf7c973 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 0aa322e9a2e7..2a0c40b8052e 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 66cc5a426c3c..f905bff0fb3e 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,

-- 
2.47.3


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH RESEND v3 4/4] arm64: dts: broadcom: bcm2712: Add reboot modes to firmware node
  2026-07-30 10:59 [PATCH RESEND v3 0/4] firmware: raspberrypi: Add support for the tryboot mode Gregor Herburger
                   ` (2 preceding siblings ...)
  2026-07-30 10:59 ` [PATCH RESEND v3 3/4] firmware: raspberrypi: Add reboot mode support Gregor Herburger
@ 2026-07-30 10:59 ` Gregor Herburger
  3 siblings, 0 replies; 9+ messages in thread
From: Gregor Herburger @ 2026-07-30 10:59 UTC (permalink / raw)
  To: Florian Fainelli, Broadcom internal kernel review list, Ray Jui,
	Scott Branden, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Eric Anholt, Stefan Wahren
  Cc: linux-rpi-kernel, linux-arm-kernel, linux-kernel, devicetree,
	Gregor Herburger

The Raspberry Pi firmware driver allows the tryboot reboot mode. Add
this mode and normal boot mode to the node.

Signed-off-by: Gregor Herburger <gregor.herburger@linutronix.de>
---
 arch/arm64/boot/dts/broadcom/bcm2712-rpi-5-b-base.dtsi | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/arm64/boot/dts/broadcom/bcm2712-rpi-5-b-base.dtsi b/arch/arm64/boot/dts/broadcom/bcm2712-rpi-5-b-base.dtsi
index b7a6bc34ae1a..67095c7ff770 100644
--- a/arch/arm64/boot/dts/broadcom/bcm2712-rpi-5-b-base.dtsi
+++ b/arch/arm64/boot/dts/broadcom/bcm2712-rpi-5-b-base.dtsi
@@ -49,6 +49,8 @@ firmware: rpi-firmware {
 			compatible = "raspberrypi,bcm2835-firmware", "simple-mfd";
 
 			mboxes = <&mailbox>;
+			mode-normal = <0>;
+			mode-tryboot = <1>;
 
 			firmware_clocks: clocks {
 				compatible = "raspberrypi,firmware-clocks";

-- 
2.47.3



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH RESEND v3 1/4] firmware: raspberrypi: reorder rpi_firmware_property_tag enum
  2026-07-30 10:59 ` [PATCH RESEND v3 1/4] firmware: raspberrypi: reorder rpi_firmware_property_tag enum Gregor Herburger
@ 2026-07-30 11:04   ` sashiko-bot
  2026-07-30 11:53     ` Gregor Herburger
  0 siblings, 1 reply; 9+ messages in thread
From: sashiko-bot @ 2026-07-30 11:04 UTC (permalink / raw)
  To: Gregor Herburger; +Cc: devicetree, robh, conor+dt

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] The commit claims to reorder all enum tags by their integer values, but incorrectly places `RPI_FIRMWARE_VCHIQ_INIT` out of order relative to the newly moved tags.
--

--- Patch [1]: [PATCH RESEND v3 1/4] firmware: raspberrypi: reorder rpi_firmware_property_tag enum ---
commit 6dfb35594a9bcc2cc5fa3006d5257b66c4f03b4a
Author: Gregor Herburger <gregor.herburger@linutronix.de>

firmware: raspberrypi: reorder rpi_firmware_property_tag enum

This commit attempts to reorder the tags in the rpi_firmware_property_tag
enum by their integer values to correct previously out-of-order additions.

> diff --git a/include/soc/bcm2835/raspberrypi-firmware.h b/include/soc/bcm2835/raspberrypi-firmware.h
> --- a/include/soc/bcm2835/raspberrypi-firmware.h
> +++ b/include/soc/bcm2835/raspberrypi-firmware.h

[ ... ]

> @@ -125,10 +125,10 @@ enum rpi_firmware_property_tag {
>  	RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_OFFSET =         0x00048009,
>  	RPI_FIRMWARE_FRAMEBUFFER_SET_OVERSCAN =               0x0004800a,
>  	RPI_FIRMWARE_FRAMEBUFFER_SET_PALETTE =                0x0004800b,
> -	RPI_FIRMWARE_FRAMEBUFFER_SET_TOUCHBUF =               0x0004801f,
> -	RPI_FIRMWARE_FRAMEBUFFER_SET_GPIOVIRTBUF =            0x00048020,
>  	RPI_FIRMWARE_FRAMEBUFFER_SET_VSYNC =                  0x0004800e,
>  	RPI_FIRMWARE_FRAMEBUFFER_SET_BACKLIGHT =              0x0004800f,
> +	RPI_FIRMWARE_FRAMEBUFFER_SET_TOUCHBUF =               0x0004801f,
> +	RPI_FIRMWARE_FRAMEBUFFER_SET_GPIOVIRTBUF =            0x00048020,
>  
>  	RPI_FIRMWARE_VCHIQ_INIT =                             0x00048010,

[Severity: Medium]
The commit message states the intent is to reorder the tags by their numerical
values, but does this final arrangement still leave them unsorted? 

The relocated tags RPI_FIRMWARE_FRAMEBUFFER_SET_TOUCHBUF (0x0004801f) and 
RPI_FIRMWARE_FRAMEBUFFER_SET_GPIOVIRTBUF (0x00048020) are now placed right 
before RPI_FIRMWARE_VCHIQ_INIT (0x00048010).

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260730-rpi-tryboot-v3-0-849c001d67f8@linutronix.de?part=1

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH RESEND v3 3/4] firmware: raspberrypi: Add reboot mode support
  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
  2026-07-30 11:52     ` [PATCH RESEND v3 3/4] firmware: raspberrypi: Add reboot mode supporty Gregor Herburger
  0 siblings, 1 reply; 9+ messages in thread
From: sashiko-bot @ 2026-07-30 11:11 UTC (permalink / raw)
  To: Gregor Herburger; +Cc: devicetree, robh, conor+dt

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:

Pre-existing issues:
- [High] fw->cl.dev becomes a dangling pointer if the firmware device is destroyed while a consumer holds a reference to fw.
- [High] fw can be accessed after it is freed because drvdata is not cleared before freeing fw during driver unbind or probe failure.
--

--- Patch [3]: [PATCH RESEND v3 3/4] firmware: raspberrypi: Add reboot mode support ---
commit 7622e7ef47694e51ed746363fd587b5883406973
Author: Gregor Herburger <gregor.herburger@linutronix.de>

firmware: raspberrypi: Add reboot mode support

The Raspberry Pi firmware has a tryboot mode where it tries to boot from
another partition. This commit enables this by registering a reboot mode
driver. It also replaces the manual rpi_firmware_put() with a
devres-managed call to safely register the reboot mode.

> 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
[ ... ]
> @@ -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;

[Severity: High]
This is a pre-existing issue, but can fw be accessed after it is freed
because drvdata is not explicitly cleared?

During unbind, devm_rpi_firmware_put is executed by devres, which drops the
kref and frees fw. However, the driver core does not clear drvdata until
device_unbind_cleanup completes (which happens after devres actions).

If rpi_firmware_get() is called concurrently by another thread, would it
fetch the uncleared but freed fw pointer via platform_get_drvdata(pdev) and
call kref_get_unless_zero(&fw->consumers), resulting in a use-after-free?


[Severity: High]
This isn't a bug introduced by this patch, but wouldn't fw->cl.dev become a
dangling pointer if the firmware device is destroyed while a consumer holds a
reference to fw?

In rpi_firmware_get(), the consumer retrieves the firmware context and
increments its kref (fw->consumers), but then drops the reference to the
platform device itself:

drivers/firmware/raspberrypi.c:rpi_firmware_get() {
    ...
    put_device(&pdev->dev);
    ...
}

If the device is subsequently unregistered (e.g., via DT overlay removal), the
device struct is freed, but the consumer still holds a reference to fw.

Any subsequent failing mailbox transaction will call dev_err(fw->cl.dev, ...)
in rpi_firmware_transaction() and dereference the freed device pointer.

>  	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;
>  }

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260730-rpi-tryboot-v3-0-849c001d67f8@linutronix.de?part=3

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH RESEND v3 3/4] firmware: raspberrypi: Add reboot mode supporty
  2026-07-30 11:11   ` sashiko-bot
@ 2026-07-30 11:52     ` Gregor Herburger
  0 siblings, 0 replies; 9+ messages in thread
From: Gregor Herburger @ 2026-07-30 11:52 UTC (permalink / raw)
  To: sashiko-reviews; +Cc: devicetree, robh, conor+dt

On Thu, Jul 30, 2026 at 11:11:44AM +0000, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
> 
> Pre-existing issues:
> - [High] fw->cl.dev becomes a dangling pointer if the firmware device is destroyed while a consumer holds a reference to fw.
> - [High] fw can be accessed after it is freed because drvdata is not cleared before freeing fw during driver unbind or probe failure.
> --
Yes they are real issues, I started to work on a patch for this. But as these
are pre-existing issues i will send a separate patch for this issues.

> 
> --- Patch [3]: [PATCH RESEND v3 3/4] firmware: raspberrypi: Add reboot mode support ---
> commit 7622e7ef47694e51ed746363fd587b5883406973
> Author: Gregor Herburger <gregor.herburger@linutronix.de>
> 
> firmware: raspberrypi: Add reboot mode support
> 
> The Raspberry Pi firmware has a tryboot mode where it tries to boot from
> another partition. This commit enables this by registering a reboot mode
> driver. It also replaces the manual rpi_firmware_put() with a
> devres-managed call to safely register the reboot mode.
> 
> > 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
> [ ... ]
> > @@ -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;
> 
> [Severity: High]
> This is a pre-existing issue, but can fw be accessed after it is freed
> because drvdata is not explicitly cleared?
> 
> During unbind, devm_rpi_firmware_put is executed by devres, which drops the
> kref and frees fw. However, the driver core does not clear drvdata until
> device_unbind_cleanup completes (which happens after devres actions).
> 
> If rpi_firmware_get() is called concurrently by another thread, would it
> fetch the uncleared but freed fw pointer via platform_get_drvdata(pdev) and
> call kref_get_unless_zero(&fw->consumers), resulting in a use-after-free?
> 
> 
> [Severity: High]
> This isn't a bug introduced by this patch, but wouldn't fw->cl.dev become a
> dangling pointer if the firmware device is destroyed while a consumer holds a
> reference to fw?
> 
> In rpi_firmware_get(), the consumer retrieves the firmware context and
> increments its kref (fw->consumers), but then drops the reference to the
> platform device itself:
> 
> drivers/firmware/raspberrypi.c:rpi_firmware_get() {
>     ...
>     put_device(&pdev->dev);
>     ...
> }
> 
> If the device is subsequently unregistered (e.g., via DT overlay removal), the
> device struct is freed, but the consumer still holds a reference to fw.
> 
> Any subsequent failing mailbox transaction will call dev_err(fw->cl.dev, ...)
> in rpi_firmware_transaction() and dereference the freed device pointer.
> 
> >  	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;
> >  }
> 
> -- 
> Sashiko AI review · https://sashiko.dev/#/patchset/20260730-rpi-tryboot-v3-0-849c001d67f8@linutronix.de?part=3

-- 
Gregor Herburger
Linutronix GmbH | Bahnhofstrasse 3 | D-88690 Uhldingen-Mühlhofen
Phone: +49 7556 25 999 35; Fax.: +49 7556 25 999 99

Hinweise zum Datenschutz finden Sie hier (Informations on data privacy 
can be found here): https://linutronix.de/legal/data-protection.php

Linutronix GmbH | Firmensitz (Registered Office): Uhldingen-Mühlhofen | 
Registergericht (Registration Court): Amtsgericht Freiburg i.Br., HRB700 
806 | Geschäftsführer (Managing Directors): Dr. Wilfried Wessner, 
Katharina Kopp, Alexander Gieringer

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH RESEND v3 1/4] firmware: raspberrypi: reorder rpi_firmware_property_tag enum
  2026-07-30 11:04   ` sashiko-bot
@ 2026-07-30 11:53     ` Gregor Herburger
  0 siblings, 0 replies; 9+ messages in thread
From: Gregor Herburger @ 2026-07-30 11:53 UTC (permalink / raw)
  To: sashiko-reviews; +Cc: devicetree, robh, conor+dt

On Thu, Jul 30, 2026 at 11:04:17AM +0000, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
> - [Medium] The commit claims to reorder all enum tags by their integer values, but incorrectly places `RPI_FIRMWARE_VCHIQ_INIT` out of order relative to the newly moved tags.
> --
> 
> --- Patch [1]: [PATCH RESEND v3 1/4] firmware: raspberrypi: reorder rpi_firmware_property_tag enum ---
> commit 6dfb35594a9bcc2cc5fa3006d5257b66c4f03b4a
> Author: Gregor Herburger <gregor.herburger@linutronix.de>
> 
> firmware: raspberrypi: reorder rpi_firmware_property_tag enum
> 
> This commit attempts to reorder the tags in the rpi_firmware_property_tag
> enum by their integer values to correct previously out-of-order additions.
> 
> > diff --git a/include/soc/bcm2835/raspberrypi-firmware.h b/include/soc/bcm2835/raspberrypi-firmware.h
> > --- a/include/soc/bcm2835/raspberrypi-firmware.h
> > +++ b/include/soc/bcm2835/raspberrypi-firmware.h
> 
> [ ... ]
> 
> > @@ -125,10 +125,10 @@ enum rpi_firmware_property_tag {
> >  	RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_OFFSET =         0x00048009,
> >  	RPI_FIRMWARE_FRAMEBUFFER_SET_OVERSCAN =               0x0004800a,
> >  	RPI_FIRMWARE_FRAMEBUFFER_SET_PALETTE =                0x0004800b,
> > -	RPI_FIRMWARE_FRAMEBUFFER_SET_TOUCHBUF =               0x0004801f,
> > -	RPI_FIRMWARE_FRAMEBUFFER_SET_GPIOVIRTBUF =            0x00048020,
> >  	RPI_FIRMWARE_FRAMEBUFFER_SET_VSYNC =                  0x0004800e,
> >  	RPI_FIRMWARE_FRAMEBUFFER_SET_BACKLIGHT =              0x0004800f,
> > +	RPI_FIRMWARE_FRAMEBUFFER_SET_TOUCHBUF =               0x0004801f,
> > +	RPI_FIRMWARE_FRAMEBUFFER_SET_GPIOVIRTBUF =            0x00048020,
> >  
> >  	RPI_FIRMWARE_VCHIQ_INIT =                             0x00048010,
> 
> [Severity: Medium]
> The commit message states the intent is to reorder the tags by their numerical
> values, but does this final arrangement still leave them unsorted? 
> 
> The relocated tags RPI_FIRMWARE_FRAMEBUFFER_SET_TOUCHBUF (0x0004801f) and 
> RPI_FIRMWARE_FRAMEBUFFER_SET_GPIOVIRTBUF (0x00048020) are now placed right 
> before RPI_FIRMWARE_VCHIQ_INIT (0x00048010).

I saw this but as this is named completly different I decided to keep it out of
the RPI_FIRMWARE_FRAMEBUFFER* block.

Regards
-- 
Gregor Herburger
Linutronix GmbH | Bahnhofstrasse 3 | D-88690 Uhldingen-Mühlhofen
Phone: +49 7556 25 999 35; Fax.: +49 7556 25 999 99

Hinweise zum Datenschutz finden Sie hier (Informations on data privacy 
can be found here): https://linutronix.de/legal/data-protection.php

Linutronix GmbH | Firmensitz (Registered Office): Uhldingen-Mühlhofen | 
Registergericht (Registration Court): Amtsgericht Freiburg i.Br., HRB700 
806 | Geschäftsführer (Managing Directors): Dr. Wilfried Wessner, 
Katharina Kopp, Alexander Gieringer

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2026-07-30 11:53 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 1/4] firmware: raspberrypi: reorder rpi_firmware_property_tag enum Gregor Herburger
2026-07-30 11:04   ` sashiko-bot
2026-07-30 11:53     ` Gregor Herburger
2026-07-30 10:59 ` [PATCH RESEND v3 2/4] dt-bindings: raspberrypi,bcm2835-firmware: Include 'reboot-mode.yaml' 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
2026-07-30 11:52     ` [PATCH RESEND v3 3/4] firmware: raspberrypi: Add reboot mode supporty Gregor Herburger
2026-07-30 10:59 ` [PATCH RESEND v3 4/4] arm64: dts: broadcom: bcm2712: Add reboot modes to firmware node Gregor Herburger

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.