FDT_ERR_NOTFOUND when applying LVDS overlay on Verdin iMX8MP using custom DTBO

Hi, I’m using a Verdin iMX8M Plus (0063, V1.1B) and trying to enable a 7-inch LVDS panel by applying a custom device tree overlay (verdin-imx8mp_panel-cap-touch-10inch-lvds_overlay.dtbo). I built the overlay and added it to overlay.txt for U-Boot to load. However, during boot, I get this error:

Executing script at 50280000

Loading DeviceTree: imx8mp-verdin-nonwifi-dev.dtb
87352 bytes read in 2 ms (41.7 MiB/s)
68 bytes read in 0 ms
Working FDT set to 50200000
Applying Overlay: verdin-imx8mp_panel-cap-touch-10inch-lvds_overlay.dtbo
3688 bytes read in 1 ms (3.5 MiB/s)
failed on fdt_overlay_apply(): FDT_ERR_NOTFOUND
8252870 bytes read in 33 ms (238.5 MiB/s)
Bootargs: root=PARTUUID=1e3c1cef-02 ro rootwait console=tty1 console=ttymxc2,115200
Uncompressing Kernel Image to 0
ERROR: Did not find a cmdline Flattened Device Tree
Could not find a valid device tree
Booting from mmc failed!
SCRIPT FAILED: continuing…
87352 bytes read in 2 ms (41.7 MiB/s)
MMC: no card present
No EFI system partition
No EFI system partition
Failed to persist EFI variables
No EFI system partition
Failed to persist EFI variables
No EFI system partition
Failed to persist EFI variables
Loading Boot0000 ‘mmc 2’ failed
EFI boot manager: Cannot load any image
starting USB…
Bus usb@38200000: Register 2000140 NbrPorts 2
Starting the controller
USB XHCI 1.10
scanning bus usb@38200000 for devices… 1 USB Device(s) found
scanning usb for storage devices… 0 Storage Device(s) found
PCIE-0: Link down
pca953x gpio-expander@21: Error reading output register
Could not get PHY for mdio: addr 7
Could not get PHY for FEC1: addr 7
ethernet@30bf0000 Waiting for PHY auto negotiation to complete… done
BOOTP broadcast 1
DHCP client bound to address 10.9.131.3 (34 ms)
*** ERROR: serverip' not set Cannot autoload with TFTPGET pca953x gpio-expander@21: Error reading output register Could not get PHY for mdio: addr 7 Could not get PHY for FEC1: addr 7 BOOTP broadcast 1 DHCP client bound to address 10.9.131.3 (35 ms) *** ERROR: serverip’ not set
Cannot autoload with TFTPGET

Applying Overlay: verdin-imx8mp_panel-cap-touch-10inch-lvds_overlay.dtbo
failed on fdt_overlay_apply(): FDT_ERR_NOTFOUND

Even the unmodified example overlay fails with the same error.
What does this error mean exactly, and how should I modify the overlay or the base device tree to avoid FDT_ERR_NOTFOUND?

Thanks in advance.

Hi, I’m the Toradex AI Assistant.

I might make mistakes. Our support team will step in if needed. If I answered your question, please tick the “Solution” checkbox. For follow-up questions to me, please use @ToradexAI in your post.

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


Hello and thank you for your detailed question!

The FDT_ERR_NOTFOUND error occurs when a device tree overlay tries to reference nodes or properties that are not present in the base device tree loaded by the bootloader. This means that the overlay cannot find the part of the tree it is supposed to modify or extend, so the application of the overlay fails and your device will not boot correctly.

How to Troubleshoot and Resolve the Issue

1. Confirm Base Device Tree Compatibility

Ensure your overlay is written for the same device tree that is actually being loaded. For the Verdin iMX8M Plus, you mentioned using imx8mp-verdin-nonwifi-dev.dtb. Your overlay’s compatible property, if present, should match the base tree’s root node:

/ {
    compatible = "toradex,verdin-imx8mp";
};
  • If your overlay references custom nodes or panel names, these must exist in your base device tree.
  • For details: Device Tree Overlay Overview

2. Check for Missing Nodes

  • Use the Device Tree Compiler (DTC) to decompile your base .dtb:

    dtc -I dtb -O dts imx8mp-verdin-nonwifi-dev.dtb > base.dts
    
  • In your overlay, look for target-path or target properties or fragment targets. Make sure the node paths and labels match nodes in your base.dts.

  • If your overlay tries to extend, for example, /panel, make sure a node named panel exists in the base tree.

For more: Issues Applying Overlay, FDT_ERR_NOTFOUND

