Skip to main content
Visitor II
November 4, 2025
Solved

Cannot drive a HDMI 800x480 display because of EDID block being all 0

  • November 4, 2025
  • 2 replies
  • 236 views

I am trying to drive a 5 inch 800x480 touch display from waveshare using my STM32MP257F-DK development board. My Linux distro is a custom one built using Buildroot via bootlin support.

When running `modetest -M stm -c`, I don't get any resolutions printed. Here's what I get:

# modetest -M stm -c
opened device `STMicroelectronics SoC DRM` on driver `stm` (version 1.0.0 at 20170330)
[ 244.014209] EDID block 0 is all zeroes
Connectors:
id	encoder	status		name		size (mm)	modes	encoders
32	0	connected	HDMI-A-1 	0x0		0	31
 props:
	1 EDID:
		flags: immutable blob
		blobs:

		value:
	2 DPMS:
		flags: enum
		enums: On=0 Standby=1 Suspend=2 Off=3
		value: 0
	5 link-status:
		flags: enum
		enums: Good=0 Bad=1
		value: 0
	6 non-desktop:
		flags: immutable range
		values: 0 1
		value: 0
	4 TILE:
		flags: immutable blob
		blobs:

		value:
	33 dithering:
		flags: enum
		enums: Off=0 On=1
		value: 0

Here's what dmesg logs (Increased logging level using: `echo 4 > /sys/module/drm/parameters/debug`):

[ 244.004127] [drm:drm_helper_probe_single_connector_modes] [CONNECTOR:32:HDMI-A-1]
[ 244.014209] EDID block 0 is all zeroes
[ 244.014245] stm32-display 48010000.display-controller: [drm:connector_bad_edid] [CONNECTOR:32:HDMI-A-1] EDID is invalid:
[ 244.014269] 	[00] ZERO 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 244.014274] 	[00] ZERO 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 244.014279] 	[00] ZERO 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 244.014284] 	[00] ZERO 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 244.014289] 	[00] ZERO 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 244.014293] 	[00] ZERO 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 244.014298] 	[00] ZERO 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 244.014303] 	[00] ZERO 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[ 244.019165] [drm:drm_mode_debug_printmodeline] Modeline "640x480": 60 25175 640 656 752 800 480 490 492 525 0x40 0xa
[ 244.019198] [drm:drm_mode_prune_invalid] Not using 640x480 mode: CLOCK_LOW
[ 244.019210] [drm:drm_mode_debug_printmodeline] Modeline "800x600": 56 36000 800 824 896 1024 600 601 603 625 0x40 0x5
[ 244.019230] [drm:drm_mode_prune_invalid] Not using 800x600 mode: CLOCK_LOW
[ 244.019241] [drm:drm_mode_debug_printmodeline] Modeline "800x600": 60 40000 800 840 968 1056 600 601 605 628 0x40 0x5
[ 244.019261] [drm:drm_mode_prune_invalid] Not using 800x600 mode: CLOCK_LOW
[ 244.019272] [drm:drm_mode_debug_printmodeline] Modeline "848x480": 60 33750 848 864 976 1088 480 486 494 517 0x40 0x5
[ 244.019291] [drm:drm_mode_prune_invalid] Not using 848x480 mode: CLOCK_LOW
[ 244.019302] [drm:drm_mode_debug_printmodeline] Modeline "1024x768": 60 65000 1024 1048 1184 1344 768 771 777 806 0x40 0xa
[ 244.019322] [drm:drm_mode_prune_invalid] Not using 1024x768 mode: CLOCK_HIGH

 I think it is relevant to mention that running `modetest -M nouveau -c` on my laptop with the display 5 inch display connected over HDMI, I do infact get supported modes & EDID does exist:

