FAQ: Ubuntu 25.04 on Snapdragon X Elite

Erm, not in main, no . But in the one I’m using for my builds, yes. Getting to build the Ubuntu kernel with all that is available in your local stubble repo was what I was tinkering with the last few weeks(?). Anyway, try setting stubble.dtb_override=false:

submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-575647f9-054d-4009-87d9-3dbfc861679c' {
	menuentry 'Ubuntu, with Linux 6.17.0-jg-2-qcom-x1e [EL2]' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.17.0-jg-2-qcom-x1e-el2-advanced-575647f9-054d-4009-87d9-3dbfc861679c' {
		recordfail
	savedefault
		load_video
		gfxmode $linux_gfx_mode
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod ext2
		search --no-floppy --fs-uuid --set=root 575647f9-054d-4009-87d9-3dbfc861679c
		echo	'Loading Linux 6.17.0-jg-2-qcom-x1e ...'
		linux	/boot/vmlinuz-6.17.0-jg-2-qcom-x1e root=UUID=575647f9-054d-4009-87d9-3dbfc861679c ro  clk_ignore_unused pd_ignore_unused cma=128M efi=noruntime console=tty0 id_aa64mmfr0.ecv=1 'dyndbg=file drivers/regulator/core.c +p;file drivers/base/firmware_loader/main.c +p' crashkernel=2G-4G:320M,4G-32G:512M,32G-64G:1024M,64G-128G:2048M,128G-:4096M stubble.dtb_override=false
		echo	'Loading initial ramdisk ...'
		initrd	/boot/initrd.img-6.17.0-jg-2-qcom-x1e
		echo	'Loading device tree blob...'
		devicetree	/boot/dtb-6.17.0-jg-2-qcom-x1e-el2
	}
	menuentry 'Ubuntu, with Linux 6.17.0-jg-2-qcom-x1e [EL1]' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.17.0-jg-2-qcom-x1e-el1-advanced-575647f9-054d-4009-87d9-3dbfc861679c' {
		recordfail
	savedefault
		load_video
		gfxmode $linux_gfx_mode
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod ext2
		search --no-floppy --fs-uuid --set=root 575647f9-054d-4009-87d9-3dbfc861679c
		cutmem 0x8800000000 0x8fffffffff
		echo	'Loading Linux 6.17.0-jg-2-qcom-x1e ...'
		linux	/boot/vmlinuz-6.17.0-jg-2-qcom-x1e root=UUID=575647f9-054d-4009-87d9-3dbfc861679c ro  clk_ignore_unused pd_ignore_unused cma=128M efi=noruntime console=tty0 id_aa64mmfr0.ecv=1 'dyndbg=file drivers/regulator/core.c +p;file drivers/base/firmware_loader/main.c +p' crashkernel=2G-4G:320M,4G-32G:512M,32G-64G:1024M,64G-128G:2048M,128G-:4096M
		echo	'Loading initial ramdisk ...'
		initrd	/boot/initrd.img-6.17.0-jg-2-qcom-x1e
	}

Working here on T14s. And yes, it doesn’t go to EL2 on the Vivobook because 2 things:

  1. it selects the built-in dtb which is EL1
  2. it fails in the EFI loader. getting fixed eventually. You can avoid this by going stubble-less.

I wonder if SpeakerSafetyD could be ported from asahi linux? It seems to solve this exact problem. GitHub - AsahiLinux/speakersafetyd: Rust speaker safety daemon for Asahi Linux

Thanks for getting back so quickly and for building the kernel with the stubble. It is much appreciated.

I have merged your suggestion above into my /boot/grub.cfg (see below for excerpt), note that I have a LUKS/LVM setup. The results were as follows:

-1- use grub command line to chainload Shell.efi and boot it to run startup.nsh which runs

load \EFI\slbounce\slbounce.efi
\EFI\ubuntu\grubaa64.efi

and in subsequent grub invoke first submenu (your EL2 example but with jg-1 as jg-2 not available yet): 'Ubuntu, with Linux 6.17.0-jg-1-qcom-x1e [EL2]jg' which specifies stubble.dtb_override=false and adds devicetree /x1p42100-asus-vivobook-s15-el2.dtb