3. Check Kernel and BSP Version Compatibility

  • Overlays and device tree structure can change between BSP or kernel versions. Make sure your overlay is written for the exact version you are running.
  • If you use Torizon or BSP 6/7, make sure your overlay is based on the downstream kernel, not mainline.
  • More info: Device Tree Overlay Development

4. Overlay Deployment Process

  • Copy the .dtbo file to the overlays directory on the boot partition (usually /media/boot/overlays on Torizon).

  • Add the filename to overlays.txt (or overlay.txt in some systems, but the recommended file is overlays.txt). It should be a space-separated list:

    fdt_overlays=verdin-imx8mp_panel-cap-touch-10inch-lvds_overlay.dtbo
    

    How to Deploy Overlays

  • After copying and editing, run sync and reboot (avoid power cycle during this process).

5. Overlay Validation

If even the example overlays from Toradex fail, that likely means your base .dtb is missing expected nodes. Double-check, for example, that your base tree includes a compatible LVDS node or panel definition that the overlay is designed to modify.

6. Recovery (in Case of Boot Failure)

If you are stuck in a failed-boot state due to a broken overlay, you can:

  • Interrupt U-Boot and run:
    setenv skip_fdt_overlays 1
    boot
    
  • Or, put the SOM into USB Mass Storage (UMS) mode and remove the problematic overlay file or fix overlays.txt from your computer.
    More Details

Summary of Steps

  1. Decompile and check your base .dtb for the nodes your overlay expects.
  2. Confirm your overlay’s target paths/nodes/labels exist and match the base tree.
  3. Verify your BSP and kernel versions.
  4. Make sure your overlay is deployed and declared correctly.
  5. Use provided example overlays and adapt them, if needed, to your base device tree structure.

With these steps, you should be able to identify the node mismatch and properly modify your overlay or base tree to resolve FDT_ERR_NOTFOUND.

If you have the overlay source and the decompiled .dts for your base, feel free to share relevant snippets for more targeted guidance!

Best regards,
Toradex AI Assistant.

Hi,
I’m working with a Verdin iMX8M Plus (0063, V1.1B) and trying to connect a 7-inch LVDS panel (800x480) directly to LVDS0 without using a DSI-to-LVDS bridge.

To do this, I modified the existing verdin-imx8mp_panel-cap-touch-10inch-lvds_overlay.dts to match my 7-inch panel’s specifications (timing, resolution, physical size, etc.). Here’s a summary of the changes:


// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
/*
 * Copyright (C) 2025 Toradex
 *
 * Capacitive Touch Display 10.1" single-channel LVDS
 *
 * https://developer.toradex.com/hardware/accessories/displays/capacitive-touch-display-101inch-lvds
 */

/dts-v1/;
/plugin/;

#include <dt-bindings/clock/imx8mp-clock.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/pwm/pwm.h>

#include "imx8mp-pinfunc.h"

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


&{/} {
        backlight_lvds_native: backlight-lvds-native {
                compatible = "pwm-backlight";
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_i2s_2_d_out_dsi_1_bkl_en>;
                brightness-levels = <0 45 63 88 119 158 203 255>;
                default-brightness-level = <4>;
                /* Verdin I2S_2_D_OUT as GPIO (SODIMM 46) */
                enable-gpios = <&gpio1 11 GPIO_ACTIVE_HIGH>;
                /* Verdin PWM_2 (SODIMM 16) */
                pwms = <&pwm2 0 30303 PWM_POLARITY_INVERTED>;
        };

        panel-lvds-native {
                compatible = "panel-lvds"; // 또는 "auo,g070van01"
                backlight = <&backlight_lvds_native>;
                data-mapping = "vesa-24";
                // G070VAN01의 일반적인 물리적 크기 (대략적인 값, 데이터시트 확인 필요)
                width-mm = <154>; // 7인치 패널의 가로 길이 (mm)
                height-mm = <86>; // 7인치 패널의 세로 길이 (mm)

                panel-timing {
                        /* G070VAN01 (800x480)에 맞는 타이밍으로 수정 */
                        clock-frequency = <33300000 33300000 33300000>; /* 33.3 MHz */
                        de-active = <1>;
                        hactive = <800 800 800>;
                        hback-porch = <40 40 40>;
                        hfront-porch = <20 20 20>;
                        hsync-active = <0>; /* Active low */
                        hsync-len = <48 48 48>;
                        pixelclk-active = <1>; /* positive edge */
                        vactive = <480 480 480>;
                        vback-porch = <22 22 22>;
                        vfront-porch = <22 22 22>;
                        vsync-active = <0>; /* Active low */
                        vsync-len = <3 3 3>;
                };

                port {
                        panel_lvds_native_in: endpoint {
                                remote-endpoint = <&ldb_lvds_ch0>;
                        };
                };
        };
};

