Using the original pi 7" dsi display on IoT

Hey,

is anyone using the original Pi 7" DSI screen with Fedora IoT?

We tried to adjust the config.txt as well as the kernel args (lifting the vc4 blacklist, blacklisting simpledrm, pre-loading vc4), but in the end it comes down to:

Mar 13 00:00:42 localhost.localdomain cage[810]: 00:00:00.062 [INFO] [backend/drm/backend.c:225] Initializing DRM backend for /dev/dri/card0 (simpledrm)

simpledrm managing a device where we would expect vc4.

The overlays are there, the vc4 module gets loaded. But somehow we can’t seem to get the gpu bound to the driver. Any ideas?

Hi Peter,

As you mentioned, Fedora IoT ships with modprobe.blacklist=vc4 on the kernel command line, which prevents the VC4 GPU driver from loading. With VC4 blocked, simpledrm is the
only DRM driver available and why you see it as card0.

Remove the blacklist:

sudo rpm-ostree kargs --delete=modprobe.blacklist=vc4
sudo systemctl reboot

After reboot, confirm it’s gone:

cat /proc/cmdline

Check which card is the VC4 GPU:

ls -l /dev/dri/by-path/

The VC4 GPU will show as platform-soc:gpu-card. If it’s not on card0, you’ll need to point your compositor at the correct device. For cage, sway, and other wlroots-based compositors, set the WLR_DRM_DEVICES environment variable:

WLR_DRM_DEVICES=/dev/dri/cardN

where cardN matches the platform-soc:gpu-card symlink.

Thanks for your comment.

Maybe this got lost in my first post. I already removed it. But I still only get a framebuffer device.

$ cat /proc/cmdline
BOOT_IMAGE=(hd0,msdos2)/ostree/fedora-iot-bf0859008d8b3a53d97ce784530c2e99cab3f7053732e8a1fb9e671731a9e2fe/vmlinuz-6.19.10-300.fc44.aarch64 rw coreos.no_persist_ip ignition.platform.id=metal root=LABEL=root ostree=/ostree/boot.0/fedora-iot/bf0859008d8b3a53d97ce784530c2e99cab3f7053732e8a1fb9e671731a9e2fe/0

[core@localhost ~]$ ls -l /dev/dri/by-path/
total 0
lrwxrwxrwx. 1 root root 8 Mar 13 00:00 platform-3ee82000.framebuffer-card -> ../card0

[core@localhost ~]$ lsmod|grep vc4
vc4                   454656  0
drm_exec               12288  1 vc4
snd_soc_core          409600  2 vc4,snd_soc_hdmi_codec
drm_display_helper    294912  1 vc4
drm_dma_helper         24576  1 vc4

journalctl tells me

Mar 13 00:00:02 localhost kernel: [drm] Initialized simpledrm 1.0.0 for 3ee82000.framebuffer on minor 0
Mar 13 00:00:02 localhost kernel: simple-framebuffer 3ee82000.framebuffer: [drm] fb0: simpledrmdrmfb frame buffer device

On a raspberry card0 is HDMI and DSI should be card1, no?

If I remove both display_auto_detect=1 and dtoverlay=vc4-kms-dsi-7inch from config.txt, I get a dri device, but it only has HDMI and Composite. Not DSI.

arm_64bit=1
kernel=rpi-u-boot.bin
arm_boost=1
enable_uart=1
dtparam=audio=on
camera_auto_detect=0
# Stop the RPi turning on HDMI monitors on reboot
hdmi_ignore_cec_init=1
dtparam=i2c_arm=on

# Raspberry Pi 3 series
[pi3]
gpu_mem=16
dtoverlay=upstream
dtoverlay=vc4-kms-v3d,cma-64
max_framebuffers=2

# reset filters, apply to all
[all]

If I add dtoverlay=vc4-kms-dsi-7inch, I only get the card0 as simpleframebuffer device.

Is the overlay just broken?

I ran dtc -s -I fs -O dts /proc/device-tree on both a working raspios with display working and a current fedora iot 44. i then diffed the result and it came out:

