HDMI HELPERS(9)
π hdmi helpers π
okay bestie, welcome to hdmi helpers(9) from the Kernel API Manual β yes, the manual name is folded right in here because that's the vibe. These functions contain an implementation of the HDMI specification in the form of KMS helpers. π
It contains TMDS character rate computation, automatic selection of output formats, infoframes generation, etc. The way that this handles all the little HDMI details? Obsessed, fr fr.
β¨ Infoframes Compliance β¨
Drivers using the helpers will expose the various infoframes generated according to the HDMI specification in debugfs. π«Ά
Compliance can then be tested using edid-decode from the v4l-utils project (https://git.linuxtv.org/v4l-utils.git/). A sample run would look like:
# edid-decode -I /sys/kernel/debug/dri/1/HDMI-A-1/infoframes/audio -I /sys/kernel/debug/dri/1/HDMI-A-1/infoframes/avi -I /sys/kernel/debug/dri/1/HDMI-A-1/infoframes/hdmi -I /sys/kernel/debug/dri/1/HDMI-A-1/infoframes/hdr_drm -I /sys/kernel/debug/dri/1/HDMI-A-1/infoframes/spd /sys/class/drm/card1-HDMI-A-1/edid -c
edid-decode (hex):
00 ff ff ff ff ff ff 00 1e 6d f4 5b 1e ef 06 00
07 20 01 03 80 2f 34 78 ea 24 05 af 4f 42 ab 25
0f 50 54 21 08 00 d1 c0 61 40 45 40 01 01 01 01
01 01 01 01 01 01 98 d0 00 40 a1 40 d4 b0 30 20
3a 00 d1 0b 12 00 00 1a 00 00 00 fd 00 3b 3d 1e
b2 31 00 0a 20 20 20 20 20 20 00 00 00 fc 00 4c
47 20 53 44 51 48 44 0a 20 20 20 20 00 00 00 ff
00 32 30 37 4e 54 52 4c 44 43 34 33 30 0a 01 46
02 03 42 72 23 09 07 07 4d 01 03 04 90 12 13 1f
22 5d 5e 5f 60 61 83 01 00 00 6d 03 0c 00 10 00
b8 3c 20 00 60 01 02 03 67 d8 5d c4 01 78 80 03
e3 0f 00 18 e2 00 6a e3 05 c0 00 e6 06 05 01 52
52 51 11 5d 00 a0 a0 40 29 b0 30 20 3a 00 d1 0b
12 00 00 1a 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c3
----------------
Block 0, Base EDID:
EDID Structure Version & Revision: 1.3
Vendor & Product Identification:
Manufacturer: GSM
Model: 23540
Serial Number: 454430 (0x0006ef1e)
Made in: week 7 of 2022
Basic Display Parameters & Features:
Digital display
Maximum image size: 47 cm x 52 cm
Gamma: 2.20
DPMS levels: Standby Suspend Off
RGB color display
First detailed timing is the preferred timing
Color Characteristics:
Red : 0.6835, 0.3105
Green: 0.2587, 0.6679
Blue : 0.1445, 0.0585
White: 0.3134, 0.3291
Established Timings I & II:
DMT 0x04: 640x480 59.940476 Hz 4:3 31.469 kHz 25.175000 MHz
DMT 0x09: 800x600 60.316541 Hz 4:3 37.879 kHz 40.000000 MHz
DMT 0x10: 1024x768 60.003840 Hz 4:3 48.363 kHz 65.000000 MHz
Standard Timings:
DMT 0x52: 1920x1080 60.000000 Hz 16:9 67.500 kHz 148.500000 MHz
DMT 0x10: 1024x768 60.003840 Hz 4:3 48.363 kHz 65.000000 MHz
DMT 0x09: 800x600 60.316541 Hz 4:3 37.879 kHz 40.000000 MHz
Detailed Timing Descriptors:
DTD 1: 2560x2880 59.966580 Hz 8:9 185.417 kHz 534.000000 MHz (465 mm x 523 mm)
Hfront 48 Hsync 32 Hback 240 Hpol P
Vfront 3 Vsync 10 Vback 199 Vpol N
Display Range Limits:
Monitor ranges (GTF): 59-61 Hz V, 30-178 kHz H, max dotclock 490 MHz
Display Product Name: 'LG SDQHD'
Display Product Serial Number: '207NTRLDC430'
Extension blocks: 1
Checksum: 0x46
----------------
Block 1, CTA-861 Extension Block:
Revision: 3
Basic audio support
Supports YCbCr 4:4:4
Supports YCbCr 4:2:2
Native detailed modes: 2
Audio Data Block:
Linear PCM:
Max channels: 2
Supported sample rates (kHz): 48 44.1 32
Supported sample sizes (bits): 24 20 16
Video Data Block:
VIC 1: 640x480 59.940476 Hz 4:3 31.469 kHz 25.175000 MHz
VIC 3: 720x480 59.940060 Hz 16:9 31.469 kHz 27.000000 MHz
VIC 4: 1280x720 60.000000 Hz 16:9 45.000 kHz 74.250000 MHz
VIC 16: 1920x1080 60.000000 Hz 16:9 67.500 kHz 148.500000 MHz (native)
VIC 18: 720x576 50.000000 Hz 16:9 31.250 kHz 27.000000 MHz
VIC 19: 1280x720 50.000000 Hz 16:9 37.500 kHz 74.250000 MHz
VIC 31: 1920x1080 50.000000 Hz 16:9 56.250 kHz 148.500000 MHz
VIC 34: 1920x1080 30.000000 Hz 16:9 33.750 kHz 74.250000 MHz
VIC 93: 3840x2160 24.000000 Hz 16:9 54.000 kHz 297.000000 MHz
VIC 94: 3840x2160 25.000000 Hz 16:9 56.250 kHz 297.000000 MHz
VIC 95: 3840x2160 30.000000 Hz 16:9 67.500 kHz 297.000000 MHz
VIC 96: 3840x2160 50.000000 Hz 16:9 112.500 kHz 594.000000 MHz
VIC 97: 3840x2160 60.000000 Hz 16:9 135.000 kHz 594.000000 MHz
Speaker Allocation Data Block:
FL/FR - Front Left/Right
Vendor-Specific Data Block (HDMI), OUI 00-0C-03:
Source physical address: 1.0.0.0
Supports_AI
DC_36bit
DC_30bit
DC_Y444
Maximum TMDS clock: 300 MHz
Extended HDMI video details:
HDMI VICs:
HDMI VIC 1: 3840x2160 30.000000 Hz 16:9 67.500 kHz 297.000000 MHz
HDMI VIC 2: 3840x2160 25.000000 Hz 16:9 56.250 kHz 297.000000 MHz
HDMI VIC 3: 3840x2160 24.000000 Hz 16:9 54.000 kHz 297.000000 MHz
Vendor-Specific Data Block (HDMI Forum), OUI C4-5D-D8:
Version: 1
Maximum TMDS Character Rate: 600 MHz
SCDC Present
Supports 12-bits/component Deep Color 4:2:0 Pixel Encoding
Supports 10-bits/component Deep Color 4:2:0 Pixel Encoding
YCbCr 4:2:0 Capability Map Data Block:
VIC 96: 3840x2160 50.000000 Hz 16:9 112.500 kHz 594.000000 MHz
VIC 97: 3840x2160 60.000000 Hz 16:9 135.000 kHz 594.000000 MHz
Video Capability Data Block:
YCbCr quantization: No Data
RGB quantization: Selectable (via AVI Q)
PT scan behavior: Always Underscanned
IT scan behavior: Always Underscanned
CE scan behavior: Always Underscanned
Colorimetry Data Block:
BT2020YCC
BT2020RGB
HDR Static Metadata Data Block:
Electro optical transfer functions:
Traditional gamma - SDR luminance range
SMPTE ST2084
Supported static metadata descriptors:
Static metadata type 1
Desired content max luminance: 82 (295.365 cd/m^2)
Desired content max frame-average luminance: 82 (295.365 cd/m^2)
Desired content min luminance: 81 (0.298 cd/m^2)
Detailed Timing Descriptors:
DTD 2: 2560x2880 29.986961 Hz 8:9 87.592 kHz 238.250000 MHz (465 mm x 523 mm)
Hfront 48 Hsync 32 Hback 80 Hpol P
Vfront 3 Vsync 10 Vback 28 Vpol N
Checksum: 0xc3 Unused space in Extension Block: 43 bytes
----------------
edid-decode 1.29.0-5346
edid-decode SHA: c363e9aa6d70 2025-03-11 11:41:18
Warnings:
Block 1, CTA-861 Extension Block:
IT Video Formats are overscanned by default, but normally this should be underscanned.
Video Data Block: VIC 1 and the first DTD are not identical. Is this intended?
Video Data Block: All VICs are in ascending order, and the first (preferred) VIC <= 4, is that intended?
Video Capability Data Block: Set Selectable YCbCr Quantization to avoid interop issues.
Video Capability Data Block: S_PT is equal to S_IT and S_CE, so should be set to 0 instead.
Colorimetry Data Block: Set the sRGB colorimetry bit to avoid interop issues.
Display Product Serial Number is set, so the Serial Number in the Base EDID should be 0.
EDID:
Base EDID: Some timings are out of range of the Monitor Ranges:
Vertical Freq: 24.000 - 60.317 Hz (Monitor: 59.000 - 61.000 Hz)
Horizontal Freq: 31.250 - 185.416 kHz (Monitor: 30.000 - 178.000 kHz)
Maximum Clock: 594.000 MHz (Monitor: 490.000 MHz)
Failures:
Block 1, CTA-861 Extension Block:
Video Capability Data Block: IT video formats are always underscanned, but bit 7 of Byte 3 of the CTA-861 Extension header is set to overscanned.
EDID:
CTA-861: Native progressive timings are a mix of several resolutions.
EDID conformity: FAIL
================
InfoFrame of '/sys/kernel/debug/dri/1/HDMI-A-1/infoframes/audio' was empty.
================
edid-decode InfoFrame (hex):
82 02 0d 31 12 28 04 00 00 00 00 00 00 00 00 00
00
----------------
HDMI InfoFrame Checksum: 0x31
AVI InfoFrame
Version: 2
Length: 13
Y: Color Component Sample Format: RGB
A: Active Format Information Present: Yes
B: Bar Data Present: Bar Data not present
S: Scan Information: Composed for an underscanned display
C: Colorimetry: No Data
M: Picture Aspect Ratio: 16:9
R: Active Portion Aspect Ratio: 8
ITC: IT Content: No Data
EC: Extended Colorimetry: xvYCC601
Q: RGB Quantization Range: Limited Range
SC: Non-Uniform Picture Scaling: No Known non-uniform scaling
YQ: YCC Quantization Range: Limited Range
CN: IT Content Type: Graphics
PR: Pixel Data Repetition Count: 0
Line Number of End of Top Bar: 0
Line Number of Start of Bottom Bar: 0
Pixel Number of End of Left Bar: 0
Pixel Number of Start of Right Bar: 0
----------------
AVI InfoFrame conformity: PASS
================
edid-decode InfoFrame (hex):
81 01 05 49 03 0c 00 20 01
----------------
HDMI InfoFrame Checksum: 0x49
Vendor-Specific InfoFrame (HDMI), OUI 00-0C-03
Version: 1
Length: 5
HDMI Video Format: HDMI_VIC is present
HDMI VIC 1: 3840x2160 30.000000 Hz 16:9 67.500 kHz 297.000000 MHz
----------------
Vendor-Specific InfoFrame (HDMI), OUI 00-0C-03 conformity: PASS
================
So yeah β the hdr_drm InfoFrame literally came back empty, bestie. Not a single byte. But then the real tea kicks in:
InfoFrame of '/sys/kernel/debug/dri/1/HDMI-A-1/infoframes/hdr_drm' was empty.
================
edid-decode InfoFrame (hex):
83 01 19 93 42 72 6f 61 64 63 6f 6d 56 69 64 65
6f 63 6f 72 65 00 00 00 00 00 00 00 09
----------------
HDMI InfoFrame Checksum: 0x93
Source Product Description InfoFrame
Version: 1
Length: 25
Vendor Name: 'Broadcom'
Product Description: 'Videocore'
Source Information: PC general
----------------
Source Product Description InfoFrame conformity: PASS
Look at that β Vendor Name: 'Broadcom', Product Description: 'Videocore', Source Information: PC general, checksum 0x93, and the whole thing gets a conformity: PASS. Slay. π
π§ͺ Testing π§ͺ
The helpers are unit tested, and you can run them yourself with kunit, like this:
$ ./tools/testing/kunit/kunit.py run --kunitconfig=drivers/gpu/drm/tests drm_atomic_helper_connector_hdmi_*
That wildcard at the end? It's grabbing every single test whose name starts with drm_atomic_helper_connector_hdmi_ β the whole squad. π₯
π SEE ALSO π
- Kernel file
./drivers/gpu/drm/display/drm_hdmi_state_helper.c __drm_atomic_helper_connector_hdmi_state_init(9)drm_atomic_helper_connector_hdmi_check(9)drm_hdmi_connector_mode_valid(9)drm_atomic_helper_connector_hdmi_update_infoframes(9)drm_atomic_helper_connector_hdmi_update_audio_infoframe(9)drm_atomic_helper_connector_hdmi_clear_audio_infoframe(9)drm_atomic_helper_connector_hdmi_hotplug(9)drm_atomic_helper_connector_hdmi_force(9)
That's the whole reading list β go click through them when you're done here, iykyk. π¦
And that's a wrap, bestie! π This one lives in ./drivers/gpu/drm/display, it's dated October 2026, and the page itself is hdmi helpers(9) β go forth and ship those infoframes, ily πβ¨
π¦ where this page comes from
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms