HDMI resolution issue

@WayneWWW

Hi Team,

I am able select only 1280x720 resolution even though HDMI monitor has 4K resolution support in the custom board with Xavier NX/Nano SoM. I have tried with both from GUI and xrandr commands. Did i miss any configuration changes? How to operate HMDI at 4K resolution

Thanks,
Arun

You can add an option to the “/etc/X11/xorg.conf” file, and this will allow you to see the log of what the driver thinks of every mode. In “/etc/X11/xorg.conf”, find the Section "Device", and add this option in the block:

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

Then reboot. Once rebooted, save a copy of “/var/log/Xorg.0.log” (in some cases it might be “Xorg.1.log”. You could rename this with a “.txt” file name extension, and then attach it to one of your posts here. This will tell you exactly which modes can be used.

There are few things to check

  1. There should be no error from kernel driver

Our driver has a mechanism to use hardcoded 720p edid when driver fails to read edid from your moniotr. Thus, have to check the dmesg.

  1. If you already confirmed (1), and driver no error. Then maybe nothing we can help.

Tegra driver has some limitation that it will filter out some modes that are not supported. The configuration @linuxdev mentioned here is the way to enable debug log in xorg.0.log. If even the modes are not shown in xorg.0.log, it means kernel filters it out.

@WayneWWW
@linuxdev

[ 2.316680] tegra-i2c 3190000.i2c: no acknowledge from address 0x30
[ 2.396787] tegra_edid_read_block: remainder is 130 for the last 5 attempts. Assuming bad sink EDID and ignoring. New checksum is 125

EDID read fail error in custom carrier board because it is trying to get EDID data from i2c slave address “0x30”. In case of devkit EDID data is read from i2c slave address “0x50”. Need to check why it is trying to read from “0x30” instead of “0x50”.
Any inputs on this will be helpful.

Thanks,
Arun

You might want to export the device tree source and post it here:
dtc -I fs -O dts -o extracted_dts.txt /proc/device-tree

If you don’t have dtc installed, then “sudo apt-get install device-tree-compiler”. The device tree you export will show various i2c controller and HDMI settings the kernel used as it booted.

Could you directly show us the full dmesg? As I mentioned to other forum users, the full dmesg is the best one.

Hi @WayneWWW

I have attached the complete dmesg logs here. hdmi_resolution_issue_logs.txt (66.9 KB)
Can you please help me in resolving this issue?

Thanks,
Arun

Hi,

Could you share me the content below from your board?

/sys/bus/i2c/devices$ ls

Also, please tell us what dts change has been done for your custom board?

Hi @WayneWWW

  1. /sys/bus/i2c/devices$ ls
    0-001c 1-001a 3-0050 4-0068 i2c-0 i2c-11 i2c-4 i2c-7
    0-006a 1-0030 3-0054 7-0040 i2c-1 i2c-2 i2c-5 i2c-8
    10-0010 3-003a 4-003c 9-0010 i2c-10 i2c-3 i2c-6 i2c-9

  2. The dts change for our board is as follows,

     &head0 {
             status = "okay";
             nvidia,fb-bpp = <32>;
             nvidia,fbmem-size = <265420800>; /* 8K (7680*4320) 32bpp double buffered */
             nvidia,fb-flags = <TEGRA_FB_FLIP_ON_PROBE>;
             win-mask = <0x7>;
             nvidia,fb-win = <0>;
             nvidia,dc-connector = <&sor1>;
             nvidia,dc-flags = <TEGRA_DC_FLAG_ENABLED>;
             avdd_hdmi-supply = <&p3668_spmic_sd0>; /* 1v0 */
             avdd_hdmi_pll-supply = <&p3668_spmic_sd1>; /* 1v8 */
             vdd_hdmi_5v0-supply = <&mstl_neuron_vdd_hdmi_5v0>; /* 5v0 */
     }; 
     &head1 {
             status = "okay";
             nvidia,fb-bpp = <32>;
             nvidia,fbmem-size = <265420800>; /* 8K (7680*4320) 32bpp double buffered */
             nvidia,fb-flags = <TEGRA_FB_FLIP_ON_PROBE>;
             win-mask = <0x38>;
             nvidia,fb-win = <3>;
             nvidia,dc-connector = <&sor0>;
             nvidia,dc-flags = <TEGRA_DC_FLAG_ENABLED>;
             vdd-dp-pwr-supply = <&p3668_spmic_sd0>;
             avdd-dp-pll-supply = <&p3668_spmic_sd1>;
             vdd-edp-sec-mode-supply = <&battery_reg>;
             vdd-dp-pad-supply = <&battery_reg>;
             vdd_hdmi_5v0-supply = <&mstl_neuron_vdd_hdmi_5v0>;
     };
     &sor0 {
             status = "okay";
             nvidia,active-panel = <&sor0_dp_display>;
     };
    
     &sor0_dp_display {
             status = "okay";
             nvidia,is_ext_dp_panel = <1>;
     };
    
     &sor1 {
             status = "okay";
             nvidia,active-panel = <&sor1_hdmi_display>;
     };
    
     &sor1_hdmi_display {
             status = "okay";
             disp-default-out {
                     nvidia,out-flags = <TEGRA_DC_OUT_HOTPLUG_LOW>;
             };
     };
    
     &dpaux0 {
             status = "okay";
     };
    
     &dpaux1 {
             status = "okay";
     };
    
     &tegra_cec {
             status = "okay";
     };
    

Can you help us in debugging this one?

Thanks,
Arun

Do you change anything besides the display nodes here?

Most of your dts here are same as original dts from jetapck. Only the regulator are changed. This should not cause such error.

Hi @WayneWWW

No, I haven’t changed anything apart from this. But still, we face this issue.

Thanks,
Arun

Do you ever change the HDMI monitor here? Will all of them hit this issue?
Also, please make sure you are using pure HDMI monitor but not something go through adapter.

I just checked the driver code to read edid, 0x30 is always there. Thus, the software should be no problem because this even work on NX devkit.

   	struct i2c_msg msg[] = {
  		{
  			.addr = 0x30,
  			.flags = 0,
  			.len = 1,
  			.buf = block_buf,
  		},
  		{
  			.addr = 0x50,
  			.flags = 0,
  			.len = 1,
  			.buf = cmd_buf,
  		},
  		{
  			.addr = 0x50,
  			.flags = I2C_M_RD,
  			.len = EDID_BYTES_PER_BLOCK,
  			.buf = data,

Hi @WayneWWW,

I have tried with multiple monitors and faced the same issue. Every time I used pure HDMI monitor without adapters.

Following are my observations:

  1. If i change 0x30 to 0x50 as follows, HDMI is working with 1080p like devkit.
  	struct i2c_msg msg[] = {
  		{
  			.addr = 0x50,
  			.flags = 0,
  			.len = 1,
  			.buf = block_buf,
  		},
  		{
  			.addr = 0x50,
  			.flags = 0,
  			.len = 1,
  			.buf = cmd_buf,
  		},
  		{
  			.addr = 0x50,
  			.flags = I2C_M_RD,
  			.len = EDID_BYTES_PER_BLOCK,
  			.buf = data,
  1. If I change the clock frequency of the i2c bus from 100kHz to 400kHz, it’s trying to get ack from 0x50 and ack is failing. Board is not supporting other resolutions like 1080p and 4K in this case.

Thanks,
Arun

Hi,

Are you sure there is no hardware design error on your side?

This driver code has been used for years over TX1/TX2/Nano/Xavier and no other users hit this before.

If you replace the carrier board to devkit, will you hit this problem with same monitor?

I mean “flashing it back to jetapck and plug it on NX devkit”.

Hi @WayneWWW

SoM flashed with custom image and devkit image worked in NX devkit. Only in our custom carrier board, this issue is seen.

Thanks,
Arun

If this only happens on custom board, then it highly possible is a design issue. Please compare your design to reference and check the design example in OEM DG, especially on the level shift of DDC and CEC lines.