Skip to content

Commit e425017

Browse files
committed
conditional: Document the new expression filter and new Pi5 boot variables
1 parent 5780e46 commit e425017

File tree

2 files changed

+109
-14
lines changed

2 files changed

+109
-14
lines changed

documentation/asciidoc/computers/config_txt/conditional.adoc

+88-8
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,6 @@ Some models of Raspberry Pi, including Zero, Compute Module, and Keyboard models
9696

9797
The `[none]` filter prevents any settings that follow from being applied to any hardware. Although there is nothing that you can't do without `[none]`, it can be a useful way to keep groups of unused settings in config.txt without having to comment out every line.
9898

99-
=== The `[partition=N]` filter
100-
This `partition` filter can be be used to select alternate boot flows according to the requested partition number (`sudo reboot N`) or via direct usage of the `PM_RSTS` watchdog register.
101-
10299
[source,ini]
103100
----
104101
# Bootloader EEPROM config.
@@ -123,25 +120,108 @@ cmdline=cmdline-recovery.txt
123120

124121
The raw value of the `PM_RSTS` register at bootup is available via `/proc/device-tree/chosen/bootloader/rsts` and the final partition number used for booting is available via `/proc/device-tree/chosen/bootloader/partition`. These are big-endian binary values.
125122

126-
=== The `[boot_partition=N]` filter
127-
The `boot_partition` filter can be used to select alternate OS files (e.g. `cmdline.txt`) to be loaded, depending on which partition `config.txt` was loaded from after processing `autoboot.txt`. This is intended for use with an `A/B` boot-system with `autoboot.txt` where it is desirable to be able to have identical files installed to the boot partition for both the `A` and `B` images.
123+
=== The expression filter
124+
125+
The expression filter provides support for comparing unsigned integer "boot variables" to constants using a simple set of operators. It is intended to support OTA update mechanisms, debug and test.
126+
127+
* The "boot variables" are `boot_arg1`, `boot_count`, `boot_partition` and `partition`.
128+
* Boot variables are always lower case.
129+
* Integer constants may either be written as decimal or as hex.
130+
* Expression conditional filters have no side-effects e.g. no assignment operators.
131+
* As with other filter types the expression filter cannot be nested.
132+
* Use the `[all]` filter to reset expressions and all other conditional filter types.
133+
134+
Syntax:
135+
[source,ini]
136+
----
137+
# ARG is a boot-variable
138+
# VALUE and MASK are unsigned integer constants
139+
[ARG=VALUE] # selected if (ARG == VALUE)
140+
[ARG&MASK] # selected if ((ARG & VALUE) != 0)
141+
[ARG&MASK=VALUE] # selected if ((ARG & MASK) == VALUE)
142+
[ARG<VALUE] # selected if (ARG < VALUE)
143+
[ARG>VALUE] # selected if (ARG > VALUE)
144+
145+
----
146+
147+
==== `boot_arg1`
148+
Raspberry Pi 5 and newer flagship devices only.
149+
150+
The `boot_arg1` variable is a 32-bit user defined value which is stored in a reset-safe register allowing parameters to be passed accross a reboot.
151+
152+
Setting `boot_arg1` to 42 via `config.txt`:
153+
[source,ini]
154+
----
155+
set_reboot_arg1=42
156+
----
157+
The `set_reboot_arg1` property sets the value for the next boot. It does not change the current value as seen by the config parser.
158+
159+
Setting `boot_arg1` to 42 via vcmailbox:
160+
[source,console]
161+
----
162+
sudo vcmailbox 0x0003808c 8 8 1 42
163+
----
164+
165+
Reading `boot_arg1` via vcmailbox:
166+
[source,console]
167+
----
168+
sudo vcmailbox 0x0003008c 8 8 1 0
169+
# Example output - boot_arg1 is 42
170+
# 0x00000020 0x80000000 0x0003008c 0x00000008 0x80000008 0x00000001 0x0000002a 0x0000000
171+
----
172+
The value of the `boot_arg1` variable when the OS was started can be read via xref:configuration.adoc#part4[device-tree] at `/proc/device-tree/chosen/bootloader/arg1`
173+
174+
==== `boot_count`
175+
Raspberry Pi 5 and newer flagship devices only.
176+
177+
The `boot_count` variable is an 8-bit value stored in a reset-safe register that is incremented at boot (wrapping back to zero at 256). It is cleared if power is disconnected.
128178

