2

I'm trying to bring up a WWAN modem on a Dell Latitude 7455 laptop running Linux. The modem is connected via PCIe domain 0005, but that PCIe controller is currently disabled in the default device tree.

My goal: enable the PCIe5 controller so the modem shows up as 0005:01:00.0 under lspci.

What I've Done So Far

  1. Created a custom device tree (merged-latitude7455-pcie5.dtb)

    • PCIe5 node has status = "okay".
    • Correct power supplies, GPIOs, and pinctrl are defined.
    • Validated syntax with dtc, no errors.
  2. Updated GRUB to load our custom DTB

    • Added a custom entry in /boot/grub/grub.cfg:

      menuentry 'Fedora Custom DTB' {
          linux /boot/vmlinuz-6.17.0-8-qcom-x1e root=UUID=38fb7591-7ff3-4734-8533-f973f0f2b88a ro quiet
          devicetree /boot/merged-latitude7455-pcie5.dtb
          initrd /boot/initrd.img-6.17.0-8-qcom-x1e
      }
      
    • Set GRUB default to this entry.

    • Verified it is being used when booting.

  3. Manual GRUB console test

    • At boot, pressed c to enter GRUB console.

    • Manually ran:

      insmod part_gpt
      insmod fat
      insmod fdt
      set root=(hd0,gpt5)
      linux /boot/vmlinuz-6.17.0-8-qcom-x1e root=UUID=38fb7591-7ff3-4734-8533-f973f0f2b88a ro
      devicetree /boot/merged-latitude7455-pcie5.dtb
      initrd /boot/initrd.img-6.17.0-8-qcom-x1e
      boot
      
    • System boots fine, but it still ignores our DTB.

  4. Checked /proc/cmdline and runtime DTB

    • /proc/cmdline never shows a devicetree parameter.

    • Running cksum shows the loaded DTB does not match our custom DTB:

      sudo cksum /sys/firmware/fdt
      # 2753729362 <size>   <-- runtime DTB
      
      cksum /boot/merged-latitude7455-pcie5.dtb
      # 2195968948 212506   <-- our DTB
      
    • This proves Linux is booting with a different, built-in DTB, completely ignoring ours.

  5. Other tests attempted

    • Replaced default DTBs under /boot/dtbs/ → no effect.
    • Tried different partition settings in GRUB.
    • Verified GRUB loads insmod fdt successfully.

The Problem

Despite everything I've tried, Linux always boots using the kernel’s built-in DTB, ignoring my custom file. Because of this:

  • PCIe5 remains disabled at runtime:

    cat /proc/device-tree/soc@0/pci@1c00000/status
    # disabled
    
  • PCIe domain 0005 never appears:

    lspci -Dnn | grep '^0005:'
    # no output
    

What I've Figured out

  • Some ARM64 kernels can have a DTB compiled directly into the kernel image (vmlinuz).

  • In my case, it looks like this is what’s happening:

    • Even when I pass devicetree /boot/merged-latitude7455-pcie5.dtb via GRUB, it is silently ignored.
    • The kernel never even tries to load it.

Questions

  1. Is there any way to force Linux to use an external DTB instead of the built-in one?
  2. If not, what is the correct process to replace the built-in DTB in the kernel?
  3. Could there be a kernel configuration option like CONFIG_EFI_ARMSTUB_DTB_LOADER or something similar that we need to enable to allow external DTB loading?

System Details

  • Laptop: Dell Latitude 7455
  • CPU: Qualcomm Snapdragon X Elite (ARM64)
  • Distro: Ubuntu 25
  • Kernel: 6.17.0-8-qcom-x1e
  • WWAN Modem: DW5932e-eSIM Snapdragon X62

0

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.