Result is the assertion failure

efi-log.c:340efi_assert: systemd-boot: Assertion ‘p’ failed at stub.c:270parse_cmdline, halting

-2- as above load slbounce.efi and invoke fourth submenu: menuentry 'Ubuntu, with Linux 6.17.0-jg-0-qcom-x1e [EL2]’ so going back to the previous jg-0 kernel and specifying devicetree ( but no stubble.dtb_override=false as this was a pre-stubble kernel).

Result is GUI prompts for LUKS password and system boots into EL2 with kvm-ok succeeding.

-3- No slbounce, just invoke second submenu (your EL1 example with jg-1, no devicetree): 'Ubuntu, with Linux 6.17.0-jg-1-qcom-x1e [EL1]jg no dtb' . Note no stubble.dtb_override=false as this kernel is supposed to use the hwid to automatically select the devicetree.

Result is system gets to this stage:
[ OK ] Reached target paths.target - Path Units.
[ 1.360626] qcom-ice 1d88000.crypto: probe with driver qcom-icefailed with error -95
and then reboots

-4- No slbounce, just invoke third submenu (your EL1 example with jg-1, but with devicetree this time): 'Ubuntu, with Linux 6.17.0-jg-1-qcom-x1e [EL1]jg w dtb' . Also no stubble.dtb_override=false so isn’t meant to find this devicetree line.

Result however is text prompt for LUKS password and system boots into EL1 (kvm-ok fails as expected).

[Note that would be appreciated by dinosaurs who worked with RS-232C terminal interfaces back in the day: you have to issue a Control-Q before or after typing in the LUKS password at the text prompt. Back then flow control was you pressing Ctrl-S “stop sending text” and Ctrl-Q “resume sending text”. This might just be an ASUS quirk, but in any case if you include the quiet splash as arguments to linux, you get the GUI and don’t have to do this]

-5- Conclusion: It looks like (a) system can boot into EL2 but only with jg-0 and (b) system can boot into EL1 with jg-1 but only by explicitly specifying devicetree

submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-5c3a79b7-7456-4bc4-bce4-553ae5c7e9f4' {
	menuentry 'Ubuntu, with Linux 6.17.0-jg-1-qcom-x1e [EL2]jg' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.17.0-jg-1-qcom-x1e-advanced-5c3a79b7-7456-4bc4-bce4-553ae5c7e9f4' {
		recordfail
	savedefault
		load_video
		gfxmode $linux_gfx_mode
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt2'
		echo	'Loading Linux 6.17.0-jg-1-qcom-x1e ...'
		linux	/vmlinuz-6.17.0-jg-1-qcom-x1e ro root=/dev/mapper/ubuntu--vg-ubuntu--lv clk_ignore_unused pd_ignore_unused cma=128M efi=noruntime console=tty0 id_aa64mmfr0.ecv=1 'dyndbg=file drivers/regulator/core.c +p;file drivers/base/firmware_loader/main.c +p' crashkernel=2G-4G:320M,4G-32G:512M,32G-64G:1024M,64G-128G:2048M,128G-:4096M stubble.dtb_override=false
		echo	'Loading initial ramdisk ...'
		initrd	/initrd.img-6.17.0-jg-1-qcom-x1e
		echo	'Loading device tree x1p42100-asus-vivobook-s15-el2.dtb'
		devicetree /x1p42100-asus-vivobook-s15-el2.dtb
	}
	menuentry 'Ubuntu, with Linux 6.17.0-jg-1-qcom-x1e [EL1]jg no dtb' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.17.0-jg-1-qcom-x1e-advanced-5c3a79b7-7456-4bc4-bce4-553ae5c7e9f4' {
		recordfail
	savedefault
		load_video
		gfxmode $linux_gfx_mode
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt2'
		#search --no-floppy --fs-uuid --set=root 575647f9-054d-4009-87d9-3dbfc861679c
		cutmem 0x8800000000 0x8fffffffff
		echo	'Loading Linux 6.17.0-jg-1-qcom-x1e ...'
		linux	/vmlinuz-6.17.0-jg-1-qcom-x1e ro root=/dev/mapper/ubuntu--vg-ubuntu--lv clk_ignore_unused pd_ignore_unused cma=128M efi=noruntime console=tty0 id_aa64mmfr0.ecv=1 'dyndbg=file drivers/regulator/core.c +p;file drivers/base/firmware_loader/main.c +p' crashkernel=2G-4G:320M,4G-32G:512M,32G-64G:1024M,64G-128G:2048M,128G-:4096M
		echo	'Loading initial ramdisk ...'
		echo	'NOT Loading device tree x1p42100-asus-vivobook-s15.dtb'
		initrd	/initrd.img-6.17.0-jg-1-qcom-x1e
	}
	menuentry 'Ubuntu, with Linux 6.17.0-jg-1-qcom-x1e [EL1]jg w dtb' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.17.0-jg-1-qcom-x1e-advanced-5c3a79b7-7456-4bc4-bce4-553ae5c7e9f4' {
		recordfail
	savedefault
		load_video
		gfxmode $linux_gfx_mode
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt2'
		#search --no-floppy --fs-uuid --set=root 575647f9-054d-4009-87d9-3dbfc861679c
		cutmem 0x8800000000 0x8fffffffff
		echo	'Loading Linux 6.17.0-jg-1-qcom-x1e ...'
		linux	/vmlinuz-6.17.0-jg-1-qcom-x1e ro root=/dev/mapper/ubuntu--vg-ubuntu--lv clk_ignore_unused pd_ignore_unused cma=128M efi=noruntime console=tty0 id_aa64mmfr0.ecv=1 'dyndbg=file drivers/regulator/core.c +p;file drivers/base/firmware_loader/main.c +p' crashkernel=2G-4G:320M,4G-32G:512M,32G-64G:1024M,64G-128G:2048M,128G-:4096M
		echo	'Loading initial ramdisk ...'
		initrd	/initrd.img-6.17.0-jg-1-qcom-x1e
		echo	'Loading device tree x1p42100-asus-vivobook-s15.dtb'
		devicetree /x1p42100-asus-vivobook-s15.dtb
	}
	menuentry 'Ubuntu, with Linux 6.17.0-jg-0-qcom-x1e [EL2]' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.17.0-jg-0-qcom-x1e-advanced-5c3a79b7-7456-4bc4-bce4-553ae5c7e9f4' {
		recordfail
		load_video
		gfxmode $linux_gfx_mode
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod ext2
		set root='hd0,gpt2'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-ieee1275='ieee1275/(null)/sas/disk@0,gpt2' --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2  25c7da3f-e6e2-422d-9820-b8611f59a725
		else
		  search --no-floppy --fs-uuid --set=root 25c7da3f-e6e2-422d-9820-b8611f59a725
		fi
		echo	'Loading Linux 6.17.0-jg-0-qcom-x1e ...'
		linux	/vmlinuz-6.17.0-jg-0-qcom-x1e root=/dev/mapper/ubuntu--vg-ubuntu--lv ro  clk_ignore_unused pd_ignore_unused cma=128M efi=noruntime quiet splash console=tty0 crashkernel=2G-4G:320M,4G-32G:512M,32G-64G:1024M,64G-128G:2048M,128G-:4096M $vt_handoff
		echo	'Loading initial ramdisk ...'
		initrd	/initrd.img-6.17.0-jg-0-qcom-x1e
		echo	'Loading devicetree blob x1p42100-asus-vivobook-s15-el2.dtb ...'
		devicetree /x1p42100-asus-vivobook-s15-el2.dtb
	}
}

I am seeing the same issues with running the jg-1 kernel. EL1 boots, but I am getting the same assert fail trying to boot into EL2. I haven’t tested the jg-0 version though.

So guys any chances to run ubuntu on qualcomm snapdragon 8 gen 3?

I tried your 6.17.0-jg-1-qcom-x1e kernel on my Yoga Slim 7x today, but unfortunately no speakers or microphone detected. Could it be it’s using another audio chip? Or is there something else missing?

