MIPI DSI display on i.MX8M Plus (1200x1920@60.0, 167.1 MHz)

Hello!

I’m using a UMOH-9866MD-T MIPI DSI panel on a Toradex Verdin i.MX8MP with custom timings (1200×1920 @ ~60 Hz, 168 MHz pixel clock, 4 lanes, RGB888). The display manufacturer’s datasheet specifies PCLK = 168 MHz (HTOTAL 1311, VTOTAL 2124). In the overlay, we override VIDEO_PLL1 to 1008000000 Hz and MEDIA_DISP1_PIX to 168000000 Hz via media_blk_ctrl, assigning clocks/rates/parents. But clk_summary shows:

video_pll1_out = 650000000 Hz
media_disp1_pix / lcdif_pixel_clk = 162500000 Hz (~ 650M / 4)

The DSI PHY reference clock is also stuck at 12 MHz despite attempts to force it to 24/25 MHz. Panel remains blank. DRM probe succeeds, atomic commit runs, but vblank times out quickly.

Without these adjustments, of course, the display remained black. Same as now.

Is there a known limitation or required kernel patch for the exact 168 MHz pixel clock on i.MX8MP MIPI DSI? Any recommended PLL multiplier/divider or DTS pattern to force 168 MHz pixel + 24/25 MHz PHY, or the direction to diagnose this?

Happy to share full overlay, clk_summary, dmesg (with drm.debug=0x1f), and driver code.
Thanks in advance for any guidance!

Driver parameters:

#define UMOH9866MD_HACTIVE 1200
#define UMOH9866MD_HSYNC 10
#define UMOH9866MD_HFP 83
#define UMOH9866MD_HBP 18

#define UMOH9866MD_VACTIVE 1920
#define UMOH9866MD_VSYNC 4
#define UMOH9866MD_VFP 168
#define UMOH9866MD_VBP 32

#define UMOH9866MD_REFRESH_HZ 60

#define UMOH9866MD_HTOTAL                                         \
	(UMOH9866MD_HACTIVE + UMOH9866MD_HFP + UMOH9866MD_HSYNC + \
	 UMOH9866MD_HBP)
#define UMOH9866MD_VTOTAL                                         \
	(UMOH9866MD_VACTIVE + UMOH9866MD_VFP + UMOH9866MD_VSYNC + \
	 UMOH9866MD_VBP)

#define UMOH9866MD_PCLK_HZ                       \
	((unsigned long long)UMOH9866MD_HTOTAL * \
	 (unsigned long long)UMOH9866MD_VTOTAL * \
	 (unsigned long long)UMOH9866MD_REFRESH_HZ)

#define UMOH9866MD_PCLK_KHZ (UMOH9866MD_PCLK_HZ / 1000ULL)

#define UMOH9866MD_WIDTH_MM 95
#define UMOH9866MD_HEIGHT_MM 152

#define UMOH9866MD_MODE_FLAGS \
	(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE | MIPI_DSI_MODE_VIDEO_HSE)

static const struct drm_display_mode umoh9866md_default_mode = {
	.hdisplay = UMOH9866MD_HACTIVE,
	.hsync_start = UMOH9866MD_HACTIVE + UMOH9866MD_HFP,
	.hsync_end = UMOH9866MD_HACTIVE + UMOH9866MD_HFP + UMOH9866MD_HSYNC,
	.htotal = UMOH9866MD_HACTIVE + UMOH9866MD_HFP + UMOH9866MD_HSYNC +
		  UMOH9866MD_HBP,

	.vdisplay = UMOH9866MD_VACTIVE,
	.vsync_start = UMOH9866MD_VACTIVE + UMOH9866MD_VFP,
	.vsync_end = UMOH9866MD_VACTIVE + UMOH9866MD_VFP + UMOH9866MD_VSYNC,
	.vtotal = UMOH9866MD_VACTIVE + UMOH9866MD_VFP + UMOH9866MD_VSYNC +
		  UMOH9866MD_VBP,

	.clock = (int)UMOH9866MD_PCLK_KHZ, /* kHz */
	.flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,

	.width_mm = UMOH9866MD_WIDTH_MM,
	.height_mm = UMOH9866MD_HEIGHT_MM,
};