$ diff -u /tmp/fedora-focus.txt /tmp/rpios-focus.txt
--- /tmp/fedora-focus.txt       2026-06-01 02:46:12.735447646 +0200
+++ /tmp/rpios-focus.txt        2026-06-01 02:46:12.727447646 +0200
@@ -1,27 +1,38 @@
-117:           dsi0 = "/soc/dsi@7e209000";
-118:           dsi1 = "/soc/dsi@7e700000";
-139:           i2c0 = "/soc/i2c0mux/i2c@0";
-144:           i2c0if = "/soc/i2c@7e205000";
-146:           i2c1 = "/soc/i2c@7e804000";
-150:           i2c2 = "/soc/i2c@7e805000";
-151:           i2c_arm = "/soc/i2c@7e804000";
-152:           i2c_csi_dsi = "/soc/i2c0mux/i2c@1";
-153:           i2c_csi_dsi0 = "/soc/i2c0mux/i2c@0";
-155:           i2c_vc = "/soc/i2c0mux/i2c@0";
-252:           i2c = "/soc/i2c@7e804000";
-253:           i2c0 = "/soc/i2c0mux/i2c@0";
-254:           i2c1 = "/soc/i2c@7e804000";
-255:           i2c10 = "/soc/i2c0mux/i2c@1";
-256:           i2c2 = "/soc/i2c@7e805000";
-628:           dsi@7e209000 {
-633:                   clock-output-names = "dsi0_byte", "dsi0_ddr2", "dsi0_ddr";
-635:                   compatible = "brcm,bcm2835-dsi0";
-643:           dsi@7e700000 {
-648:                   clock-output-names = "dsi1_byte", "dsi1_ddr2", "dsi1_ddr";
-650:                   compatible = "brcm,bcm2835-dsi1";
-1158:                  pinctrl-names = "i2c0", "i2c_csi_dsi";
-1161:                  i2c@0 {
-1168:                  i2c@1 {
-1176:          i2c@7e205000 {
-1188:          i2c@7e804000 {
-1202:          i2c@7e805000 {
+30:    reg_bridge@1 {
+101:           i2c@7e804000 {
+756:                   pinctrl-names = "i2c0", "i2c_csi_dsi";
+766:                   i2c@0 {
+773:                   i2c@1 {
+782:                                   compatible = "raspberrypi,7inch-touchscreen-panel-regulator";
+789:                                   touchscreen-inverted-y;
+791:                                   touchscreen-size-x = <0x320>;
+792:                                   compatible = "edt,edt-ft5506";
+793:                                   touchscreen-inverted-x;
+797:                                   touchscreen-size-y = <0x1e0>;
+802:           i2c@7e205000 {
+957:           dsi@7e209000 {
+960:                   clock-output-names = "dsi0_byte", "dsi0_ddr2", "dsi0_ddr";
+966:                   compatible = "brcm,bcm2835-dsi0";
+972:           i2c@7e805000 {
+1148:          dsi@7e700000 {
+1151:                  clock-output-names = "dsi1_byte", "dsi1_ddr2", "dsi1_ddr";
+1157:                  compatible = "brcm,bcm2835-dsi1";
+1170:                  bridge@0 {
+1172:                          compatible = "toshiba,tc358762";
+1292:          i2c1 = "/soc/i2c@7e804000";
+1307:          i2c2 = "/soc/i2c@7e805000";
+1312:          i2c0 = "/soc/i2c0mux/i2c@0";
+1321:          i2c = "/soc/i2c@7e804000";
+1322:          i2c10 = "/soc/i2c0mux/i2c@1";
+1325:  panel_disp@1 {
+1328:          compatible = "raspberrypi,7inch-dsi", "simple-panel";
+1468:          i2c_csi_dsi = "/soc/i2c0mux/i2c@1";
+1474:          dsi1 = "/soc/dsi@7e700000";
+1476:          i2c1 = "/soc/i2c@7e804000";
+1491:          i2c_csi_dsi0 = "/soc/i2c0mux/i2c@0";
+1514:          i2c0if = "/soc/i2c@7e205000";
+1522:          i2c_vc = "/soc/i2c0mux/i2c@0";
+1538:          i2c_arm = "/soc/i2c@7e804000";
+1548:          i2c2 = "/soc/i2c@7e805000";
+1558:          dsi0 = "/soc/dsi@7e209000";
+1565:          i2c0 = "/soc/i2c0mux/i2c@0";

So clearly Fedoara IoT fails to load the complete overlay chain.

$ sudo dmesg | grep -E 'vc4|dsi|tc358|ft5|panel'

[   28.541636] vc4-drm soc:gpu: bound 3f400000.hvs (ops vc4_hvs_ops [vc4])
[   28.555528] rc rc0: vc4-hdmi as /devices/platform/soc/3f902000.hdmi/rc/rc0
[   28.562568] input: vc4-hdmi as /devices/platform/soc/3f902000.hdmi/rc/rc0/input0
[   28.582320] input: vc4-hdmi HDMI Jack as /devices/platform/soc/3f902000.hdmi/sound/card1/input1
[   28.614352] vc4-drm soc:gpu: bound 3f902000.hdmi (ops vc4_hdmi_ops [vc4])
[   28.621719] vc4-drm soc:gpu: bound 3f806000.vec (ops vc4_vec_ops [vc4])
[   28.628437] vc4-drm soc:gpu: bound 3f004000.txp (ops vc4_txp_ops [vc4])
[   28.635085] vc4-drm soc:gpu: bound 3f206000.pixelvalve (ops vc4_crtc_ops [vc4])
[   28.642445] vc4-drm soc:gpu: bound 3f207000.pixelvalve (ops vc4_crtc_ops [vc4])
[   28.649832] vc4-drm soc:gpu: bound 3f807000.pixelvalve (ops vc4_crtc_ops [vc4])
[   28.658523] vc4-drm soc:gpu: bound 3fc00000.v3d (ops vc4_v3d_ops [vc4])
[   28.674829] [drm] Initialized vc4 0.0.0 for soc:gpu on minor 1
[   28.727218] vc4-drm soc:gpu: [drm] fb0: vc4drmfb frame buffer device

$ sudo cat /sys/kernel/debug/device_component/soc:gpu

aggregate_device name                                            status
-----------------------------------------------------------------------
soc:gpu                                                           bound

device name                                                      status
-----------------------------------------------------------------------
3f400000.hvs                                                      bound
3f902000.hdmi                                                     bound
3f806000.vec                                                      bound
3f004000.txp                                                      bound
3f206000.pixelvalve                                               bound
3f207000.pixelvalve                                               bound
3f807000.pixelvalve                                               bound
3fc00000.v3d                                                      bound

No DSI in sight. :-/

The .dtbo files from raspios and fedora iot 44 sha1sum to the same hashes, so they are not the problem. Has to to with how fedora builds the device tree.

Probably best at this point to file a bugzilla against the bcm283x-firmware package which contains the device trees (and overlays) for the Pi models.

Note that we stopped blacklisting vc4 by default in Fedora IoT but that was a (very) recent change and I think only applies to new installations (?).