Skip to content

Commit 601d2ff

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

File tree

2 files changed

+103
-10
lines changed

2 files changed

+103
-10
lines changed

documentation/asciidoc/computers/config_txt/conditional.adoc

+86-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,19 +120,100 @@ 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+
`boot_arg1` is a 32-bit user defined value which is stored in a reset-safe register allowing parameters can be passed accross a reboot.
128151

129-
Example `config.txt` - select the matching root filesystem for the `A/B` boot file-system.
152+
Setting `boot_arg1` to 42 via `config.txt`:
130153
[source,ini]
131154
----
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+
`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.
178+
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 `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 `partition` variable because the required `partition` can be overriden by `autoboot.txt`.
199+
200+
Example `config.txt` - select the matching root filesystem for the `A/B` boot file-system:
201+
[source,ini]
202+
----
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 device-tree at `/proc/device-tree/chosen/bootloader/partition`
212+
213+
==== `partition`
214+
This `partition` "boot 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.

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

+17-2
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,14 @@ 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. Each property is stored as a 32-bit unsigned integer unless indicated otherwise.
837+
838+
Numbers in device-tree are stored in binary and are big-endian.
839+
[source,console]
840+
----
841+
# Example shell script for reading a 32-bit unsigned number from device-tree
842+
printf "%d" "0x$(od "/proc/device-tree/chosen/bootloader/partition" -v -An -t x1 | tr -d ' ' )"
843+
----
837844

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

@@ -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. Each property is stored as a 32-bit unsigned integer unless indicated otherwise.
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. Each property is stored as a 32-bit unsigned integer unless indicated otherwise.
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

0 commit comments

Comments
 (0)