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
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.
- PCIe5 node has
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.
Manual GRUB console test
At boot, pressed
cto 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 bootSystem boots fine, but it still ignores our DTB.
Checked
/proc/cmdlineand runtime DTB/proc/cmdlinenever shows adevicetreeparameter.Running
cksumshows 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 DTBThis proves Linux is booting with a different, built-in DTB, completely ignoring ours.
Other tests attempted
- Replaced default DTBs under
/boot/dtbs/→ no effect. - Tried different partition settings in GRUB.
- Verified GRUB loads
insmod fdtsuccessfully.
- Replaced default DTBs under
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
disabledat runtime:cat /proc/device-tree/soc@0/pci@1c00000/status # disabledPCIe domain
0005never 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.dtbvia GRUB, it is silently ignored. - The kernel never even tries to load it.
- Even when I pass
Questions
- Is there any way to force Linux to use an external DTB instead of the built-in one?
- If not, what is the correct process to replace the built-in DTB in the kernel?
- Could there be a kernel configuration option like
CONFIG_EFI_ARMSTUB_DTB_LOADERor 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