129-
Example `config.txt` - select the matching root filesystem for the `A/B` boot file-system.
179+
To read `boot_count` via vcmailbox:
180+
[source,console]
181+
----
182+
sudo vcmailbox 0x0003008d 4 4 0
183+
# Example - boot count is 3
184+
# 0x0000001c 0x80000000 0x0003008d 0x00000004 0x80000004 0x00000003 0x00000000
185+
----
186+
187+
Setting/clearing `boot_count` via vcmailbox:
188+
[source,console]
189+
----
190+
# Clear boot_count by setting it to zero.
191+
sudo vcmailbox 0x0003808d 4 4 0
192+
----
193+
The value of `boot_count` when the OS was started can be read via xref:configuration.adoc#part4[device-tree] at `/proc/device-tree/chosen/bootloader/count`
194+
195+
==== `boot_partition`
196+
The `boot_partition` variable can be used to select alternate OS files (e.g. `cmdline.txt`) to be loaded, depending on which partition `config.txt` was loaded from after processing xref:config_txt.adoc#autoboot-txt[autoboot.txt]. This is intended for use with an `A/B` boot-system with `autoboot.txt` where it is desirable to be able to have identical files installed to the boot partition for both the `A` and `B` images.
197+
198+
The value of the `boot_partition` can be different to the requested `partition` variable if it was overriden by setting `boot_partition` in xref:config_txt.adoc#autoboot-txt[autoboot.txt] or if the specified partion was not bootable and xref:raspberry-pi.adoc#PARTITION_WALK[PARTITION_WALK] was enabled in the EEPROM config.
199+
200+
Example `config.txt` - select the matching root filesystem for the `A/B` boot file-system:
130201
[source,ini]
131202
----
203+
# Use different cmdline files to point to different root filesystems based on which partition the system booted from.
132204
[boot_partition=1]
133-
cmdline=cmdline_rootfs_a.txt
205+
cmdline=cmdline_rootfs_a.txt # Points to root filesystem A
134206
135207
[boot_partition=2]
136-
cmdline=cmdline_rootfs_b.txt
208+
cmdline=cmdline_rootfs_b.txt # Points to root filesystem B
137209
----
138210

211+
The value of `boot_partition` i.e. the partition used to boot the OS can be read from xref:configuration.adoc#part4[device-tree] at `/proc/device-tree/chosen/bootloader/partition`
212+
213+
==== `partition`
214+
The `partition` variable can be used to select alternate boot flows according to the requested partition number (`sudo reboot N`) or via direct usage of the `PM_RSTS` watchdog register.
215+
216+
139217
=== The `[tryboot]` filter
140218

141219
This filter succeeds if the `tryboot` reboot flag was set.
142220

143221
It is intended for use in xref:config_txt.adoc#autoboot-txt[autoboot.txt] to select a different `boot_partition` in `tryboot` mode for fail-safe OS updates.
144222

223+
The value of `tryboot` at the start of boot can be read via xref:configuration.adoc#part4[device-tree] at `/proc/device-tree/chosen/bootloader/tryboot`
224+
145225
=== The `[EDID=*]` filter
146226

147227
When switching between multiple monitors while using a single SD card in your Raspberry Pi, and where a blank config isn't sufficient to automatically select the desired resolution for each one, this allows specific settings to be chosen based on the monitors' EDID names.

documentation/asciidoc/computers/configuration/device-tree.adoc

+21-6
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,16 @@ For a list of supported overlays and parameters, see the https://github.com/rasp
833833
[[part4]]
834834
=== Firmware parameters
835835

