From 57fd23db8198e7834ee4f0d4cc8c51de4500a571 Mon Sep 17 00:00:00 2001 From: Jamie Magee Date: Fri, 24 Apr 2026 15:45:35 -0700 Subject: [PATCH] raspberry-pi: fix DTB name mapping for U-Boot - Gate on rpiVersion instead of architecture; skip for Pi 4+ where vendor and upstream DTB names already match - Fix bcm2835-rpi-zero.dtb: was copied from bcm2708-rpi-b-plus (wrong board), now uses bcm2708-rpi-zero - Drop bcm2711-rpi-4-b -> bcm2838-rpi-4-b copy; nothing uses bcm2838-* Ref: https://github.com/u-boot/u-boot/blob/master/board/raspberrypi/rpi/rpi.c --- raspberry-pi/common/kernel.nix | 71 ++++++++++++++++------------------ 1 file changed, 33 insertions(+), 38 deletions(-) diff --git a/raspberry-pi/common/kernel.nix b/raspberry-pi/common/kernel.nix index b579f7a8..5f605a59 100644 --- a/raspberry-pi/common/kernel.nix +++ b/raspberry-pi/common/kernel.nix @@ -71,42 +71,37 @@ in sed -i $buildRoot/include/config/auto.conf -e 's/^CONFIG_LOCALVERSION=.*/CONFIG_LOCALVERSION=""/' ''; - # Make copies of the DTBs named after the upstream names so that U-Boot finds them. - # This is ugly as heck, but I don't know a better solution so far. - postFixup = '' - dtbDir=${if stdenv.hostPlatform.isAarch64 then "$out/dtbs/broadcom" else "$out/dtbs"} - rm $dtbDir/bcm283*.dtb - copyDTB() { - cp -v "$dtbDir/$1" "$dtbDir/$2" - } - '' - + lib.optionalString (lib.elem stdenv.hostPlatform.system [ "armv6l-linux" ]) '' - copyDTB bcm2708-rpi-zero-w.dtb bcm2835-rpi-zero.dtb - copyDTB bcm2708-rpi-zero-w.dtb bcm2835-rpi-zero-w.dtb - copyDTB bcm2708-rpi-b.dtb bcm2835-rpi-a.dtb - copyDTB bcm2708-rpi-b.dtb bcm2835-rpi-b.dtb - copyDTB bcm2708-rpi-b.dtb bcm2835-rpi-b-rev2.dtb - copyDTB bcm2708-rpi-b-plus.dtb bcm2835-rpi-a-plus.dtb - copyDTB bcm2708-rpi-b-plus.dtb bcm2835-rpi-b-plus.dtb - copyDTB bcm2708-rpi-b-plus.dtb bcm2835-rpi-zero.dtb - copyDTB bcm2708-rpi-cm.dtb bcm2835-rpi-cm.dtb - '' - + lib.optionalString (lib.elem stdenv.hostPlatform.system [ "armv7l-linux" ]) '' - copyDTB bcm2709-rpi-2-b.dtb bcm2836-rpi-2-b.dtb - '' - + - lib.optionalString - (lib.elem stdenv.hostPlatform.system [ - "armv7l-linux" - "aarch64-linux" - ]) - '' - copyDTB bcm2710-rpi-zero-2.dtb bcm2837-rpi-zero-2.dtb - copyDTB bcm2710-rpi-zero-2-w.dtb bcm2837-rpi-zero-2-w.dtb - copyDTB bcm2710-rpi-3-b.dtb bcm2837-rpi-3-b.dtb - copyDTB bcm2710-rpi-3-b-plus.dtb bcm2837-rpi-3-a-plus.dtb - copyDTB bcm2710-rpi-3-b-plus.dtb bcm2837-rpi-3-b-plus.dtb - copyDTB bcm2710-rpi-cm3.dtb bcm2837-rpi-cm3.dtb - copyDTB bcm2711-rpi-4-b.dtb bcm2838-rpi-4-b.dtb - ''; + # The vendor kernel uses different DTB names (bcm2708/bcm2709/bcm2710) than what + # U-Boot expects (bcm2835/bcm2836/bcm2837). Starting with Pi 4, names match. + # See: https://github.com/u-boot/u-boot/blob/master/board/raspberrypi/rpi/rpi.c + postFixup = lib.optionalString (rpiVersion < 4) ( + '' + dtbDir=${if stdenv.hostPlatform.isAarch64 then "$out/dtbs/broadcom" else "$out/dtbs"} + rm $dtbDir/bcm283*.dtb + copyDTB() { + cp -v "$dtbDir/$1" "$dtbDir/$2" + } + '' + + lib.optionalString (rpiVersion == 1) '' + copyDTB bcm2708-rpi-zero.dtb bcm2835-rpi-zero.dtb + copyDTB bcm2708-rpi-zero-w.dtb bcm2835-rpi-zero-w.dtb + copyDTB bcm2708-rpi-b.dtb bcm2835-rpi-a.dtb + copyDTB bcm2708-rpi-b.dtb bcm2835-rpi-b.dtb + copyDTB bcm2708-rpi-b.dtb bcm2835-rpi-b-rev2.dtb + copyDTB bcm2708-rpi-b-plus.dtb bcm2835-rpi-a-plus.dtb + copyDTB bcm2708-rpi-b-plus.dtb bcm2835-rpi-b-plus.dtb + copyDTB bcm2708-rpi-cm.dtb bcm2835-rpi-cm.dtb + '' + + lib.optionalString (rpiVersion == 2) '' + copyDTB bcm2709-rpi-2-b.dtb bcm2836-rpi-2-b.dtb + '' + + lib.optionalString (rpiVersion == 3) '' + copyDTB bcm2710-rpi-zero-2.dtb bcm2837-rpi-zero-2.dtb + copyDTB bcm2710-rpi-zero-2-w.dtb bcm2837-rpi-zero-2-w.dtb + copyDTB bcm2710-rpi-3-b.dtb bcm2837-rpi-3-b.dtb + copyDTB bcm2710-rpi-3-b-plus.dtb bcm2837-rpi-3-a-plus.dtb + copyDTB bcm2710-rpi-3-b-plus.dtb bcm2837-rpi-3-b-plus.dtb + copyDTB bcm2710-rpi-cm3.dtb bcm2837-rpi-cm3.dtb + '' + ); }