FAQ: Ubuntu 25.04 on Snapdragon X Elite

I installed the Ubuntu 25.10 ISO, added the PPA and installed linux-qcom-x1e.

As an alternative to the power profiles, this is what I use to limit charging to 90% and adapt the GPU and CPU frequencies automatically based on the presence of USB charging:
https://github.com/dblueman/scripting/blob/main/x1-efficiency-tuning

My Lenovo Slim7x comes out of suspend immediately after entering; I’m putting more info into https://bugs.launchpad.net/ubuntu-concept/+bug/2120769; does suspend persist on other laptops?

Charge limiting setting recently appeared in gnome (Power>Battery Charging>Preserve Battery Health). maxes at 80% when enabled and work!

scripting/x1-efficiency-tuning at main · dblueman/scripting · GitHub

Very interesting… definitely wish frequency scaling and such “just work” optimally out the box. But seems promising for proper battery life! I suppose toggling 4…11 cores off on battery could make up most of the gap between windows battery performance? will have to try

My thinking - gnome already has some mechanisms, but no clue to what extent they work on this platform. I suppose gnome power-saver don’t actually change the frequency at all (“may enable some power saving options, such as aggressively dimming the screen”). You can set it to do power-saver on low battery threshold, but seemingly no way to select profile based on AC/batt state.

❯ powerprofilesctl query-battery-aware
Dynamic changes from charger and battery events: True

❯ cat /etc/UPower/UPower.conf
...
# Whether battery percentage based policy should be used. 
UsePercentageForPolicy=true
...
# When UsePercentageForPolicy is true, the levels at which UPower will consider the battery low
PercentageLow=20.0

comes out of suspend immediately after entering

That’s exactly what I experienced. Seemingly also periodically wake up every ~2 minutes. Haven’t noticed it as much recently (6.18.0-9-qcom-x1e)…but still need to debug properly before relying on suspend. thanks for making that bug!

Thank you for this valuable Insights!

Doesn’t modifying the CPU governor fix the frequency issue? I use TLP and based on charger presence it changes the governor and max frequency. This allows me to set a 800-1400MHz range while on battery, which helps a lot while on the road.

very useful script, thanks.

The question is whether 4 cores with the max at 3.4GHz, or 8 or 12 cores with the max at somewhere less than 3.4 GHz is better for battery life while still being snappy and usable.

I tried to figure out what happens with the frequencies for the 3 different power profiles on Windows, but there seemed to be no differences on my Slim 7x.

Now, I still not solve issues about Surface pro11

  • 1.keeping restarting at the Ubuntu grub without any dtb. *
  • 2.if you use a surface laptop 7(or a not full surface pro11 dtb) dtb to the iso, and not set the timeout=0, it still keep restarting.*
  • 3.if you use the dtb and set the timeout=0, it can stop restarting, but it can’t show anything on the screen. Even I set boot to text mode and disable GPU Acceleration, it is still a black screen.*

These are the 3 fatal issues of surface pro11 Ubuntu and other Distros.
My skill can only try editing the grub.cfg. From April to now, I still don’t know the reasons of the issues.
I hope Snapdragon X Elite Devices like surface pro11 can run Ubuntu well soon.

I finally did actual testing and suspend is working fine on my slim 7x. manual and lid-close suspends entered deep sleep, paused the clock for ~10 minutes each time, woke cleanly on keyboard/lid input, and drained battery at ~3W.

The best I can seem to manage for idle power/ light workload is ~6W.

hibernation doesn’t seem to be allowed by kernel

cat /sys/power/state
freeze mem
cat /sys/power/resume
cat: /sys/power/resume: No such file or directory

I did also notice a pretty consistent WIFI issue. The loop goes like this and repeats

disconnect from AP
ath12k_pci 0004:01:00.0: failed to pull fw stats: -71
ath12k_pci 0004:01:00.0: failed to pull fw stats: -71
ath12k_pci 0004:01:00.0: time out while waiting for get fw stats
authenticate with 
send auth to 
authenticated

and sometimes on boot network interface is missing, not sure if that is related though.

Did you get this sorted out?

I have same problem, battery care keeps reverting back on and cant get it to charge past 80%. Also it seems to enable “Lenovo Smart Charging” in windows also and there is no option (yet) in Lenovo Vantage to toggle it on or off

Thanks to everyone contributing to this project. I’m neither a developer nor a Linux pro – I’m just a data guy who dislikes Microsoft – and I greatly appreciate the hours put into this.

I bought a Dell XPS 13 (9345) before checking whether Dell supported Linux for Snapdragon systems. I’m running the 6.17.0-8-qcom-x1e kernel with Plucky 25.04. Following the instructions in the original post here, my system works okay, with these obvious problems (many are mentioned above):

  • Internal speakers don’t work
  • Internal camera doesn’t work
  • Internal microphone doesn’t work
  • Nightlight mode doesn’t work
  • Limited power management options

I had 2 questions:

  1. Should I update to 25.10 or will that cut off access to this project?
  2. Are there known fixes to the problems listed above?

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. Request to the Ubuntu Concept people to add this patch to their PPA.

