Ubuntu Concept ♥️ Snapdragon X Elite

You need to create a special grub entry, that’s true, referencing the -el2 variant of the dtb from the kernel. Like this:

startup.nsh:

FS13:
load \EFI\BOOT\slbounce.efi
\EFI\BOOT\grubaa64.efi
exit

grub.cfg (excerpt):


	menuentry 'Ubuntu, with Linux 6.16-el2-jg-5-qcom-x1e [EL2]' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.16-el2-jg-5-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.16-el2-jg-5-qcom-x1e ...'
		linux	/boot/vmlinuz-6.16-el2-jg-5-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.16-el2-jg-5-qcom-x1e
		echo	'Loading device tree blob...'
		devicetree	/boot/dtb-6.16-el2-jg-5-qcom-x1e-el2
	}
	menuentry 'Ubuntu, with Linux 6.16-el2-jg-5-qcom-x1e [EL1]' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-6.16-el2-jg-5-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
		echo	'Loading Linux 6.16-el2-jg-5-qcom-x1e ...'
		cutmem 0x8800000000 0x8fffffffff
		linux	/boot/vmlinuz-6.16-el2-jg-5-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.16-el2-jg-5-qcom-x1e
		echo	'Loading device tree blob...'
		devicetree	/boot/dtb-6.16-el2-jg-5-qcom-x1e
	}

Note the different devicetree entries, which are symlinks to the respective dtb files:

To check if you’re booted to EL2 you can use sudo dmesg|grep EL2, and if kvm is available sudo kvm-ok. Another sure sign should be that sound doesn’t work :grin:

Thanks, that did the trick. I notice that battery reporting isn’t working anymore. Is there a compatibility matrix for working features for EL2 versus EL1?

I’m still having issues with cpufreq, it looks like the driver isn’t loaded according to the cpufreq-info command. Any ideas on that or did you get it to run since it was merged in 6.16?

1 Like

Where would I obtain the el2.dtb for the t14s? I do not appear to have them

1 Like

They are in the /usr/lib path:

jglathe@volterra:~$ find / -name x1e78100-lenovo-thinkpad-t14s-el2.dtb 2>/dev/null 
/usr/lib/firmware/6.16-el2-jg-3-qcom-x1e/device-tree/qcom/x1e78100-lenovo-thinkpad-t14s-el2.dtb

Copy from there or symlink to it (I would copy and symlink like shown in my screenshot).

Well. Battery reporting requires the adsp firmware to be loaded. 6.16-el2-2 and up have additional patches to detect being on el2, and attach to the already booted adsp-lite firmware which was loaded at UEFI boot. This gives power management and dp altmode support, but no sound. AFAIK the work on loading the real adsp firmware for use on EL2 is ongoing.

Does “no sound” mean “no internal speakers”, or does it actually mean “no sound at all” (also no bluetooth)?

1 Like

No internal speakers. If sound is set up to work and you booted to EL2, missing ADSP functionality means no sound over speakers / headphones.

1 Like

Well, the internal speakers don’t work anyway, so that’s not a blocker for me. I will try the el2 instructions you posted above, thank you!

Where does startup.nsh go?

/boot/efi/startup.nsh

Do I need to do anything extra to load the adsp firmware in EL2? When I tried it last I was using the 6.17rc7 kernel, which you said should already load the correct kernel, right?

Hello everyone ! I just installed Ubuntu 25.04 on my Lenovo Yoga Air 14s Laptop, which is a Yoga Slim 7x sells in China. Almost everything works just fine, except the speaker, built-in microphone and camera. They don’t work. Tried using the firmware and toplogy file from Yoga Slim 7x won’t fix this problem. Is there anything to fix the broken audio? I already opened a bug report for this: Lenovo Yoga Air 14s bug report.

Also I would like to know how to activate KVM in linux. Tried using slbounce but Linux kernel can’t create KVM nodes, Should I need to recompile the kernel ?

1 Like

The 6.17 kernels don’t have the patches for it IMO. I did a rebase of my tree onto sgerhold’s EL2 patches. I tried to rebase it onto 6.17rc, but I got stuck/distracted.

Is there a more detailed write-up somewhere? It seems like I lack some general understanding and don’t want to spam this thread.

What I did:

  • Install 6.16-el2-jg-5-qcom-x1e and change the dtb-links in /boot to link -el2.dtb
  • downloaded slbounce.efi from this repo and placed it in /boot/efi/EFI/Boot.
  • copy the content listed above into /boot/efi/startup.nsh

Result:

  • hang after selecting the kernel (it loads kernel and dtb and then hangs; the fans start to spin up though)
1 Like

I need a couple of extra steps;
-0- make those changes to /boot/grub/grub.cfg that @glathe mentions above and keep a copy as grub.cfg gets overwritten when new kernels are generated

-1- copy /Windows/System32/tcblaunch.exe from your Windows 11 partition to /boot/efi

-2- Download Shell.efi for arm64 from

and copy to /boot/efi/slbounce/Shell.efi
(I also put slbounce.efi in that subdirectory just to keep things segregated and edit startup.nsh to match).

-3- I tried to use efibootmgr to have shell.efi become a boot option with
sudo efibootmgr -c -d /dev/sda -p 1 -L “EFI Shell” -l ‘\EFI\slbounce\Shell.efi’
but my ASUS Vivobook S15 x1p42100 just refuses to boot that in

-4- So I boot the system disk and interrupt grub with ESC and “c” for command line and
locate the Shell.efi with grub commands like
set pager=1
ls
ls (hd0,gpt1)/EFI

-5- then I run
chainloader (hd0,gpt1)/EFI/slbounce/Shell.efi
boot
which starts the EFI shell which automatically executes startup.nsh to load the slbounce.efi driver and then runs grub to boot in your EL2 vmlinuz

-6- and after the boot completes
kvm-ok
shows that /dev/kvm is present

Hello!

Ive been trying to install Ubuntu 25.10 Questing Desktop on my laptop but I cant get past the screen “Try or Install Ubuntu”, after i press Enter it just loops and i can see “_” mark on the left corner, and then it just jumps back to grub menu.

My laptop is Lenovo Ideapad 5x Snapdragon X Plus.

Have anyone had success of installing Ubuntu on this laptop?

1 Like

Hi, welcome. Actually, I have made an extended ISO with support for this laptop, too. It wraps a layer around the Ubuntu Concept ISO to add boot entries for some Snapdragon X / X Plus machines not yet officially supported. The kernel on the ISO is able to boot them with the provided dtbs, and do an install. Post- install there needs to be some work done:

For sound there are some further steps. I will get to updating that wiki eventually.

After its succesfully booting from nvme, you can safely do-release-upgrade -d for 25.10.

I will try, any guides out there on how to do these things?
Im not sure if i can do these steps on my own.

Thanks for the write-up! To be honest, this seems super brittle. I don’t mind spending some time trying to make it work; but in the end, it needs to work without me manually doing stuff on every boot and fixing things after every apt upgrade

Well, it is what it is. Using the T14s with slbounce and EL1 and EL2 (both configs) on 25.10 and yes, currently it is required to have a tight grip on grub.cfg. That will be resolved, eventually. Usability is great, though.

1 Like