root@plasma:~# modetest -M nouveau -c
opened device `nVidia Riva/TNT/GeForce/Quadro/Tesla/Tegra K1+` on driver `nouveau` (version 1.4.0 at 0)
Connectors:
id	encoder	status		name		size (mm)	modes	encoders
42	43	connected	HDMI-A-1 	470x260		24	43
 modes:
	index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot
 #0 800x480 60.00 800 844 932 1056 480 483 489 535 33900 flags: phsync, pvsync; type: preferred, driver
 #1 1920x1080 60.00 1920 2008 2052 2200 1080 1084 1089 1125 148500 flags: phsync, pvsync; type: driver
 #2 1920x1080 59.94 1920 2008 2052 2200 1080 1084 1089 1125 148352 flags: phsync, pvsync; type: driver
 #3 1920x1080 50.00 1920 2448 2492 2640 1080 1084 1089 1125 148500 flags: phsync, pvsync; type: driver
 #4 1280x1024 75.02 1280 1296 1440 1688 1024 1025 1028 1066 135000 flags: phsync, pvsync; type: driver
 #5 1280x720 60.00 1280 1390 1430 1650 720 725 730 750 74250 flags: phsync, pvsync; type: driver
 #6 1280x720 59.94 1280 1390 1430 1650 720 725 730 750 74176 flags: phsync, pvsync; type: driver
 #7 1280x720 50.00 1280 1720 1760 1980 720 725 730 750 74250 flags: phsync, pvsync; type: driver
 #8 1024x768 75.03 1024 1040 1136 1312 768 769 772 800 78750 flags: phsync, pvsync; type: driver
 #9 1024x768 70.07 1024 1048 1184 1328 768 771 777 806 75000 flags: nhsync, nvsync; type: driver
 #10 1024x768 60.00 1024 1048 1184 1344 768 771 777 806 65000 flags: nhsync, nvsync; type: driver
 #11 832x624 74.55 832 864 928 1152 624 625 628 667 57284 flags: nhsync, nvsync; type: driver
 #12 800x600 75.00 800 816 896 1056 600 601 604 625 49500 flags: phsync, pvsync; type: driver
 #13 800x600 72.19 800 856 976 1040 600 637 643 666 50000 flags: phsync, pvsync; type: driver
 #14 800x600 60.32 800 840 968 1056 600 601 605 628 40000 flags: phsync, pvsync; type: driver
 #15 800x600 56.25 800 824 896 1024 600 601 603 625 36000 flags: phsync, pvsync; type: driver
 #16 720x576 50.00 720 732 796 864 576 581 586 625 27000 flags: nhsync, nvsync; type: driver
 #17 720x480 60.00 720 736 798 858 480 489 495 525 27027 flags: nhsync, nvsync; type: driver
 #18 720x480 59.94 720 736 798 858 480 489 495 525 27000 flags: nhsync, nvsync; type: driver
 #19 640x480 75.00 640 656 720 840 480 481 484 500 31500 flags: nhsync, nvsync; type: driver
 #20 640x480 72.81 640 664 704 832 480 489 492 520 31500 flags: nhsync, nvsync; type: driver
 #21 640x480 60.00 640 656 752 800 480 490 492 525 25200 flags: nhsync, nvsync; type: driver
 #22 640x480 59.94 640 656 752 800 480 490 492 525 25175 flags: nhsync, nvsync; type: driver
 #23 720x400 70.08 720 738 846 900 400 412 414 449 28320 flags: nhsync, pvsync; type: driver
 props:
	1 EDID:
		flags: immutable blob
		blobs:

		value:
			00ffffffffffff0012e50021502d3101
			1c130103812f1a782e3585a656489a24
			125054afef0001010101010101010101
			0101010101013e0d200031e037102c58
			3600dc0c1100001e000000ff00300a0a
			0a0a0a0a0a0a0a0a0a0a000000fd0038
			4b1e5315000a202020202020000000fc
			0048444d490a0a0a0a0a0a0a0a0a01f8
			020321714e0607020315961112130414
			051f90230907078301000065030c0010
			008c0ad090204031200c405500b98821
			000018011d8018711c1620582c2500b9
			882100009e011d80d0721c1620102c25
			80b9882100009e011d00bc52d01e20b8
			285540b9882100001e023a80d072382d
			40102c4580b9882100001e00000000d0
	2 DPMS:
		flags: enum
		enums: On=0 Standby=1 Suspend=2 Off=3
		value: 0
	5 link-status:
		flags: enum
		enums: Good=0 Bad=1
		value: 0
	6 non-desktop:
		flags: immutable range
		values: 0 1
		value: 0
	4 TILE:
		flags: immutable blob
		blobs:

		value:
	37 underscan:
		flags: enum
		enums: auto=2 off=0 on=1
		value: 0
	38 underscan hborder:
		flags: range
		values: 0 128
		value: 0
	39 underscan vborder:
		flags: range
		values: 0 128
		value: 0
	40 vibrant hue:
		flags: range
		values: 0 180
		value: 90
	41 color vibrance:
		flags: range
		values: 0 200
		value: 150
	32 scaling mode:
		flags: enum
		enums: None=0 Full=1 Center=2 Full aspect=3
		value: 0
	35 dithering mode:
		flags: enum
		enums: auto=34 off=0 static 2x2=25 dynamic 2x2=17 temporal=33
		value: 34
	36 dithering depth:
		flags: enum
		enums: auto=3 6 bpc=0 8 bpc=2
		value: 3