https://patchwork.kernel.org/project/linux-arm-msm/patch/20251019-dpu-add-dspp-gc-driver-v3-1-840491934e56@izzo.pro/

I started with the Ubuntu 25.10 ARM64 iso, then added the X1E ppa for kernel 6.18, then used this script for power management

Speakers, camera, and internal microphone are available experimentally. Look at previous posts.

2 Likes

It seems that these are last and hardest remaining problems.

And it’s no idea when they gonna be fixed.

I am new to this forum and am looking for Ubuntu 25.10 fixes/upgrades to run on my ASUS Zenbook UX3407QA. My system run very well with some devices not working:
Speakers and sound
My keyboard backlight runs bright and dark
No WiFi Interface QCNFA765
No battery state info
No screen brightness control from Function Keys
No CPU Temperature Display
No camera
No sleep or hibernate modes
All of which I am trying to get working but my boot seems not to be a problem. Getting the system to recognize my SD card on USB was tricky. Here is a copy of my grub2 file:

DO NOT EDIT THIS FILE

It is automatically generated by grub-mkconfig using templates

from /etc/grub.d and settings from /etc/default/grub

BEGIN /etc/grub.d/00_header

if [ -s $prefix/grubenv ]; then
set have_grubenv=true
load_env
fi
if [ “${initrdfail}” = 2 ]; then
set initrdfail=
elif [ “${initrdfail}” = 1 ]; then
set next_entry=“${prev_entry}”
set prev_entry=
save_env prev_entry
if [ “${next_entry}” ]; then
set initrdfail=2
fi
fi
if [ “${next_entry}” ] ; then
set default=“${next_entry}”
set next_entry=
save_env next_entry
set boot_once=true
else
set default=“0”
fi

if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option=“–id”
else
menuentry_id_option=“”
fi

export menuentry_id_option

if [ “${prev_saved_entry}” ]; then
set saved_entry=“${prev_saved_entry}”
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi

function savedefault {
if [ -z “${boot_once}” ]; then
saved_entry=“${chosen}”
save_env saved_entry
fi
}
function initrdfail {
if [ -n “${have_grubenv}” ]; then if [ -n “${partuuid}” ]; then
if [ -z “${initrdfail}” ]; then
set initrdfail=1
if [ -n “${boot_once}” ]; then
set prev_entry=“${default}”
save_env prev_entry
fi
fi
save_env initrdfail
fi; fi
}
function recordfail {
set recordfail=1
if [ -n “${have_grubenv}” ]; then if [ -z “${boot_once}” ]; then save_env recordfail; fi; fi
}
function load_video {
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
}

if [ x$feature_default_font_path = xy ] ; then
font=unicode
else
insmod part_gpt
insmod ext2
search --no-floppy --fs-uuid --set=root c858ac97-8ec6-4cee-a19d-f95aa5d7ebce
font=“/usr/share/grub/unicode.pf2”
fi

if loadfont $font ; then
set gfxmode=auto
load_video
insmod gfxterm
fi
terminal_output gfxterm
if [ “${recordfail}” = 1 ] ; then
set timeout=30
else
if [ x$feature_timeout_style = xy ] ; then
set timeout_style=hidden
set timeout=0

Fallback hidden-timeout code in case the timeout_style feature is

unavailable.

elif sleep --interruptible 0 ; then
set timeout=0
fi
fi

END /etc/grub.d/00_header

BEGIN /etc/grub.d/05_debian_theme

set menu_color_normal=white/black
set menu_color_highlight=black/light-gray

END /etc/grub.d/05_debian_theme

BEGIN /etc/grub.d/10_linux

