Compare commits

..

16 Commits

Author SHA1 Message Date
Tim Gover
23ca472db4 pieeprom-2026-01-09: 2711: Promote to the default release 2026-01-13 22:19:54 +00:00
Tim Gover
d67a756153 pieeprom-2026-01-09: 2711: arm_loader: Apply rpifwcrypto lock permissions GET/SET USER OTP (latest)
* arm_loader: Apply rpifwcrypto lock permissions GET/SET USER OTP
  Previously, the GET/SET user OTP mailboxes would provide access to the
  device unique private key. Update the mailbox API to fail if the
  key has been locked via lock_device_private_key=1 in config.txt or
  the associated mailbox call.
  GET/SET user OTP fails by setting the result tag to the standard
  error code (0x80000000). The dedicate GET/SET private key continue
  to fail the entire mailbox operation to force vcmailbox to exit
  with a non-zero error code.
* cm5: Add support for 8-bit bus width eMMC
* Query all sdram devices for temperature when adjusting refresh
* Add support for more SDRAM die configurations.
2026-01-09 17:32:13 +00:00
Tim Gover
9e9a954772 rpi-eeprom-config: Use time.monotonic for timeouts instead of wall clock
See: https://github.com/raspberrypi/rpi-eeprom/issues/790
2025-12-16 12:17:13 +00:00
Tim Gover
c77d47cbec imager: make-imager-release: Automatically select latest default EEPROM date
See: https://github.com/raspberrypi/rpi-eeprom/issues/788
2025-12-12 11:23:34 +00:00
Tim Gover
cb1a22eff0 pieeprom-2025-12-08: 2712: 2711: Promote to the default release 2025-12-09 09:40:24 +00:00
Tim Gover
ba4371dd8a pieeprom-2025-12-08: 2712: arm_loader: Add machine ID derived from OTP values (latest)
* arm_loader: Add machine ID derived from OTP values
  Machine ID is generated and exposed in device tree as rpi-machine-id
* arm_ldconfig: Avoid double os_prefix on initramfs
  When using auto_initramfs we were picking up prefix from the kernel,
  but also adding os_prefix later:
  fname = prefixed_path(initramfs_file, os_prefix, temp_path, sizeof(temp_path));
  See: https://forums.raspberrypi.com/viewtopic.php?t=394238
2025-12-08 19:45:07 +00:00
Tim Gover
907c5a672a pieeprom-2025-12-08: 2711: Add machine ID derived from OTP values (latest)
* arm_loader: Add machine ID derived from OTP values
  Machine ID is generated and exposed in device tree as rpi-machine-id
* arm_ldconfig: Avoid double os_prefix on initramfs
  When using auto_initramfs we were picking up prefix from the kernel,
  but also adding os_prefix later:
  fname = prefixed_path(initramfs_file, os_prefix, temp_path, sizeof(temp_path));
  See: https://forums.raspberrypi.com/viewtopic.php?t=394238
* recovery: Use OTP rpiboot GPIO if non-zero
  If an rpiboot GPIO has already been written to OTP then default to
  that value if C(program_rpiboot_gpio) is not specified on config.txt.
2025-12-08 19:37:21 +00:00
Tim Gover
68774da0be pieeprom-2025-11-27: 2711: helpers/config_loader: Also support bootvar0 eeprom config on Pi4 (latest)
* helpers/config_loader: Also support bootvar0 eeprom config on Pi4
  This allows an eeprom config setting (e.g. BOOTARG0=0x10) to be set on a board
  which config.txt can use as a conditional expression (e.g. [bootarg0&0x10]).
* pi5: Write over-voltage config to the UART log
  Write the high level over-voltage configuration to the UART log for
  diagnostic purposes.
* Stop partition-walk after boot-mode timeout/retries limit
  Fix a fatal assert with USB boot where the partition walk could be
  retried after the USB timeout/retry limit had been reached.
  See: https://github.com/raspberrypi/rpi-eeprom/issues/776
* rpiboot: Extend metadata to report status of operations
  Report success/fail status of recovery operations based on config.txt settings