Overlay segment:


// i.MX 8 MIPI DSI
&mipi_dsi {
	status = "okay";

	panel@0 {
		status = "okay";
		compatible = "urt,umoh-9866md-t";
		reg = <0>;

		backlight = <&backlight>;
		reset-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;

		port {
			umoh_9866md_t_in: endpoint {
				remote-endpoint = <&umoh_9866md_t_out>;
			};
		};
	};

	port@1 {
		reg = <1>;

		umoh_9866md_t_out: endpoint {
			remote-endpoint = <&umoh_9866md_t_in>;
			data-lanes = <4>;
		};
	};
};

&media_blk_ctrl {
	status = "okay";

	assigned-clocks = <&clk IMX8MP_CLK_MEDIA_AXI>, 
	<&clk IMX8MP_CLK_MEDIA_APB>, 
	<&clk IMX8MP_CLK_MEDIA_DISP1_PIX>, 
	<&clk IMX8MP_CLK_MEDIA_DISP2_PIX>, 
	<&clk IMX8MP_CLK_MEDIA_ISP>, 
	<&clk IMX8MP_VIDEO_PLL1>, 
	<&clk IMX8MP_CLK_MEDIA_MIPI_PHY1_REF>;
	
	assigned-clock-rates = <500000000>, 
	<200000000>, 
	<168000000>, 
	<0>, 
	<500000000>, 
	<1008000000>, 
	<25000000>;
	
	assigned-clock-parents = <&clk IMX8MP_SYS_PLL2_1000M>, 
	<&clk IMX8MP_SYS_PLL1_800M>, 
	<&clk IMX8MP_VIDEO_PLL1_OUT>, 
	<&clk IMX8MP_VIDEO_PLL1_OUT>, 
	<&clk IMX8MP_SYS_PLL2_500M>, 
	<&clk IMX8MP_CLK_24M>, 
	<&clk IMX8MP_CLK_24M>;
};

&lcdif1 {
	status = "okay";
};

Hi, I’m the Toradex AI Assistant.

I might make mistakes or occasionally get you wrong. Our support team will step in if needed.


I’d be glad to help! Could you let me know which OS and version you are using?

To provide the most accurate guidance for your MIPI DSI clock configuration on the Verdin iMX8M Plus, I need to understand your specific setup better. Could you please specify:

  • Which OS and version are you running on the device?
  • Are you using Torizon OS or a Yocto-based BSP?

You can get detailed information about your system by running the tdx-info command. For more details about this tool, please visit: Getting Device Information with Tdx-Info | Toradex Developer Center

Once I know your platform details, I can provide specific guidance for your 168 MHz pixel clock configuration and MIPI DSI PHY reference clock settings.

Best regards, Toradex AI Assistant.


Did you like my answer? :+1: :-1:

If I answered your question, please tick the “Solution” checkbox.

For follow-up questions to me, please use @ToradexAI in your post.

Torizon OS, verdin-imx8mp-Tezi_6.8.2+build.30

Software summary
------------------------------------------------------------
Bootloader:               U-Boot
Kernel version:           5.15.177-6.8.2+git.5a6602cc6c32 #1-TorizonCore SMP PREEMPT Fri Mar 21 16:22:58 UTC 2025
Kernel command line:      root=LABEL=otaroot rootfstype=ext4 quiet logo.nologo vt.global_cursor_default=0 plymouth.ignore-serial-consoles splash fbcon=map:3 ostree=/ostree/boot.1/torizon/c3a7ca8ff2232a05598c6b02529fba8f0dbacced78ea6fbf3ecb16d59a72a05e/0
Distro name:              NAME="TorizonCore"
Distro version:           VERSION_ID=6.8.2-build.30
Distro variant:           VARIANT="Docker"
Hostname:                 verdin-imx8mp-15629354
------------------------------------------------------------

Hardware info
------------------------------------------------------------
HW model:                 Toradex Verdin iMX8M Plus WB on Verdin Development Board
Toradex version:          0070 V1.1A
Serial number:            15629354
Processor arch:           aarch64
------------------------------------------------------------

