DSI init command 0x2E replaced by 0x00!

The display settings (nvidia,dsi-init-cmd) did not reach the display properly. Certain settings were modified by the hardware.

What we did see:
A display that was not properly configured.

To check where the problem lay, we checked the init sequence that was transferred over the MIPI DSI to the LCD. When we compared this to the data that should have been sent, we noticed some differences with the data in the packet sequence.

Our packet sequence consisted of:

...
<TEGRA_DSI_PACKET_CMD  DSI_DCS_WRITE_1_PARAM 0x3C 0x72 0x00>,
<TEGRA_DSI_PACKET_CMD  DSI_DCS_WRITE_1_PARAM 0x3D 0xFF 0x00>,
<TEGRA_DSI_PACKET_CMD  DSI_DCS_WRITE_1_PARAM 0x3E 0xFF 0x00>
...
<TEGRA_DSI_PACKET_CMD  DSI_DCS_WRITE_1_PARAM 0x2C 0x09 0x00>,
<TEGRA_DSI_PACKET_CMD  DSI_DCS_WRITE_1_PARAM 0x2D 0x1A 0x00>,
<TEGRA_DSI_PACKET_CMD  DSI_DCS_WRITE_1_PARAM 0x2E 0x0B 0x00>,
...

For sequence commands that contain address 0x2D, 0x2E, 0x3D and 0x3E, the address and the value were replaced by 0x00. Resulting in that on address 0x00 value 0x00 was written in the LCD controller.

We traced this all the way to the tegra_dsi_controller_writel(…) function. In that function, when writel() is called, the value that is written to DSI_WR_DATA register is still valid. When we measure/trace in on the DSI line, the data is changed to 0x00.

We were able to work around this issue by changing the parts in the sequence where these addresses are written to long writes by making use of the auto increment in the LCD controller:

...
<TEGRA_DSI_PACKET_CMD DSI_DCS_LONG_WRITE 0x4 0x0 0x0 0x3C 0x38 0x1D 0x1F 0x0 0x0>,
...
<TEGRA_DSI_PACKET_CMD DSI_DCS_LONG_WRITE 0x4 0x0 0x0 0x2C 0x09 0x1A 0x0B 0x0 0x0>
...

We have it working now, but we still have some open questions:

  1. Is this a known bug in the silicon?
  2. Are only the 0x2D, 0x2E, 0x3D and 0x3E addresses affected by this bug?

Sorry that we don’t have such issue reported. Can you describe more about your panel and how it connect to the DSI pin? Any other configuration for it?

How did you measure that the signal is changed in hardware side?

my tx2 connected to display panel JD9366 with 4 lanes…
In initial stage, host has to send a series of commands through DSI D0P/N lines to display panel, so that panel can work well…
the series of command like this:

<TEGRA_DSI_PACKET_CMD DSI_DCS_WRITE_1_PARAM 0x28 0x33 0x00>,
<TEGRA_DSI_PACKET_CMD DSI_DCS_WRITE_1_PARAM 0x29 0x33 0x00>,
<TEGRA_DSI_PACKET_CMD DSI_DCS_WRITE_1_PARAM 0x2a 0x00 0x00>,
<TEGRA_DSI_PACKET_CMD DSI_DCS_WRITE_1_PARAM 0x2b 0x00 0x00>,
<TEGRA_DSI_PACKET_CMD DSI_DCS_WRITE_1_PARAM 0x2c 0x00 0x00>,
<TEGRA_DSI_PACKET_CMD DSI_DCS_WRITE_1_PARAM 0x2d 0x00 0x00>,
<TEGRA_DSI_PACKET_CMD DSI_DCS_WRITE_1_PARAM 0x2e 0x00 0x00>,
<TEGRA_DSI_PACKET_CMD DSI_DCS_WRITE_1_PARAM 0x2f 0x00 0x00>,
<TEGRA_DSI_PACKET_CMD DSI_DCS_WRITE_1_PARAM 0x30 0x00 0x00>,
<TEGRA_DSI_PACKET_CMD DSI_DCS_WRITE_1_PARAM 0x31 0x00 0x00>,
<TEGRA_DSI_PACKET_CMD DSI_DCS_WRITE_1_PARAM 0x32 0x00 0x00>,
<TEGRA_DSI_PACKET_CMD DSI_DCS_WRITE_1_PARAM 0x33 0x00 0x00>,
<TEGRA_DSI_PACKET_CMD DSI_DCS_WRITE_1_PARAM 0x34 0x00 0x00>,

we use logic analyser to probe singals and save it as csv document, it shows that the command 0x2E was replaced by 0x00


also command 0x3E was replaced by 0x00…
Did anyone report this bug? Does anyone have solution for this?