function gfxmode {
set gfxpayload=“${1}”
if [ “${1}” = “keep” ]; then
set vt_handoff=vt.handoff=7
else
set vt_handoff=
fi
}
if [ “${recordfail}” != 1 ]; then
if [ -e ${prefix}/gfxblacklist.txt ]; then
if [ ${grub_platform} != pc ]; then
set linux_gfx_mode=keep
elif hwmatch ${prefix}/gfxblacklist.txt 3; then
if [ ${match} = 0 ]; then
set linux_gfx_mode=keep
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=keep
fi
else
set linux_gfx_mode=text
fi
export linux_gfx_mode
menuentry ‘Ubuntu’ --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option ‘gnulinux-simple-c858ac97-8ec6-4cee-a19d-f95aa5d7ebce’ {
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
search --no-floppy --fs-uuid --set=root c858ac97-8ec6-4cee-a19d-f95aa5d7ebce
linux /boot/vmlinuz-6.17.0-8-generic root=UUID=c858ac97-8ec6-4cee-a19d-f95aa5d7ebce 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
initrd /boot/initrd.img-6.17.0-8-generic
}
submenu ‘Advanced options for Ubuntu’ $menuentry_id_option ‘gnulinux-advanced-c858ac97-8ec6-4cee-a19d-f95aa5d7ebce’ {
menuentry ‘Ubuntu, with Linux 6.17.0-8-generic’ --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option ‘gnulinux-6.17.0-8-generic-advanced-c858ac97-8ec6-4cee-a19d-f95aa5d7ebce’ {
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
search --no-floppy --fs-uuid --set=root c858ac97-8ec6-4cee-a19d-f95aa5d7ebce
echo ‘Loading Linux 6.17.0-8-generic …’
linux /boot/vmlinuz-6.17.0-8-generic root=UUID=c858ac97-8ec6-4cee-a19d-f95aa5d7ebce 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 /boot/initrd.img-6.17.0-8-generic
}
menuentry ‘Ubuntu, with Linux 6.17.0-8-generic (recovery mode)’ --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option ‘gnulinux-6.17.0-8-generic-recovery-c858ac97-8ec6-4cee-a19d-f95aa5d7ebce’ {
recordfail
load_video
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 c858ac97-8ec6-4cee-a19d-f95aa5d7ebce
echo ‘Loading Linux 6.17.0-8-generic …’
linux /boot/vmlinuz-6.17.0-8-generic root=UUID=c858ac97-8ec6-4cee-a19d-f95aa5d7ebce ro recovery nomodeset clk_ignore_unused pd_ignore_unused cma=128M efi=noruntime
echo ‘Loading initial ramdisk …’
initrd /boot/initrd.img-6.17.0-8-generic
}
}

END /etc/grub.d/10_linux

BEGIN /etc/grub.d/10_linux_zfs

END /etc/grub.d/10_linux_zfs

BEGIN /etc/grub.d/20_linux_xen

END /etc/grub.d/20_linux_xen

BEGIN /etc/grub.d/30_os-prober

END /etc/grub.d/30_os-prober

BEGIN /etc/grub.d/30_uefi-firmware

if [ “$grub_platform” = “efi” ]; then
fwsetup --is-supported
if [ “$?” = 0 ]; then
menuentry ‘UEFI Firmware Settings’ $menuentry_id_option ‘uefi-firmware’ {
fwsetup
}
fi
fi

END /etc/grub.d/30_uefi-firmware

BEGIN /etc/grub.d/35_fwupd

END /etc/grub.d/35_fwupd

BEGIN /etc/grub.d/40_custom

This file provides an easy way to add custom menu entries. Simply type the

menu entries you want to add after this comment. Be careful not to change

the ‘exec tail’ line above.

END /etc/grub.d/40_custom

BEGIN /etc/grub.d/41_custom

if [ -f ${config_directory}/custom.cfg ]; then
source ${config_directory}/custom.cfg
elif [ -z “${config_directory}” -a -f $prefix/custom.cfg ]; then
source $prefix/custom.cfg
fi

END /etc/grub.d/41_custom

I hope this will prove helpful.

Carl

In windows the only solution I found is to power off the laptop and keep power button pressed about 15-30 seconds, that will reset Smart Charging and let you charge to 100%.

Hi Carl, I assume your mention “my system runs very well” means that you are booting Ubuntu OK, which means your grub file is OK. I’m afraid the list of functions that don’t work is what we all have to endure until some hero in the open source community manages to get one or more of these working.

1 Like

Yeah, and there are the only 2 remaining things that prevents from every day use:

  • Internal Speakers
  • Camera

My dt also contains internal speakers audio. Not camera, but someone on #aarch64-laptops did something with it with the S15

1 Like

Wondering if anyone else has tried enabling internal speakers on the latest kernel (Ubuntu 25.10, X1E PPA, 6.18). It seems to be far fewer steps than previously.

I just did the following:

git clone https://github.com/joske/alsa-ucm-conf.git
cd alsa-ucm-conf
sudo cp -R -f ucm /usr/share/alsa/
sudo cp -R -f ucm2 /usr/share/alsa/

Change 84 to 5 in /usr/share/alsa/ucm2/codecs/qcom-lpass/wsa-macro/four-speakers/init.conf and /usr/share/alsa/ucm2/codecs/qcom-lpass/wsa-macro/init.conf

Make sure system volume slider is low! (around 10-20%)

Sound works and quality is fairly good. My Lenovo Slim 7x has 2x tweeters and 2x woofers.

hi, are you saying besides the “internal speakers and camera” that the power management options are working for you? what kind of battery life are you getting? comparable to what you would expect if you would’ve done the same workload on windows?

Well, for me internal speakers and camera is higher priority than power management and so on.

If I have internal speakers and camera (and of course - microphone, but I hope when we speak about internal speakers the microphone is implied), then, I can:

  • Call to my collegues with switched on camera
  • I can speak with them using only the laptop without anything else

That should work.

As for power management, even if your battery will work 4 hours instead of, for example 6, you can connect power adapter.

But that would be working machine.

I’ve tried your steps.

My kernel is

6.18.0-9-qcom-x1e #9-Ubuntu SMP PREEMPT_DYNAMIC Thu Nov 27 16:34:14 UTC 2025 aarch64 GNU/Linux

But still “Dummy Output” in sound settings.