MIPI DSI Clock Configuration on Verdin iMX8M Plus with Torizon OS 6.8.2

Your issue with the 168 MHz pixel clock appears to be related to a known limitation in the i.MX8M Plus MIPI DSI clock configuration. Based on your Torizon OS 6.8.2 setup, here’s what’s happening and how to address it:

Root Cause Analysis

The i.MX8M Plus has a fixed video PLL configuration that limits available pixel clock frequencies(1). The Verdin iMX8M Plus supports up to 1920x1200p60 display per LCDIF if no more than 2 instances are used simultaneously, with one LCDIF driving MIPI DSI up to UWHD and WUXGA(1).

Your observed behavior where video_pll1_out shows 650000000 Hz instead of your requested 1008000000 Hz suggests the PLL configuration is being overridden by the kernel’s clock framework.

Known Clock Configuration Issues

A community member documented a similar issue with DSI clock configuration(2). The problem stems from the i.MX8M Plus having a fixed root video clock that feeds all video interfaces, and these interfaces can only divide that root clock in specific ways(2).

The issue occurs because the fixed 1039.5MHz couldn’t be divided down accurately enough to make a pixel clock that feeds the 25MHz requirement sufficiently with the clock ranges/timings the bridge driver configures(2).

Recommended Solutions

1. Enable Dynamic PLL Rate Configuration

Since commit b09c68dc57c9 (“clk: imx: pll14xx: Support dynamic rates”), the video PLL can be set arbitrarily. You’ll need to enable CLK_SET_PARENT on the i.MX8MP pixel clocks so they can reconfigure the video PLL to be ideal(2).

However, note that this commit was later reverted because both pixel clocks will fight to reconfigure the root video PLL. For a single display use-case, this approach works well(2).

2. Alternative Overlay Configuration

Try this modified overlay approach for your MIPI DSI configuration:

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

    panel@0 {
        compatible = "urt,umoh-9866md-t";
        reg = <0>;
        status = "okay";
        
        backlight = <&backlight>;
        reset-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;
        
        port {
            umoh_9866md_t_in: endpoint {
                remote-endpoint = <&dsi_out_panel>;
            };
        };
    };
    
    ports {
        #address-cells = <1>;
        #size-cells = <0>;

        port@1 {
            reg = <1>;
            dsi_out_panel: endpoint {
                remote-endpoint = <&umoh_9866md_t_in>;
                data-lanes = <1 2 3 4>;
            };
        };
    };
};

(3)

3. Clock Verification Commands

To verify your clock configuration:

cat /sys/kernel/debug/clk/clk_summary | grep -C 5 video

(1)

MIPI DSI Interface Specifications

According to the Verdin iMX8M Plus datasheet, the MIPI DSI interface uses the MIPI D-PHY for the physical layer, compatible with version 1.2 specifications, with a maximum data transfer per lane of 1.5Gbps(4). It supports resolutions up to 1920x1080p60 with 24-bit RGB and also supports a 10Mbps data rate for low power operation(4).

Next Steps

  1. Check if your kernel supports the dynamic PLL rate configuration
  2. Verify the exact pixel clock being generated using the debug commands
  3. Consider creating a custom kernel build with the necessary clock patches if the standard configuration doesn’t meet your 168 MHz requirement

The community has documented successful implementations with similar challenges, so this configuration should be achievable with the right approach.

Best regards, Toradex AI Assistant.


Did you like my answer? :+1: :-1:

If I answered your question, please tick the “Solution” checkbox.

For follow-up questions to me, please use @ToradexAI in your post.

Thanks, PHY ref is still 12 MHz despite overrides. Can you confirm the correct way to force IMX8MP_CLK_MEDIA_MIPI_PHY1_REF to 24/25 MHz in an overlay?

I don’t think you need to adjust the IMX8MP_CLK_MEDIA_MIPI_PHY1_REF frequency to achieve a 65 MHz pixel clock for your DSI display. We have a DSI display that requires a 66–78 MHz pixel clock, and we tested it using a device tree overlay where the clock frequency was defined only in the panel-timing node, and it works as expected. I would recommend trying the same approach for your display as well.

Hey John,

Thoughts for us here?

Best regards,

Michael Park
Toradex