I also did try OpenSTLinux (FLASH-stm32mp2-openstlinux-6.6-yocto-scarthgap-mpu-v25.06.11.tar.gz) and got no output either.

I also tried to convert the EDID hex (That I got when I probed the display from my laptop) to binary & Then override the kernel to use that EDID instead of probing the display by setting the following bootargs for the kernel:

drm.edid_firmware=edid/800x480.bin drm_kms_helper.edid_firmware=edid/800x480.bin

in "buildroot-external-st/board/stmicroelectronics/stm32mp2/overlay/boot/extlinux/extlinux.conf" file, And I was able to verify that the bootargs did pass successfully, Yet somehow still the logs mentioned EDID being all 0.

    This topic has been closed for replies.
    Best answer by aditya_m

    I was able to fix the solution by building the kernel with the following option:

    CONFIG_DRM_LOAD_EDID_FIRMWARE=y

    This then enables me to override the EDID by passing the appropriate bootargs. In my case I'm just passing both:

    drm.edid_firmware=edid/800x480.bin drm_kms_helper.edid_firmware=edid/800x480.bin

    As per the latest documentations, "drm_kms_helper.edid_firmware" is the correct way. But if anyone is reading this in future, You should checkout https://www.kernel.org/doc/html/v4.14/admin-guide/kernel-parameters.html To know the appropriate options.

    2 replies

    aditya_mAuthor
    Visitor II
    November 4, 2025

    I was able to solve the problem with a hack after reading https://wiki.archlinux.org/title/Kernel_mode_setting#Forcing_modes_and_EDID

    Basically I mounted debugfs & Then override the EDID using the following commands:

    mount -t debugfs none /sys/kernel/debug
    cat /lib/firmware/edid/800x480.bin > /sys/kernel/debug/dri/0/HDMI-A-1/edid_override

    And after this, `modetest` listed the available modes & I was able to print the test pattern. Here's a simple script I wrote to automate this on boot & I named it such that it ran before Xorg as that interferes with this.

    #!/bin/sh
    
    set -eu
    
    # https://unix.stackexchange.com/a/377438
    mount -t debugfs none /sys/kernel/debug
    
    # https://wiki.archlinux.org/title/Kernel_mode_setting#Forcing_modes_and_EDID
    cat /lib/firmware/edid/800x480.bin > /sys/kernel/debug/dri/0/HDMI-A-1/edid_override
    
    # Run modetest for 3 seconds.
    # Skipping this step did not work for me,
    # Hence I have to run this atleast once.
    modetest -M stm -s '32:#0' & MODETEST_PID=$!
    sleep 3s
    kill -9 $MODETEST_PID

    But why do I have to do this to begin with?

    aditya_mAuthorAnswer
    Visitor II
    November 7, 2025

    I was able to fix the solution by building the kernel with the following option:

    CONFIG_DRM_LOAD_EDID_FIRMWARE=y

    This then enables me to override the EDID by passing the appropriate bootargs. In my case I'm just passing both:

    drm.edid_firmware=edid/800x480.bin drm_kms_helper.edid_firmware=edid/800x480.bin

    As per the latest documentations, "drm_kms_helper.edid_firmware" is the correct way. But if anyone is reading this in future, You should checkout https://www.kernel.org/doc/html/v4.14/admin-guide/kernel-parameters.html To know the appropriate options.