2025-11-27 16:13:42 +00:00
Tim Gover
1c83bfc5b2 pieeprom-2025-11-27: 2712: Stop partition-walk after boot-mode timeout/retries limit (latest)
* pi5: Write over-voltage config to the UART log
  Write the high level over-voltage configuration to the UART log for
  diagnostic purposes.
* Stop partition-walk after boot-mode timeout/retries limit
  Fix a fatal assert with USB boot where the partition walk could be
  retried after the USB timeout/retry limit had been reached.
  See: https://github.com/raspberrypi/rpi-eeprom/issues/776
* rpiboot: Extend metadata to report status of operations
  Report success/fail status of recovery operations based on config.txt settings
2025-11-27 16:09:39 +00:00
Andrew Scheller
0f936ff2e2 Fix remaining typo 2025-11-24 17:42:39 +00:00
Phil Elwell
91e7eb5708 tools: imager: make-pi4-rpiboot-gpio-sd: Minor typos 2025-11-24 17:38:00 +00:00
Tim Gover
eed4273686 tools: imager: Add make-pi4-rpiboot-gpio-sd
Add new utility which creates a SD card image for programming
the rpiboot GPIO OTP option on a Pi 4 or Pi 400.

Example:
sudo imager/make-pi4-rpiboot-gpio-sd 6

Creates images-2711/pi4-program-rpiboot-gpio6.zip which can
be flashed to a spared SD card with Raspberry Pi Imager. This
will select GPIO 6 for use as the rpiboot GPIO.
2025-11-24 17:09:42 +00:00
Tim Gover
801aeb77c5 pieeprom-2025-11-21: 2711: recovery: Restore recovery_wait option (latest)
* recovery: Restore recovery_wait option
  Restore the recovery_wait config.txt option. If this option is set
  then recovery.bin will not rename itself or reboot. Instead flash
  the activity LED on completion.
  This option can be useful when creating an SD card to erase the
  EEPROM or program the RPIBOOT gpio on multiple devices.
  If recovery_wait=1 and recovery.bin is run from the SD card then
  indicate success of erase_eeprom=1 or program_rpiboot_gpio=N was
  set instead of requiring the EEPROM to be updated.
* Manufacture test updates for SDRAM.
2025-11-21 14:15:45 +00:00
Tim Gover
12fde4b848 pieeprom-2025-11-21: 2712: Allow longer overlay file paths (latest)
* recovery: Restore recovery_wait option
  Restore the recovery_wait config.txt option. If this option is set
  then recovery.bin will not rename itself or reboot. Instead flash
  the activity LED on completion.
  This option can be useful when creating an SD card to erase the
  EEPROM or program the RPIBOOT gpio on multiple devices.
  If recovery_wait=1 and recovery.bin is run from the SD card then
  indicate success of erase_eeprom=1 or program_rpiboot_gpio=N was
  set instead of requiring the EEPROM to be updated.
* Load RP1 firmware whilst DDR is initialising
* Allow longer overlay file paths
  load_dtoverlay uses the variable "filename" to hold the full path to an
  overlay. As such it should be declared using LDFILEPATH_MAX, not
  LDFILENAME_MAX.
  See: https://github.com/raspberrypi/firmware/issues/2004
2025-11-21 13:40:43 +00:00
Tim Gover
f38dbcb723 imager: Delete temporary release-2711, release-2712 directories
Update make-imager-release to remove the release-CHIP directories
which contain the plain .zip files. These are used as the input
to make-recovery-images which are disk images.
RPi Imager expects to download disk-images rather than .zips so
remove the temporary directories to avoid confusion.

See: https://github.com/raspberrypi/rpi-eeprom/issues/770
2025-11-11 20:02:41 +00:00
Lincoln Thurlow
1c92bb9bc3 Fix the error message for config signing
When the user runs rpi-eeprom-config to sign a bootloader image,
if the image is not the correct size, the error message returns
a tautology:

rpi-eeprom-config -c boot.conf -p /tmp/rpi-pubkey.pem \
-o pieeprom.upd /tmp/downloaded-boot.img

ERROR: /tmp/downloaded-boot.img: \
Expected size 62914560 bytes actual size 62914560 bytes

When it should be alerting the user that there are only two
valid values for a bootloader size.  My MR addresses this issue
by returning the acceptable values for the bootloader size in the
image.