/* Verdin I2C_2_DSI */
&i2c2 {
        #address-cells = <1>;
        #size-cells = <0>;
        status = "okay";
        /*
        touch@4a {
                compatible = "atmel,maxtouch";
                reg = <0x4a>;
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_i2s_2_d_in_gpio>,
                            <&pinctrl_i2s_2_sync_gpio>;
                // Verdin I2S_2_SYNC as GPIO (SODIMM 44)
                interrupt-parent = <&gpio4>;
                interrupts = <31 IRQ_TYPE_EDGE_FALLING>;
                // Verdin I2S_2_D_IN as GPIO (SODIMM 48)
                reset-gpios = <&gpio4 30 GPIO_ACTIVE_LOW>;
        };
        */
};

&lcdif2 {
        status = "okay";
};

&lvds_bridge {
        assigned-clocks = <&clk IMX8MP_CLK_MEDIA_LDB>,
                          <&clk IMX8MP_VIDEO_PLL1>;
        /*
         * This display uses 71.1 MHz pixel clock, so IMX8MP_VIDEO_PLL1 needs
         * to be 7 times 71.1MHz, or 497.7 MHz as the internal divider will
         * always divide the output LVDS clock by 7.
         */
        assigned-clock-rates = <0>, <233100000>;
        status = "okay";

        ports {
                #address-cells = <1>;
                #size-cells = <0>;

                port@1 {
                        reg = <1>;

                        ldb_lvds_ch0: endpoint {
                                remote-endpoint = <&panel_lvds_native_in>;
                        };
                };
        };
};

/* Verdin PWM_2 */
&pwm2 {
        status = "okay";
};

&iomuxc {
        pinctrl_i2s_2_d_in_gpio: gpio4io30grp {
                fsl,pins = <MX8MP_IOMUXC_SAI3_RXD__GPIO4_IO30 0x1c4>;   /* SODIMM 48 */
        };

        pinctrl_i2s_2_sync_gpio: gpio4io31grp {
                fsl,pins = <MX8MP_IOMUXC_SAI3_TXFS__GPIO4_IO31 0x184>;  /* SODIMM 44 */
        };
};

After compiling the overlay to .dtbo and including it in overlays.txt, I get this error during boot:

Applying Overlay: verdin-imx8mp_panel-cap-touch-10inch-lvds_overlay.dtbo
failed on fdt_overlay_apply(): FDT_ERR_NOTFOUND
Even the original 10-inch overlay fails with the same error.
Could this mean the base device tree is missing a required node that my overlay tries to reference (e.g., /lvds_bridge)?
Do I need to modify the base DT as well, or is something wrong with my overlay structure?

Any guidance would be appreciated!

Thanks.

Hi @JunHyeok!

Which carrier board are you using? Besides, could you please share the output of tdx-info command?

Regarding the overlay, we recommend verifying that the node you are referencing exists in the device tree that will be used/loaded. To start debugging it, you could find the right device tree for your carrier on our Git, and then start checking the nodes.

Best regards.

root@verdin-imx8mp-15505318:~# tdx-info

Software summary
------------------------------------------------------------
Bootloader:               U-Boot
Kernel version:           6.6.94-7.3.0-devel #1 SMP PREEMPT Wed Jun 25 09:14:55 UTC 2025
Kernel command line:      root=PARTUUID=1e3c1cef-02 ro rootwait console=tty1 console=ttymxc2,115200
Distro name:              NAME="TDX Wayland with XWayland"
Distro version:           VERSION_ID=7.3.0-devel-20250703031037-build.0
Distro variant:           -
Hostname:                 verdin-imx8mp-15505318
------------------------------------------------------------

Hardware info
------------------------------------------------------------
HW model:                 Toradex Verdin iMX8M Plus on Verdin Development Board
Toradex version:          0063 V1.1B
Serial number:            15505318
Processor arch:           aarch64
------------------------------------------------------------

Let me know if you need any additional information.

Hi @JunHyeok!

I managed to fix it. What I did was move the &lvds_bridge to within the &{/}. This needed to be done because the lvds_bridge node is not created in one of our device tree files, which means it needs to be created, and to create a node using overlays, you must put it inside the &{/} (root) node. When you added it outside the root, the kernel tried to reference a node called lvds_bridge on our device tree, and, of course, it didn’t find the node, so the error returned.

About the content of the overlay, I’m not sure if it’s going to work, but you can test it to see if it goes as you expected.

