HDMI doesn't work with specific monitors and/or USB-C adapters

Hi all,

I’m using Jetpack 5.1.3 (Jetson Linux 35.5.0) on a Jetson Xavier NX Developer kit. HDMI output works well for some monitors and USB3 HDMI capture adapters that I use. However, it doesn’t work for some 4K monitors and USB3 HDMI capture adapters very similar to those that work. I’m aware that this is a known issue and have checked Jetson Xavier platform specific configurations — NVIDIA Jetson Linux Developer Guide 1 documentation

My device tree it’s proper configured (with the “disable-seamless = <1>;”, etc) and I also built the kernel from Jetson Linux 35.5.0 to ensure the patch (cited in the link above) was there. But I’m still experiencing the following errors on some devices:

[    7.084054] tegradc 15200000.display: Adding to iommu group 25
[    7.084496] tegradc 15210000.display: Adding to iommu group 25
[    7.093126] tegradc 15200000.display: disp0 connected to head0->sor1
[    7.117741] tegradc 15200000.display: DT parsed successfully
[    7.130143] tegradc 15200000.display: Display dc.000000003c321eb2 registered with id=0
[    7.158109] tegradc 15200000.display: vblank syncpt # 8 for dc 0
[    7.171933] tegradc 15200000.display: vpulse3 syncpt # 9 for dc 0
[    7.202493] tegradc 15200000.display: hdmi: can't get adpater for ddc bus 3
[    7.214801] tegradc 15200000.display: out->type:1 out_ops->init err = -517
[    7.228994] tegradc 15210000.display: disp0 connected to head1->sor
[    7.241779] tegradc 15210000.display: parse_dp_settings: No dp-lt-settings node
[    7.255036] tegradc 15210000.display: DT parsed successfully
[    7.269386] tegradc 15210000.display: dc.1 probe not in device tree order, deferring
[    7.504921] tegradc 15200000.display: disp0 connected to head0->sor1
[    7.520209] tegradc 15200000.display: DT parsed successfully
[    7.533949] tegradc 15200000.display: Display dc.0000000095475685 registered with id=0
[    7.627502] tegradc 15200000.display: vblank syncpt # 11 for dc 0
[    7.633338] tegradc 15200000.display: vpulse3 syncpt # 12 for dc 0
[    7.648455] tegradc 15200000.display: hdmi: invalid prod list prod_list_hdmi_board
[    7.654860] tegradc 15200000.display: hdmi: tegra_hdmi_tmds_range_read(bd) failed
[    7.699111] tegradc 15200000.display: probed
[    7.758056] tegradc 15200000.display: fb registered
[    8.035172] tegradc 15200000.display: dc_poll_register 0x41: timeout
[    8.035357] tegradc 15200000.display: timeout waiting for postcomp init state to promote
[    8.285161] tegradc 15200000.display: dc_poll_register 0x41: timeout
[    8.285313] tegradc 15200000.display: timeout waiting for win assignments to promote
[    8.285473] tegradc 15200000.display: tegra_nvdisp_head_enable, failed head enable
[    8.285799] tegradc 15210000.display: disp1 connected to head1->sor
[    8.285987] tegradc 15210000.display: parse_dp_settings: No dp-lt-settings node
[    8.286282] tegradc 15210000.display: DT parsed successfully
[    8.286444] tegradc 15210000.display: Display dc.00000000ab27bdd2 registered with id=1
[    8.286743] tegradc 15210000.display: vblank syncpt # 17 for dc 1
[    8.286869] tegradc 15210000.display: vpulse3 syncpt # 18 for dc 1
[    8.294027] tegradc 15210000.display: probed
[    8.294487] tegradc 15210000.display: fb registered
[    8.298507] tegradc 15210000.display: blank - powerdown
[    8.426565] tegradc 15200000.display: blank - powerdown
[    8.432774] tegradc 15200000.display: unblank
[    8.675170] tegradc 15200000.display: dc_poll_register 0x41: timeout
[    8.675175] tegradc 15200000.display: dc timeout waiting for DC to stop
[    8.925183] tegradc 15200000.display: dc_poll_register 0x41: timeout
[    8.925189] tegradc 15200000.display: dc timeout waiting for DC to stop
[    9.175206] tegradc 15200000.display: dc_poll_register 0x41: timeout
[    9.175212] tegradc 15200000.display: timeout waiting for postcomp init state to promote
[    9.425162] tegradc 15200000.display: dc_poll_register 0x41: timeout
[    9.425167] tegradc 15200000.display: timeout waiting for win assignments to promote
[    9.425171] tegradc 15200000.display: tegra_nvdisp_head_enable, failed head enable
[    9.425202] tegradc 15200000.display: update windows ret = -14
[    9.425206] tegradc 15200000.display: sync windows ret = -14
[    9.448882] tegradc 15200000.display: hdmi: plugged
[   46.030764] tegradc 15200000.display: blank - powerdown
[   46.030798] tegradc 15200000.display: unblank
[   46.275394] tegradc 15200000.display: dc_poll_register 0x41: timeout
[   46.275400] tegradc 15200000.display: dc timeout waiting for DC to stop
[   46.525233] tegradc 15200000.display: dc_poll_register 0x41: timeout
[   46.525239] tegradc 15200000.display: dc timeout waiting for DC to stop
[   46.775204] tegradc 15200000.display: dc_poll_register 0x41: timeout
[   46.775211] tegradc 15200000.display: timeout waiting for postcomp init state to promote
[   47.025195] tegradc 15200000.display: dc_poll_register 0x41: timeout
[   47.025203] tegradc 15200000.display: timeout waiting for win assignments to promote
[   47.025208] tegradc 15200000.display: tegra_nvdisp_head_enable, failed head enable
[   47.027174] tegradc 15200000.display: unblank
[   47.275204] tegradc 15200000.display: dc_poll_register 0x41: timeout
[   47.275210] tegradc 15200000.display: dc timeout waiting for DC to stop
[   47.525193] tegradc 15200000.display: dc_poll_register 0x41: timeout
[   47.525199] tegradc 15200000.display: dc timeout waiting for DC to stop
[   47.775215] tegradc 15200000.display: dc_poll_register 0x41: timeout
[   47.775223] tegradc 15200000.display: timeout waiting for postcomp init state to promote
[   48.025221] tegradc 15200000.display: dc_poll_register 0x41: timeout
[   48.025229] tegradc 15200000.display: timeout waiting for win assignments to promote
[   48.025234] tegradc 15200000.display: tegra_nvdisp_head_enable, failed head enable
[   48.026748] tegradc 15210000.display: blank - powerdown