./rpi-eeprom-config -c boot.conf -p /tmp/rpi-pubkey.pem \
-o pieeprom.upd /tmp/downloaded-boot.img

ERROR: /tmp/downloaded-boot.img: \
Expected sizes [524288, 2097152] bytes, got actual size 62914560 bytes

Signed-off-by: Lincoln Thurlow <lincoln@isi.edu>
2025-11-11 19:52:32 +00:00
20 changed files with 255 additions and 6 deletions

2
.gitignore vendored
View File

@@ -1 +1,3 @@
*.swp
images-2711/
images-2712/

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,5 +1,65 @@
# Raspberry Pi4 bootloader EEPROM release notes
## 2026-01-13: Promote 2026-01-09 to the default release (default)
## 2026-01-09: arm_loader: Apply rpifwcrypto lock permissions GET/SET USER OTP (latest)
* arm_loader: Apply rpifwcrypto lock permissions GET/SET USER OTP
Previously, the GET/SET user OTP mailboxes would provide access to the
device unique private key. Update the mailbox API to fail if the
key has been locked via lock_device_private_key=1 in config.txt or
the associated mailbox call.
GET/SET user OTP fails by setting the result tag to the standard
error code (0x80000000). The dedicate GET/SET private key continue
to fail the entire mailbox operation to force vcmailbox to exit
with a non-zero error code.
* cm5: Add support for 8-bit bus width eMMC
* Query all sdram devices for temperature when adjusting refresh
* Add support for more SDRAM die configurations.
## 2025-12-09: Promote 2025-12-08 to the default release (default)
## 2025-12-08: arm_loader: Add machine ID derived from OTP values (latest)
* arm_loader: Add machine ID derived from OTP values
Machine ID is generated and exposed in device tree as rpi-machine-id
* arm_ldconfig: Avoid double os_prefix on initramfs
When using auto_initramfs we were picking up prefix from the kernel,
but also adding os_prefix later:
fname = prefixed_path(initramfs_file, os_prefix, temp_path, sizeof(temp_path));
See: https://forums.raspberrypi.com/viewtopic.php?t=394238
* recovery: Use OTP rpiboot GPIO if non-zero
If an rpiboot GPIO has already been written to OTP then default to
that value if C(program_rpiboot_gpio) is not specified on config.txt.
## 2025-11-27: helpers/config_loader: Also support bootvar0 eeprom config on Pi4 (latest)
* helpers/config_loader: Also support bootvar0 eeprom config on Pi4
This allows an eeprom config setting (e.g. BOOTARG0=0x10) to be set on a board
which config.txt can use as a conditional expression (e.g. [bootarg0&0x10]).
* pi5: Write over-voltage config to the UART log
Write the high level over-voltage configuration to the UART log for
diagnostic purposes.
* Stop partition-walk after boot-mode timeout/retries limit
Fix a fatal assert with USB boot where the partition walk could be
retried after the USB timeout/retry limit had been reached.
See: https://github.com/raspberrypi/rpi-eeprom/issues/776
* rpiboot: Extend metadata to report status of operations
Report success/fail status of recovery operations based on config.txt settings
## 2025-11-21: recovery: Restore recovery_wait option (latest)
* recovery: Restore recovery_wait option
Restore the recovery_wait config.txt option. If this option is set
then recovery.bin will not rename itself or reboot. Instead flash
the activity LED on completion.
This option can be useful when creating an SD card to erase the
EEPROM or program the RPIBOOT gpio on multiple devices.
If recovery_wait=1 and recovery.bin is run from the SD card then
indicate success of erase_eeprom=1 or program_rpiboot_gpio=N was
set instead of requiring the EEPROM to be updated.
* Manufacture test updates for SDRAM.
## 2025-11-09: Promote 2025-11-05 to the default release (default)
## 2025-11-05: Add iommu_dma_numa_policy=interleave when needed (latest)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,5 +1,47 @@
# Raspberry Pi5 bootloader EEPROM release notes
## 2025-12-09: Promote 2025-12-08 to the default release (default)
## 2025-12-08: arm_loader: Add machine ID derived from OTP values (latest)
* arm_loader: Add machine ID derived from OTP values
Machine ID is generated and exposed in device tree as rpi-machine-id
* arm_ldconfig: Avoid double os_prefix on initramfs
When using auto_initramfs we were picking up prefix from the kernel,
but also adding os_prefix later:
fname = prefixed_path(initramfs_file, os_prefix, temp_path, sizeof(temp_path));
See: https://forums.raspberrypi.com/viewtopic.php?t=394238
## 2025-11-27: Stop partition-walk after boot-mode timeout/retries limit (latest)
* pi5: Write over-voltage config to the UART log
Write the high level over-voltage configuration to the UART log for
diagnostic purposes.
* Stop partition-walk after boot-mode timeout/retries limit
Fix a fatal assert with USB boot where the partition walk could be
retried after the USB timeout/retry limit had been reached.
See: https://github.com/raspberrypi/rpi-eeprom/issues/776
* rpiboot: Extend metadata to report status of operations
Report success/fail status of recovery operations based on config.txt settings
## 2025-11-21: Allow longer overlay file paths (latest)
* recovery: Restore recovery_wait option
Restore the recovery_wait config.txt option. If this option is set
then recovery.bin will not rename itself or reboot. Instead flash
the activity LED on completion.
This option can be useful when creating an SD card to erase the
EEPROM or program the RPIBOOT gpio on multiple devices.
If recovery_wait=1 and recovery.bin is run from the SD card then
indicate success of erase_eeprom=1 or program_rpiboot_gpio=N was
set instead of requiring the EEPROM to be updated.
* Load RP1 firmware whilst DDR is initialising
* Allow longer overlay file paths
load_dtoverlay uses the variable "filename" to hold the full path to an
overlay. As such it should be declared using LDFILEPATH_MAX, not
LDFILENAME_MAX.
See: https://github.com/raspberrypi/firmware/issues/2004
## 2025-11-09: Promote 2025-11-05 to the default release (default)
## 2025-11-05: arm_loader: Add iommu_dma_numa_policy=interleave when needed (latest)

