iMX8MM and panel driver Himax8279D: imx_sec_dsim_drv: wait pkthdr tx done time out

Hello,

I want to connect the display SL101PM1794FOG-V15 (1920x1200) to the MIPI-DSI of a Verdin iMX8MM that runs with BSP6.0. This panel has the HX8279D as drive IC.

Therefore I activated the related driver in the kernel ( CONFIG_DRM_PANEL_BOE_HIMAX8279D) and made the following device tree overlay:

/dts-v1/;
/plugin/;

#include <dt-bindings/gpio/gpio.h>
#include "imx8mm-pinfunc.h"

/ {
	compatible = "toradex,verdin-imx8mm";
};

&backlight {
	enable-gpios = <&gpio3 3 GPIO_ACTIVE_HIGH>;	// Verdin GPIO_10_DSI (SODIMM 21)
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_gpio_10_dsi>;

	status = "okay";
};

&gpu {
	status = "okay";
};

&lcdif {
	status = "okay";
};

&mipi_dsi {
	#address-cells = <1>;
	#size-cells = <0>;
	status = "okay";

	port@1 {
		mipi_dsi_panel1_out: endpoint {
			remote-endpoint = <&panel1_in>;
		};
	};

	panel@0 {
		compatible = "boe,himax8279d8p", "boe,himax8279d10p";
		reg = <0>;
		
		backlight = <&backlight>;

		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_panel_gpios>;
		enable-gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>;	// I2S_2_BCLK (SODIMM 42)
		pp18-gpios = <&gpio3 22 GPIO_ACTIVE_HIGH>;		// I2S_2_SYNC (SODIMM 44)
		pp33-gpios = <&gpio3 24 GPIO_ACTIVE_HIGH>;		// I2S_2_D_OUT (SODIMM 46)

		// Alternatives Panel-Timing
		panel-timing {
			// 1920x1200p60
			clock-frequency = <159400000>;	// Panel clock/Pixel rate [Hz]

			hactive = <1200>;				// Horizontal panel resolution [px]
			hback-porch = <32 60 60>;		// Horizontal back porch timing
			hfront-porch = <42 80 81>;		// Horizontal front porch panel timing
			hsync-len = <1>;				// Horizontal sync length panel timing

			vactive = <1920>;				// Vertical panel resolution [px]
			vback-porch = <25>;				// Vertical back porch panel timing
			vfront-porch = <35 35 36>;		// Vertical front porch panel timing
			vsync-len = <1>;				// Vertical sync length panel timing

			//hsync-active = <1>;				// Horizontal sync pulse (0 selects active low, 1 selects active high) 	- If omitted then it is not used by the hardware
			//vsync-active = <1>;				// Vertical sync pulse (0 selects active low, 1 selects active high) 	- If omitted then it is not used by the hardware
			//de-active = <1>;				// Data enable (0 selects active low, 1 selects active high) 			- If omitted then it is not used by the hardware
			//pixelclk-active = <1>;			// Data driving on rising or falling edge
											//	0 to drive pixel data on falling edge and sample data on rising edge
											//	1 to drive pixel data on rising edge and sample data on falling edge
		};

		port {
        	panel1_in: endpoint {
				remote-endpoint = <&mipi_dsi_panel1_out>;
			};
		};
	};
};

&iomuxc {
	pinctrl_panel_gpios: panelgpiosgrp {
		fsl,pins = <
			MX8MM_IOMUXC_SAI5_RXD2_GPIO3_IO23		0x146	/* SODIMM 42 - reset of display (pulled-up as active-low) */
			MX8MM_IOMUXC_SAI5_RXD1_GPIO3_IO22		0x106	/* SODIMM 44 - enable of 1P8 (pulled-down as active-high) */
			MX8MM_IOMUXC_SAI5_RXD3_GPIO3_IO24		0x106	/* SODIMM 46 - enable of 3P3 (pulled-down as active-high) */
		>;
	};
};

During boot the software driver tries to send the startup commands to the panel driver (line 160 of drivers/gpu/drm/panel/panel-boe-himax8279d.c), but get a -EBUSY because of a tx timeout in line 719 of drivers/gpu/drm/bridge/sec-dsim.c:

[    8.152313] imx_sec_dsim_drv 32e10000.mipi_dsi: wait pkthdr tx done time out
[    8.152335] panel-boe-himax8279d 32e10000.mipi_dsi.0: failed to send DCS Init Code: -16
[    8.152347] imx_sec_dsim_drv 32e10000.mipi_dsi: panel prepare failed: -16

The output of dmesg: dmesg.log (39.4 KB)

I found this thread where it is pointed out that the use of mipi_dsi_dcs_write_buffer()instead of mipi_dsi_generic_write() in the prepare function can be the cause. I patched the driver source file with

diff --git a/drivers/gpu/drm/panel/panel-boe-himax8279d.c b/drivers/gpu/drm/panel/panel-boe-himax8279d.c
index 42854bd37fd5..abb96e548349 100644
--- a/drivers/gpu/drm/panel/panel-boe-himax8279d.c
+++ b/drivers/gpu/drm/panel/panel-boe-himax8279d.c
@@ -72,7 +72,7 @@ static int send_mipi_cmds(struct drm_panel *panel, const struct panel_cmd *cmds)
 	int err;
 
 	for (i = 0; i < pinfo->desc->on_cmds_num; i++) {
-		err = mipi_dsi_dcs_write_buffer(pinfo->link, &cmds[i],
+		err = mipi_dsi_generic_write(pinfo->link, &cmds[i],
 						sizeof(struct panel_cmd));
 
 		if (err < 0)

but I get the same error.
Can someone please give me an advice how to solve this problem?

Best regards,
Markus