From: Mark Kettenis Subject: sysutils/u-boot/rpi: framebuffer fix To: mglocker@openbsd.org, jsg@openbsd.org, sthen@openbsd.org Cc: tech@openbsd.org, ports@openbsd.org, justin.berthault@zaclys.net Date: Sat, 27 Sep 2025 17:13:08 +0200 As reported by Justin Berthault on bugs@, the raspberrypi-firmware update has resulted in a change of the pixel format of the framebuffer on the Raspberry Pi 400. Instead of RGB it is now BGR. Unfortunately the device tree still says that the pixel format is RGB. The same thing happens on the Raspberry Pi 4B. The situation is a bit of a mess. There is a firmware call to set the pixel format, and U-Boot uses this call to request RGB. However it seems that this firmware call wasn't actually implemented until somewhere in 2024. The previous firmware we used was from 2021, so the call didn't actually do anything. Luckily the firmware has been using RGB as the default pixel format for almost a decade. Only really old firmware used BGR. Unfortunately when the call was implemented, it doesn't actually do what it says on the tin. Accoring to the documentation here: https://github.com/raspberrypi/firmware/wiki/Mailbox-property-interface#get-pixel-order https://github.com/raspberrypi/firmware/wiki/Mailbox-property-interface#set-pixel-order 0 means BGR and 1 means RGB. However, in reality it seems that 0 means "do nothing" and 1 means "swap between BGR and RGB". Unfortunately that also means that the call to get the pixel order state also just tells us whether it is swapped or not. For some reason this pixel format issue doesn't seem to affect the Raspberry Pi 5. I'm not sure I fully understand the issue yet. But the following diff seems to yield the desired result, both with the old and the new firmware. So I propose we use this as a workaround until we can figure out what is really going on. ok? Index: sysutils/u-boot/rpi/Makefile =================================================================== RCS file: /cvs/ports/sysutils/u-boot/rpi/Makefile,v diff -u -p -r1.1 Makefile --- sysutils/u-boot/rpi/Makefile 12 Aug 2025 12:24:48 -0000 1.1 +++ sysutils/u-boot/rpi/Makefile 27 Sep 2025 13:52:30 -0000 @@ -1,4 +1,5 @@ VERSION= 2025.07 +REVISION= 0 SOC= rpi Index: sysutils/u-boot/rpi/patches/patch-drivers_video_bcm2835_c =================================================================== RCS file: sysutils/u-boot/rpi/patches/patch-drivers_video_bcm2835_c diff -N sysutils/u-boot/rpi/patches/patch-drivers_video_bcm2835_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ sysutils/u-boot/rpi/patches/patch-drivers_video_bcm2835_c 27 Sep 2025 13:52:30 -0000 @@ -0,0 +1,12 @@ +Index: drivers/video/bcm2835.c +--- drivers/video/bcm2835.c.orig ++++ drivers/video/bcm2835.c +@@ -24,7 +24,7 @@ static int bcm2835_video_probe(struct udevice *dev) + return -EIO; + + debug("bcm2835: Setting up display for %d x %d\n", w, h); +- ret = bcm2835_set_video_params(&w, &h, 32, BCM2835_MBOX_PIXEL_ORDER_RGB, ++ ret = bcm2835_set_video_params(&w, &h, 32, 0, + BCM2835_MBOX_ALPHA_MODE_IGNORED, + &fb_base, &fb_size, &pitch); + if (ret)