View File

@@ -1,11 +1,22 @@
#!/bin/sh
set -e
set -x
script_dir=$(cd "$(dirname "$0")" && pwd)
base_dir="${script_dir}/.."
# Pi4, Pi400, CM4, CM4-S
${script_dir}/make-release critical 2025-11-05 000138c0 "${script_dir}/2711-config" release-2711 rpi-boot-eeprom-recovery 2711
image_date=$(ls -lr $base_dir/firmware-2711/default/ | grep pieeprom | sed 's/.*pieeprom-//g' | sed 's/.bin//g' | head -n1)
${script_dir}/make-release critical ${image_date} 000138c0 "${script_dir}/2711-config" release-2711 rpi-boot-eeprom-recovery 2711
# Pi5
${script_dir}/make-release critical 2025-11-05 "" "${script_dir}/2712-config" release-2712 rpi-boot-eeprom-recovery 2712
image_date=$(ls -lr $base_dir/firmware-2712/default/ | grep pieeprom | sed 's/.*pieeprom-//g' | sed 's/.bin//g' | head -n1)
${script_dir}/make-release critical ${image_date} "" "${script_dir}/2712-config" release-2712 rpi-boot-eeprom-recovery 2712
# Convert to disk image for RPi Imager downloads
sudo ${script_dir}/make-recovery-images
# Delete the plain .zip files. These should not be uploaded as releases.
rm -rf release-2711
rm -rf release-2712

134
imager/make-pi4-rpiboot-gpio-sd Executable file
View File