I do have HDMI output from the bootloader but once the tegradc driver is initialized it gets lost.

here are the kernel boot parameters:

root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 console=ttyTCU0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0 nospectre_bhb video=efifb:off

*PS1: The behavior is the same if I let the EFI framebuffer enabled. Full logs and the device tree are attached here.
*PS2: I don’t experience these issues with Jetson Linux 35.1

tegra194-p3668-0000-p3509-0000.dtb.gz (55.4 KB)
jetson-hdmi-fail.log (58.1 KB)

Is there anything else to try?

Regards

Use a HDMI hub, it usually helps

Better clarifying whether this is related to that seamless issue or it is something else.

Will you see this kind of error if you only hotplug the monitor after system boots?

If this kind of issue is also there in such case, then it is not related to seamless. Seamless process means monitor is there since boot starts.

Thanks for the reply @WayneWWW , I did some more tests, let me clarify the issue:

Test 1:
Boot the board connected to a monitor/HDMI capture device that I experience the issue:

  • HDMI is initialized by bootloader, I can see EFI logo, menus, etc
  • Linux starts to boot, display is lost when tegradc driver initializes (I mean, when I see those error messages in the serial console)
  • After the whole initialization, If I unplug the cable and connect it to a monitor that I don’t experience the issue, it also doesn’t work