Best regards.

Fixed overlay:

// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
/*
 * Copyright (C) 2025 Toradex
 *
 * Capacitive Touch Display 10.1" single-channel LVDS
 *
 * https://developer.toradex.com/hardware/accessories/displays/capacitive-touch-display-101inch-lvds
 */

/dts-v1/;
/plugin/;

#include <dt-bindings/clock/imx8mp-clock.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/pwm/pwm.h>

#include "imx8mp-pinfunc.h"

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


&{/} {
        backlight_lvds_native: backlight-lvds-native {
                compatible = "pwm-backlight";
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_i2s_2_d_out_dsi_1_bkl_en>;
                brightness-levels = <0 45 63 88 119 158 203 255>;
                default-brightness-level = <4>;
                /* Verdin I2S_2_D_OUT as GPIO (SODIMM 46) */
                enable-gpios = <&gpio1 11 GPIO_ACTIVE_HIGH>;
                /* Verdin PWM_2 (SODIMM 16) */
                pwms = <&pwm2 0 30303 PWM_POLARITY_INVERTED>;
        };
        panel-lvds-native {
                compatible = "panel-lvds"; // 또는 "auo,g070van01"
                backlight = <&backlight_lvds_native>;
                data-mapping = "vesa-24";
                // G070VAN01의 일반적인 물리적 크기 (대략적인 값, 데이터시트 확인 필요)
                width-mm = <154>; // 7인치 패널의 가로 길이 (mm)
                height-mm = <86>; // 7인치 패널의 세로 길이 (mm)

                panel-timing {
                        /* G070VAN01 (800x480)에 맞는 타이밍으로 수정 */
                        clock-frequency = <33300000 33300000 33300000>; /* 33.3 MHz */
                        de-active = <1>;
                        hactive = <800 800 800>;
                        hback-porch = <40 40 40>;
                        hfront-porch = <20 20 20>;
                        hsync-active = <0>; /* Active low */
                        hsync-len = <48 48 48>;
                        pixelclk-active = <1>; /* positive edge */
                        vactive = <480 480 480>;
                        vback-porch = <22 22 22>;
                        vfront-porch = <22 22 22>;
                        vsync-active = <0>; /* Active low */
                        vsync-len = <3 3 3>;
                };
                port {
                        panel_lvds_native_in: endpoint {
                                remote-endpoint = <&ldb_lvds_ch0>;
                        };
                };
        };
        
        lvds_bridge {
                assigned-clocks = <&clk IMX8MP_CLK_MEDIA_LDB>,
                                  <&clk IMX8MP_VIDEO_PLL1>;
                /*
                * This display uses 71.1 MHz pixel clock, so IMX8MP_VIDEO_PLL1 needs
                * to be 7 times 71.1MHz, or 497.7 MHz as the internal divider will
                * always divide the output LVDS clock by 7.
                */
                assigned-clock-rates = <0>, <233100000>;
                status = "okay";
                
                ports {
                        #address-cells = <1>;
                        #size-cells = <0>;
                
                        port@1 {
                                reg = <1>;
                                
                                ldb_lvds_ch0: endpoint {
                                        remote-endpoint = <&panel_lvds_native_in>;
                                };
                        };
                };
        };
}; 

/* Verdin I2C_2_DSI */
&i2c2 {
        #address-cells = <1>;
        #size-cells = <0>;
        status = "okay";
        /*
        touch@4a {
                compatible = "atmel,maxtouch";
                reg = <0x4a>;
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_i2s_2_d_in_gpio>,
                            <&pinctrl_i2s_2_sync_gpio>;
                // Verdin I2S_2_SYNC as GPIO (SODIMM 44)
                interrupt-parent = <&gpio4>;
                interrupts = <31 IRQ_TYPE_EDGE_FALLING>;
                // Verdin I2S_2_D_IN as GPIO (SODIMM 48)
                reset-gpios = <&gpio4 30 GPIO_ACTIVE_LOW>;
        };
        */
};

&lcdif2 {
        status = "okay";
};


/* Verdin PWM_2 */
&pwm2 {
        status = "okay";
};

&iomuxc {
        pinctrl_i2s_2_d_in_gpio: gpio4io30grp {
                fsl,pins = <MX8MP_IOMUXC_SAI3_RXD__GPIO4_IO30 0x1c4>;   /* SODIMM 48 */
        };

        pinctrl_i2s_2_sync_gpio: gpio4io31grp {
                fsl,pins = <MX8MP_IOMUXC_SAI3_TXFS__GPIO4_IO31 0x184>;  /* SODIMM 44 */
        };
};