I spotted some fresh kernels from @glathe yesterday: 6.17.0-jg-2-noefi and 6.17.0-jg-2-nostubble. The changes files both just note update 20251013-topic-x1e80100-hdmi-v5-0-3a9c8f7506d6@linaro.org so I had to make a few assumptions:

(1) the .noefi has stubble, so no need for separate devicetree statements in grub.cfg but no EL2 which currently depends on EFI shell
(2) .nostubble has EFI so vice versa, need devicetree and can boot into EL2
(3) the optimist in me hoped the HDMI reference in the changes file would mean the HDMI port on my ASUS Vivobook S15 X1P42100 would work.

So bad news: the hdmi didn’t work.

Good news: I tried the .nostubble first and, as long as your grub.cfg has devicetree statements, it happily boots into both EL1 and EL2 (with Shell.efi loading slbounce.efi) and even recovery (if you massage the recovery linux arguments as I have noted in an earlier post).

Odd news: then I installed the .noefi kernel files (which I confirmed are different to the .nostubble ones) and … it’s the same as the .nostubble: need devicetree files and it boots into EL2. No devicetree, it just reboots.

1 Like

Did you try this
https://bugs.launchpad.net/ubuntu-concept/+bug/2084191/comments/266
?

Huh. Well okay this folder is public, and it was to support someone to build a new arch image (I guess).

.noefi: No EFI stub, can’t boot from EFI shell. Also no tubble.
.nostubble: No Stubble (not ukified), but the EFI stub is there.
Meanwhile there is also a regular 6.17.0-jg-2 folder. It is almost the same rev, some additional patches to enable sound on dp and hdmi on T14s. But its not yet working here. The rest works well, though.
Since 6.18 is nearing finalization I will try a rebase to 6.18 soon. And integration of qebspil in the setup. Quite the development IMO.

1 Like

lenovo slim 7x with ubuntu 25.10

I wiped windows, never used qcom-firmware-extract, and all the stuff it extracts appears to be there.

Hardware accelerated rendering is working (except video encode/decode as is known.). But I do see some potential issues with GPU:

dmesg
...
[    1.118682] [drm] Initialized msm 1.13.0 for ae01000.display-controller on minor 1
[    1.118824] msm_dpu ae01000.display-controller: Direct firmware load for qcom/gen70500_sqe.fw failed with error -2
[    1.118829] msm_dpu ae01000.display-controller: [drm:adreno_request_fw [msm]] *ERROR* failed to load gen70500_sqe.fw

and some app that apparently try to use HW accel spam lots of error e.g.