Test 2:
Boot the board connected to a monitor/HDMI capture device that I don’t experience the issue:

  • HDMI is initialized by bootloader, I can see EFI logo, menus, etc
  • Linux starts to boot, tegradc driver initializes and everything works, I can see text console normally
  • After the whole initialization, if I disconnect the cable and connect it to a monitor/HDMI device that I had the issue, it works, display is shown normally…

Regards

Sounds the issue is not related to seamless display.

Could you also test the hotplug case without connected since boot?

I mean you just boot the device without connected anything. After the board boots up (if you don’t know whether it boots or not, wait it for 3 mins), hotplug the device.

@WayneWWW , I tested as you suggested and the problem doesn’t happen. So basically I did the following:

  • Boot the board without any HDMI cable connected
  • Wait for the whole boot
  • Connect the HDMI cable

The problem doesn’t happen in this case, display works even in the “problematic” HDMI capture device and 4k monitor that I’m testing…

Any clues or workaround on that?

Regards

Did you apply this patch as well?

https://docs.nvidia.com/jetson/archives/r35.5.0/DeveloperGuide/SD/Kernel/DisplayConfigurationAndBringUp/XavierDisplayconfig.html?highlight=seamless#seamless-display-limitation-for-dp-alt-mode-dp-over-usb-c

Set the display power domains to always-on with the following patch:

Yes, it’s applied.

Could you make one more test to totally disable the boot logo and see if you would still hit this issue?

set bootloader-status= “disabled” in the display node of device tree and must do full flash.

Yes, I can do it, but it’s not clear to me, in order to fully disable the boot logo I will need to recompile the EDKII, right?

In my case I have the bootloader flashed to the QSPI memory. I changed the kernel device tree like the following (added the bootloader-status disabled to head0):

diff --git a/hardware/nvidia/soc/t19x/kernel-dts/tegra194-soc/tegra194-soc-base.dtsi b/hardware/nvidia/soc/t19x/kernel-dts/tegra194-soc/tegra194-soc-base.dtsi
index 249f3a6ce0a0..b020e4400a19 100644
--- a/hardware/nvidia/soc/t19x/kernel-dts/tegra194-soc/tegra194-soc-base.dtsi
+++ b/hardware/nvidia/soc/t19x/kernel-dts/tegra194-soc/tegra194-soc-base.dtsi
@@ -654,6 +654,7 @@
 
                        head0: display@15200000 {
                                status = "disabled";
+                               bootloader-status = "disabled";
                                compatible = "nvidia,tegra194-dc";
                                reg = <0x0 0x15200000 0x0 0x10000>;
                                interrupts = <0 153 4>;

Rebuilt kernel + device tree and booted from the board, but it didn’t help, unfortunately. Please, let me know if that was the test that you were looking for…

You don’t need to modify EDK2.

When I said “full flash”, it means you have to put your new dtb file to your host PC Linux_for_Tegra/kernel/dtb and run flash command again.

During the flash process, UEFI will pick the device tree from that path and use it for its own too.

@WayneWWW , I did the test as you suggested:

  1. Changed the device tree (added bootloader-status = “disabled”;) to:
  • Linux_for_Tegra/kernel/dtb/tegra194-p3668-all-p3509-0000.dtb
  • Linux_for_Tegra/kernel/dtb/tegra194-p3668-0000-p3509-0000.dtb
  1. Booted the board and confirmed the HDMI display output is not initialized by the bootloader

  2. Booted the board with the “problematic” HDMI devices. The tegradc driver is initialized during the Linux boot process and the display works flawlessly.

  3. Booted the board with the known working devices, display also works without problems.

I don’t want to disable the display during the boot process, is there any workaround that could be tried?

Regards

Currently all the workaround seems applied. If this cannot work even with them, then I can only suggest you to disable boot logo for now.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.