Enabling continuous HDMI output on sor0@nvdisplay15220000

Hey,
I modified the device tree to continuously output a HDMI signal via sor0 on nvdidsplay@15220000.

sor {
		compatible = "nvidia,tegra186-sor";
		reg = <0x0 0x15540000 0x0 0x40000>;
		nvidia,sor-ctrlnum = <0x0>;
		nvidia,dpaux = <0x96>;
		nvidia,xbar-ctrl = <0x0 0x1 0x2 0x3 0x4>;
		clocks = <0x10 0x61 0x10 0x27 0x10 0x267 0x10 0x128 0x10 0x20b 0x10 0x10d 0x10 0x88 0x10 0x66 0x10 0x58 0x10 0x62>;
		clock-names = "sor0_ref", "sor_safe", "sor0_pad_clkout", "sor0", "pll_dp", "pllp_out0", "maud", "hda", "hda2codec_2x", "hda2hdmi";
		resets = <0x10 0x27 0x10 0xf 0x10 0x10 0x10 0x11>;
		reset-names = "sor0", "hda_rst", "hda2codec_2x_rst", "hda2hdmi_rst";
		status = "okay";
		nvidia,ddc-i2c-bus = <0x97>;
		nvidia,active-panel = <0x1c7>;
		nvidia,hpd-gpio = <0x1b 0x78 0x1>;
		linux,phandle = <0x94>;
		phandle = <0x94>;

		hdmi-display {
			compatible = "hdmi,display";
			status = "okay";
			generic-infoframe-type = <0x87>;
			linux,phandle = <0x1c7>;
			phandle = <0x1c7>;

			nvidia,edid = [00FFFFFFFFFFFF001E6D085B94490300
                                081C0103803C2278EA3035A7554EA326
                                0F505400000001010101010101010101
                                01010101010108E80030F2705A80B058
                                8A0058542100001E04740030F2705A80
                                B0588A0058542100001A000000FD003B
                                3D82873C000A202020202020000000FC
                                004C4720556C7472612048440A20014D

                                02032F714C10222004030201E1605D5E
                                5F230907076D030C004000B83C200060
                                01020367D85DC401788003E30F800102
                                3A801871382D40582C45005854210000
                                1A565E00A0A0A0295030203500585421
                                00001A00000000000000000000000000
                                00000000000000000000000000000000
                                00000000000000000000000000000006
                                ];

			disp-default-out {
				nvidia,out-type = <0x1>;
				nvidia,out-flags = <0x00>;
				nvidia,out-parent-clk = "plld3";
				nvidia,out-align = <0x0>;
				nvidia,out-order = <0x0>;
				nvidia,out-xres = <0x1000>;
				nvidia,out-yres = <0x870>;
			};
        };
};

To bypass the HDMI hotplug detection, I’ve added an 4k@60Hz monitor EDID. This EDID contains two DTD’s, one for 4k@60Hz and one for 4k@30Hz. In the kernel log one can see that output resource sor0 is mapped to the right display controller head and activated. But the desired 4k@60Hz configuration is rejected and the driver uses the 4k@30Hz configuration. I checked the output of xrandr, fbset und /sys/class/graphics/fb0/mode. The used configuration seems to be activated. Running Jetpack 4.2.2 on TX2 and sor1 and nvdisplay@15210000 are deactivated.

How can you contiously output 4k@60Hz via sor0?

Best
Dennis

Hi Dennis,

This issue sounds common.
Sometimes the mode is filtered by the driver due to violation of some rules in kernel driver.

You could try to

#Add below option in /etc/X11/xorg.conf, ‘Section “Device”’. Verbose mode logging will be shown in /var/log/Xorg.0.log

Section "Device"
...
  Option   "ModeDebug"
...
EndSection

If xorg.0.log does not have a 4k@60 mode, then it indicates mode is filtered out by kernel driver so that userspace does not receive it.
You could then check the “mode_filter” in hdmi2.0.c and dc.c and see why it gets filtered.

Hey WayneWWW,
you were perfetly right - there is no 4k@60 mode available in in /var/log/Xorg.0.log, so the mode must be filtered out by the kernel driver beforehand. I took a look into the hdmi2.0.c and checked the mode filtering function; I am not a professional when it comes to HDMI, so what general settings must a valid EDID contain to persuade the kernel to output 4k@60Hz?

Thanks
Dennis

With the “ModeDebug” the log will tell you about every single mode the GPU sees (the modes the monitor responded with during EDID query). An “accepted” or “rejected” will be noted with every mode. If the mode is rejected, then the issue is different than if the mode is missing. A missing mode means your monitor did not offer to work in that mode.

Among all modes there are some restrictions. No interlaced mode is accepted (rather unlikely on a 4k monitor), and no “extension” modes are accepted. Of modes the monitor reports, only those modes in a predefined EDID mode pool are accepted (I couldn’t tell you what is on that list).

For more details you’d need to attach the Xorg log with the “ModeDebug” enabled. If you hover your mouse over the quote icon in the upper right of one of your existing posts, then a paper clip icon will also show…this icon is for attaching files.

Hi Dennis,

Sorry that I don’t know the rules of how to write a edid. What we could help here is check why the mode is get filtered.

Hey,
my Xorg.0.log is attached. I wonder why the 4k@30 mode is found via “EDID source” and the rejected 4k@60 comes from the XServer. In my EDID blob, the 4k@60 mode is inserted before the 4k@30 DTD.