journalctl -f
...
ptyxis[#]: Vulkan: ../src/freedreno/vulkan/tu_descriptor_set.cc:651: VK_ERROR_OUT_OF_POOL_MEMORY
gnome-control-center[#]: Vulkan: ../src/freedreno/vulkan/tu_descriptor_set.cc:651: VK_ERROR_OUT_OF_POOL_MEMORY

Suspend Issue:

  • On 6.17.0-6-generic, always immediately wakes from suspend, ( enter suspend loop. with blue display flicker on wake).
  • Doesn’t happen on 6.17.0-8-qcom-x1e (seems to stay suspended).
  • IRQ139/207/208/209: set affinity failed(-22) shown on both kernels after initiating suspend

I did get a few random crashes (on -qcom-x1e kernel iirc). I’m not sure what was causing that or if I can replicate. I think it was always with external display connected, but not sure.

I’m seeing ~10W during my normal usage.

Thanks for the explanation and apologies if I’m barging in where I’m not expected. I tried your “vanilla” 6.17.0-jg-2 but I can’t get it to boot into EL2 (whereas the .noefi and .nostubble variants both do).

I’ve reverted to 6.17.0-jg-0 (which does boot into EL2) - looking forward to your rebase on 6.18. Thanks again for all your contributions.

Hi, for booting el2 you need the stubble.dtb_override=false option in the kernel cmdline. This prefers the externally given dtb even if a match is found in the stubble space (which is wrong for EL2).

Hmm. I tried adding the stubble.dtb_override=false option to the kernel commandline for 6.17.0-jg-2 but I just get the assertion error.

Persevering with 6.17.0-jg-0 which boots into EL2, I am having no success creating a Debian 13 VM with virt-manager. According to my over-imaginative AI friends, I need to add a <gic version="3"/> to the <features> clause and to delete the TPM hardware. But no luck. I’ve tried other advice about deleting Display Spice, Sound and Tablet but still no luck. In all cases, my Ubuntu 25.10 host laptop just crases a few seconds after I “Begin Installation” and reboots.

The last journal kernel messages before the crash are

Nov 24 16:30:30 vivo399 kernel: qcom-iris aa00000.video-codec: dev_pm_opp_set_rate: failed to find OPP for freq 1443000000 (-34)
Nov 24 16:30:30 vivo399 kernel: qcom-iris aa00000.video-codec: power on failed
Nov 24 16:30:30 vivo399 kernel: qcom-iris aa00000.video-codec: core init failed
Nov 24 16:33:51 vivo399 kernel: kauditd_printk_skb: 31 callbacks suppressed
Nov 24 16:33:51 vivo399 kernel: audit: type=1400 audit(1763962431.420:351): apparmor="DENIED" operation="open" class="file" profile="systemd-detect-virt" name="/sys/firmware/devicetree/base/compatible" pid=9221 comm="systemd-detect-" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
~

What am I getting wrong here?

Hi, I would recommend using the 6.17.0-jg-2-nostubble variant to boot with EL2. This should do.
I finally got a breakthrough in enabling HDMI on the Thinkbook 16, so I will do a 6.18 series kernel soon :tm:

1 Like

Over-imaginative AI friends :smile_cat: yeah thats the spice we’re all longing for and happily pay $30/mo for.

DP MST fails to work for me. But don’t have issues running inbuilt 3k screen+2 more external 4k screens using 2 separate cables(one from dock, other USB-C to DP).

Hopefully DP MST is coming soon.

Any idea about if any work is going into fixing night light? It’s important feature for me.

So far daily driving Snapdragon X Elite for last 6 months or so and very happy with it.

I’m using the Lenovo Slim 7x as my daily driver with Ubuntu 25.10 plus the qcom-x1e PPA; it is so snappy yet power efficient for most work.

So I can assist in debugging suspend issues (and other issues later), would we discuss the same in LaunchPad tickets, or upstream on LKML, since the qcom-x1e kernel strictly cherry-picks upstream patches?

Thanks,
Dan

Hi everybody, do you know if the HP Omnibook 5 16-bf000 is supported? I have not been able to install Ubuntu 25.10 on it. I get the grub selection windows (“Try or install Ubuntu”), but when selecting that, it shows the cursor for a few seconds, and then the machine reboots without error.

hi everybody,today i installed the ubuntu 25.04 version. When it is installed the wifi was working fine then I update it to 25.10 after that wifi only detecting 2.4ghz band not able to detect 5ghz does anybody know how to fix this

@varunpriolkar ,

There’s already a patch for Night Light. If you can figure out how to build a custom kernel with the patch applied then you can use it right now. Otherwise, it seems to be stalled - hopefully might be in 6.19. Or maybe request to the Ubuntu Concept people to add this patch to their PPA.

https://patchwork.kernel.org/project/linux-arm-msm/patch/20251018-dpu-add-dspp-gc-driver-v1-1-ed0369214252@izzo.pro/

@watchmaker

Did you start with the Ubuntu Concept ISO and then upgrade? I installed the generic Ubuntu 25.10 ARM, then ran qcom-firmware-extract (not sure if this is still necessary), and then added the qcom-x1e PPA (this actually did not offer any further packages on top of my generic install). I then went one step further and installed kernel 6.18 from the qcom-x1e PPA!

Yes it’s snappy, but power profiles don’t seem to be working for me. I can see in Resources (https://flathub.org/en/apps/net.nokyan.Resources) with 6.18 the cores are clocked at 800 MHz, but spike up to 3.4 GHz with both profiles. I think if someone can get the power save profile working battery life would improve even further.