@@ -0,0 +1,134 @@
#!/bin/sh
set -e
script_dir=$(cd "$(dirname "$0")" && pwd)
TMP_DIR=""
die() {
echo "$@" >&2
exit 1
}
cleanup() {
if [ -d "${TMP_DIR}" ]; then
rm -rf "${TMP_DIR}"
fi
}
usage() {
cat <<EOF
Usage:
sudo $(basename $0): <gpio_num>
Creates an SD card image which programs the OTP on a Pi 4B or Pi 400
to select a GPIO on the 40-pin header for use as the rpiboot GPIO.
Once programmed, if this GPIO is pulled to ground at power on, the
SoC bootrom will boot into rpiboot provisioning mode.
This setting _permanently_ modifies the device configuration - it cannot
be undone or changed, ever.
The SD image will be written to images-2711/pi4-program-rpiboot-gpioN.zip,
where N is the number of the chosen GPIO, and can be flashed using
Raspberry Pi Imager to a spare SD card. As with programming the bootloader
EEPROM, insert the card in the Raspberry Pi, power on and wait for the
green LED to flash.
gpio_num: Select the rpiboot GPIO number from 2,4,5,6,7 or 8.
EOF
exit 1
}
trap cleanup EXIT
[ "$(id -u)" = "0" ] || die "$(basename $0) must be run as root"
[ -n "${SUDO_UID}" ] || die "SUDO_UID not defined"
[ -n "${SUDO_GID}" ] || die "SUDO_GID not defined"
build_image()
{
chip="${1}"
gpio="${2}"
img="pi4-program-rpiboot-gpio${gpio}"
zip="${img}.zip"
img="${img}.img"
TMP_DIR="$(mktemp -d)"
(
mkdir "${TMP_DIR}/files"
cd "${TMP_DIR}/files"
cp "${script_dir}/../firmware-${chip}/latest/recovery.bin" .
cat <<EOF > config.txt
uart_2ndstage=1
recovery_wait=1
program_rpiboot_gpio=${gpio}
EOF
echo "Generated config.txt file"
cat config.txt
cd "${TMP_DIR}"
dd if=/dev/zero bs=1M count=258 of=temp.img > /dev/null 2>&1
/sbin/sfdisk temp.img <<EOF
label: dos
label-id: 0x0a7b5ac5
device: temp.img
unit: sectors
./test.img1 : start= 2048, size= 524288, type=c
EOF
file temp.img
LOOP="/dev/mapper/$(kpartx -lv temp.img | head -n1 | awk '{print $1}')"
kpartx -a temp.img
/sbin/mkfs.fat -F 32 -s 1 "${LOOP}" > /dev/null
mkdir fs
mount "${LOOP}" fs
cp -v files/* fs
sync
sleep 5
umount fs
# Delay before calling kpartx otherwise it's sometimes possible to get orphaned loopback devices
sleep 5
kpartx -d temp.img
)
image_dir="images-${chip}"
mkdir -p "${image_dir}"
chown "${SUDO_UID}:${SUDO_GID}" "${image_dir}"
mv "${TMP_DIR}/temp.img" "${image_dir}/${img}"
file "${image_dir}/${img}"
cd "${image_dir}"
zip "${zip}" "${img}"
cd ..
rm "${image_dir}/${img}"
chown "${SUDO_UID}:${SUDO_GID}" "${image_dir}/${zip}"
echo "Wrote $(pwd)/${image_dir}/${zip}"
}
if ! command -v kpartx > /dev/null; then
die "kpartx not found: Try installing the kpartx package"
fi
[ -n "${1}" ] || usage
gpio_num="$1"
case "${gpio_num}" in
2)
;;
4)
;;
5)
;;
6)
;;
7)
;;
8)
;;
*)
echo "GPIO ${gpio_num} is not supported"
echo
usage
;;
esac
build_image 2711 "${gpio_num}"

View File

@@ -117,12 +117,12 @@ def shell_cmd(args, timeout=10, echo=False):
error occurs then exit and output the subprocess stdout, stderr messages
for debug.
"""
start = time.time()
start = time.monotonic()
arg_str = ' '.join(args)
bufsize = 0 if echo else -1
result = subprocess.Popen(args, bufsize=bufsize, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while time.time() - start < timeout:
while time.monotonic() - start < timeout:
if echo:
s = result.stdout.read(80).decode('utf-8')
if s != "":
@@ -260,8 +260,8 @@ class BootloaderImage(object):
self._image_size = len(self._bytes)
if self._image_size not in VALID_IMAGE_SIZES:
exit_error("%s: Expected size %d bytes actual size %d bytes" %
(filename, self._image_size, len(self._bytes)))
exit_error("%s: Expected sizes %s bytes, got actual size %d bytes" %
(filename, VALID_IMAGE_SIZES, self._image_size))
self.parse()
def parse(self):