Thank you
Dennis
xorg.log (204 KB)

[    42.442] (WW) NVIDIA(GPU-0):   Validating Mode "3840x2160_60":
[    42.442] (WW) NVIDIA(GPU-0):     Mode Source: X Server
[    42.442] (WW) NVIDIA(GPU-0):     3840 x 2160 @ 60 Hz
[    42.442] (WW) NVIDIA(GPU-0):       Pixel Clock      : 533.00 MHz
[    42.442] (WW) NVIDIA(GPU-0):       HRes, HSyncStart : 3840, 3888
[    42.442] (WW) NVIDIA(GPU-0):       HSyncEnd, HTotal : 3920, 4000
[    42.442] (WW) NVIDIA(GPU-0):       VRes, VSyncStart : 2160, 2163
[    42.442] (WW) NVIDIA(GPU-0):       VSyncEnd, VTotal : 2168, 2222
[    42.442] (WW) NVIDIA(GPU-0):       H/V Polarity     : +/-
[    42.442] (WW) NVIDIA(GPU-0):     Mode is rejected: Only modes from the NVIDIA X driver's
[    42.442] (WW) NVIDIA(GPU-0):     predefined list and modes from the EDID are allowed
[    42.442] (WW) NVIDIA(GPU-0):     Mode "3840x2160_60" is invalid.

Note that “Only modes from the NVIDIA X driver’s predefined list and modes from the EDID are allowed”. If you’ve specified this mode in a config file, then it isn’t from EDID. Only EDID is allowed, which is a restriction on the embedded systems (you can do this on a desktop PC, but a Jetson will reject it).

Among EDID modes, this is the accepted list:

[    42.509] (II) NVIDIA(GPU-0): --- Modes in ModePool for LG Electronics LG Ultra HD (DFP-0) ---
[    42.509] (II) NVIDIA(GPU-0): "nvidia-auto-select" : 3840 x 2160 @  30.0 Hz  (from: EDID, Detailed)
[    42.509] (II) NVIDIA(GPU-0): "3840x2160"          : 3840 x 2160 @  30.0 Hz  (from: EDID, Detailed)
[    42.509] (II) NVIDIA(GPU-0): "3840x2160_30"       : 3840 x 2160 @  30.0 Hz  (from: EDID, Detailed)
[    42.509] (II) NVIDIA(GPU-0): --- End of ModePool for LG Electronics LG Ultra HD (DFP-0): ---

Hey,
okay, that sounds reasonable. But I did not specify the 4k@60 mode with a pixel clock of 533 Mhz in a config file by myself. I added an 4k@60 mode with a pixel clock of 594 Mhz to my EDID, but that one does not show up in the xorg.log. Why is that one filtered? It does not reach the X-Server mode matching part.

Thanks in advance

Dennis

Did you add this as an extension mode? If so, extension modes are not used. Also, is the EDID checksum valid? Try checking the hex content of EDID at http://www.edidreader.com, look at checksum, and see if the mode you added there is listed as an extension mode.

Hi dehe,

For that case, you need to look into hdmi mode filter in hdmi2.0.c driver and it would tell you why it got filtered.

Hey,
the interesting modes are not placed in an extension block. I attached three screenshots of the parsed EDID, the modes seem to be fine. Another interesting fact is that when I add my EDID to sor1, the kernel accepts the 594 Mhz mode and I can attach a display. While plugging I see no further kernel messages, so the continuous output must be set and validated before plugging.

Thanks
Dennis
edid_0.PNG
edid_2.PNG
edid_1.PNG

Hi dehe,

While plugging I see no further kernel messages, so the continuous output must be set and validated before plugging.

What will happen if you hotplug? Not very sure about your comment here.

Hey,
by plugging I mean the following scenario:

  • Configure sor1 to use static EDID with 594MHz 4k@60 timing descriptor.
  • Boot Jetson.
  • Check dmesg output; head 15220000 is configured properly to use 594Mhz.
  • /sys/class/graphics/fb0/mode offers 3840x2160-60.
  • Plug HDMI cable.
  • NO further kernel message is shown via dmesg.
  • TV shows 4k@60Hz image.

Using the same configuration for sor0:

  • Configure sor0 to use static EDID with 594MHz 4k@60 timing descriptor.
  • Boot Jetson.
  • Check dmesg output; head 15220000 is configured to use 297Mhz.
  • /sys/class/graphics/fb0/mode offers 3840x2160-30.

Hi dehe,

This sounds interesting. Do both sor use the same driver? I mean both of them are either HDMI or DP.

Hey,
they are both configured via device tree as hdmi-display {… status=“okay”;…}, so the hdmi driver should be used. In addition, dp-display contains {… status=“disabled”;…} for each of them.

Dennis

Hi Dennis,

How about checking the kernel driver of HDMI and see why sor0 only has 4k@30 mode?

You could check below functions:
tegra_hdmi_hotplug_notify()
tegra_hdmi_fb_mode_filter()

Hey,
I patched the driver files to be more verbose. Furthermore, I compiled the kernel with the new driver to “Image”. What’s the proper way to deploy only the new kernel with the patched driver?

Dennis

If this is TX2, then you could just transfer this file to device through scp command or ftp.

Then, you could replace the Image under /boot/Image.

Hey,
after deploying the patched kernel we were able to see our additional debug output.
Finally, the 4k@60Hz mode works! The mode was filtered out previously due to a missing hfvsdb block in the edid.

Thanks
Dennis