836-
The firmware uses the special https://www.kernel.org/doc/html/latest/devicetree/usage-model.html#runtime-configuration[/chosen] node to pass parameters between the bootloader and/or firmware and the operating system. Each property is stored as a 32-bit integer unless indicated otherwise.
836+
The firmware uses the special https://www.kernel.org/doc/html/latest/devicetree/usage-model.html#runtime-configuration[/chosen] node to pass parameters between the bootloader and/or firmware and the operating system.
837+
838+
* Each property is stored as a 32-bit unsigned integer unless indicated otherwise.
839+
* Numbers in device-tree are stored in binary and are big-endian.
840+
841+
Example shell command for reading a 32-bit unsigned integer property:
842+
[source,console]
843+
----
844+
printf "%d" "0x$(od "/proc/device-tree/chosen/bootloader/partition" -v -An -t x1 | tr -d ' ' )"
845+
----
837846

838847
`overlay_prefix`:: _(string)_ The xref:config_txt.adoc#overlay_prefix[overlay_prefix] string selected by `config.txt`.
839848

@@ -849,8 +858,6 @@ The firmware uses the special https://www.kernel.org/doc/html/latest/devicetree/
849858

850859
==== Common bootloader properties `/chosen/bootloader`
851860

852-
Each property is stored as a 32-bit integer unless indicated otherwise.
853-
854861
`boot-mode`:: The boot-mode used to load the kernel. See the xref:raspberry-pi.adoc#BOOT_ORDER[BOOT_ORDER] documentation for a list of possible boot-mode values.
855862

856863
`partition`:: The partition number used during boot. If a `boot.img` ramdisk is loaded then this refers to partition that the ramdisk was loaded from rather than the partition number within the ramdisk.
@@ -859,9 +866,17 @@ Each property is stored as a 32-bit integer unless indicated otherwise.
859866

860867
`tryboot`:: Set to `1` if the `tryboot` flag was set at boot.
861868

869+
==== Boot variables `/chosen/bootloader`
870+
871+
Raspberry Pi 5 only.
872+
873+
`arg1`:: The value of the user defined reboot argument from the previous boot. See xref:config_txt.adoc#boot_arg1[boot_arg1]
874+
875+
`count`:: The value of the 8-bit `boot_count` variable when the OS was started. See xref:config_txt.adoc#boot_count[boot_count]
876+
862877
==== Power supply properties `/chosen/power`
863878

864-
Raspberry Pi 5 only. Each property is stored as a 32-bit integer unless indicated otherwise.
879+
Raspberry Pi 5 only.
865880

866881
`max_current`:: The maximum current in mA that the power supply can supply. The firmware reports the value indicated by the USB-C, USB-PD or PoE interfaces. For bench power supplies (e.g. connected to the GPIO header) define `PSU_MAX_CURRENT` in the bootloader configuration to indicate the power supply current capability.
867882

@@ -898,7 +913,7 @@ The format is defined by the https://usb.org/document-library/usb-power-delivery
898913

899914
==== BCM2711 and BCM2712 specific bootloader properties `/chosen/bootloader`
900915

901-
The following properties are specific to the BCM2711 and BCM2712 SPI EEPROM bootloaders. Each property is stored as a 32-bit integer unless indicated otherwise.
916+
The following properties are specific to the BCM2711 and BCM2712 SPI EEPROM bootloaders.
902917

903918
`build_timestamp`:: The UTC build time for the EEPROM bootloader.
904919

@@ -959,7 +974,7 @@ The following properties are specific to the BCM2711 and BCM2712 SPI EEPROM boot
959974

960975
==== BCM2711 and BCM2712 USB boot properties `/chosen/bootloader/usb`
961976

962-
The following properties are defined if the system was booted from USB. These may be used to uniquely identify the USB boot device. Each property is stored as a 32-bit integer.
977+
The following properties are defined if the system was booted from USB. These may be used to uniquely identify the USB boot device.
963978

964979
`usb-version`:: The USB major protocol version (2 or 3).
965980

0 commit comments

Comments
 (0)