Repository navigation
Surface Pro 11 (Intel, Lunar Lake) — status, and how to live with it today #2268
eidos-case
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Surface Pro 11 (Intel, Lunar Lake) — status, and how to live with it today
Surface Pro 11 comes in two versions. The ARM one is widely discussed; this is
about the Intel one, which behaves quite differently.
Everything below is from one machine: Surface Pro for Business 11th Edition with
Intel, SKU
Surface_Pro_11th_Edition_With_Intel_For_Business_2103, Core Ultra 7268V, UEFI 17.105.143 (17.100.143 until the end of August), Ubuntu 26.04. Most
of it was measured on kernel 7.0.0-30, which Ubuntu has since replaced; the
audio results below were taken again on 7.0.0-34 on 2026-09-25 and are
unchanged. Where a claim rests on a second machine, it says so.
Updated 2026-10-08. A fix for the infrared camera went to linux-media: the
IPU7 wrote frames without snooping the CPU's cache, so a program reading them
got rows of an older frame. The buttons fix is in seven stable trees now, still
not 7.0. The Bluetooth-after-boot workaround has moved here from #2267. One
correction: its race was put down to Ubuntu's own patches, but what in Ubuntu's
kernel brings it in was never narrowed down, and the 7.0.y stable updates under
those patches are among the candidates.
One thing learned the hard way and worth passing on: if you build any of these
patches into your own modules, a kernel upgrade silently reverts them. The
patched modules live in
/lib/modules/<version>/, and a new kernel shipspristine copies, so the symptom comes back looking like a regression in the new
kernel. It is not. Rebuild for the new version before blaming it.
I will keep this updated as patches land. Corrections welcome — several things
here were wrong the first time and were fixed because people said so.
Short version
Out of the box you get a working tablet with no sound and no cameras. Two
fixes are in mainline and six more are accepted by their maintainers; four
are on mailing lists, and the infrared camera's driver is not on one yet. The
cameras additionally need tuning data that cannot come from upstream at all.
None of it is hard once you know what is missing, which is the point of this
page.
Works with a stock kernel, nothing added
Display and backlight, touch, the keyboard cover and its trackpad, Wi-Fi and
Bluetooth as devices, battery and charging, thermals. Not tested: the pen,
because there is none here.
Hardware video decode works too, but needs Ubuntu's
intel-media-va-driver,which was not installed here. With it, H.264, HEVC (also 10-bit), VP9 and AV1
all decode on the GPU's video engine through VA-API.
Suspend works, and reasonably well: S0ix residency measured between 70 % and
94 % depending on what is running. Lid close and open both work, with one
caveat below.
Needs a kernel patch
ASoC: rt1320— run the init preset on first hardware init9b30521074f0, also picked for 6.18 stablesoundwire: dmi-quirks— drop the ghost RT1320soundwire.gitnext asd32e04c05234, not in a release yetmedia: i2c: ov13858— regulators, clock, reset GPIOfailed to find sensor: -5media: i2c: ov13858— cap analogue gain at0x07c00x7ffwraps; brighter settings give a darker picturemedia: i2c: ov13858— horizontal and vertical flipsmedia/nextasdeb515fcc369, not in a release yetint3472— GPIO type0x08(POWER1)media/nextas34e31390a3b9btintel_pcie— stale cache in theset_dxstatefallback-EBUSYand the machine stays awakebluetooth-nextas20dfccf8d854with the rest of Intel's PM series, not in a release yetsoc_button_array— ignored-EPROBE_DEFERed22ad5fdbdb, Hans de Goede's fix, and in the current releases of seven stable trees, 5.10 to 7.2, but not in 7.0, which Ubuntu's kernel is built frommedia: i2c: imx681— front camera drivermedia: i2c: vd55g0— infrared camera drivermedia: ipu-bridge— OV13858 entrymedia/nextas2ee01a094aba, not in a release yetmedia: ipu-bridge— upside-down quirkmedia/nextasb238116ccd4b, not in a release yetmedia: staging/ipu7— snoop ISYS writes to capture buffersThe board describes one amplifier twice
Worth understanding, because it explains the most confusing failure. There is
one physical RT1320 on SoundWire link 0, described by two
_ADRentries thatdiffer only in SDCA class id. Only the class-1 entry ever attaches. The ghost
consumes an amplifier index, so the real part is named
rt1320-2and the stockUCM profile drives switches on a device that is not there; and its endpoints
reach
create_sdw_dailink(), which builds DAI link names from link id andfunction type alone, so its SmartMic collides with the real one:
aplay -lthen reports zero cards. Removing the ghost at enumeration fixes bothsymptoms at once. Confirmed independently on a second Surface Pro 11 with a
different BIOS.
Re-measured on 7.0.0-34 on 2026-09-25, with the quirk and the rt1320 preset
built in and nothing else — no machine entry, stock UCM:
/proc/asound/cards--- no soundcards ---card 0 [sofsoundwire]duplicate filenamein dmesgarecord -lcard 0, device 4: MicrophoneWith the quirk there is one SoundWire peripheral,
sdw:0:0:025d:1320:01,status=Attached. The microphone then produces real signal rather than merelyenumerating: a four-second capture from
hw:0,4peaks at 4568 of 32767(−17.1 dBFS), RMS 846.5, across 6391 distinct sample values. A dead or stuck
channel gives one.
speaker-testclocks a 1 kHz sine through the playback pathwithout error.
So the microphone needs no patch of its own. The quirk is the whole of it.
The buttons are fixed in mainline, but not for 7.0
In 7.0 the driver deliberately discards
-EPROBE_DEFERwhen looking up buttonGPIOs, because some Intel platforms declare virtual GPIOs that never
materialise and deferring on those would hang the probe forever. Here the GPIO
controller (
INTC105D, five gpiochips underpinctrl-intel-platform) simplyhas not finished probing yet, and the buttons are dropped silently — nothing is
logged at all, on any level, because every button is skipped and
n_buttonsstays 0.
Distinguishing "virtual GPIO that will never appear" from "controller not ready
yet" is the actual problem, and I did not want to guess at it. A
softdepdoesnot help: the race is against the asynchronous probe of the individual
INTC105D:0Ndevices, not module load order. Tested, 2 successes in 5 boots,same as without.
Hans de Goede, who knows the subsystem, drew the line: his fix waits for the
GPIO controller everywhere except on Bay Trail and Cherry Trail, where the
virtual GPIOs are. It is in mainline from 7.3-rc4 and in seven stable trees,
none of them 7.0, which Ubuntu's kernel is built from. Until yours has
it, a service that binds the driver after boot works reliably — 25 unbind/bind
cycles, 25 successes.
Cameras need more than a kernel
Three cameras: rear
ov13858, frontimx681, infraredvd55g0for face login.Only the rear one has an in-tree driver. The front and infrared cameras have no
driver in any released kernel — those are the
imx681andvd55g0rows in thetable above, and until they land no amount of userspace helps. Even with all of
it, the pictures are unusable without tuning data, which is per-sensor and
per-board and does not come from upstream.
Tuning files, a Howdy plugin for face login through the IR camera, and the
traps involved are in #2267.
The front camera additionally needs a
CameraSensorHelperin libcamera, withoutwhich it is under-exposed by about 4.5x. Sent to libcamera-devel 2026-08-31,
and held at our request until the kernel driver lands: a helper should not
come ahead of its driver.
Workarounds worth having for now
These are what this machine actually runs. They are small, and each can go
once your kernel no longer needs it; only the buttons one has a fix upstream.
soc_button_arrayafter boot.btintel_pciewhen arace in the firmware download leaves the controller dead at boot. The race
hit about one boot in three on Ubuntu's 7.0.0-34 here, and none of 41 on
mainline v7.0 built with Ubuntu's configuration. What in Ubuntu's kernel
brings it in was never narrowed down; the 7.0.y stable updates under it are
among the candidates, so other 7.0 kernels may have it too. Ubuntu's
7.0.0-38 still has it: 2 boots of 41 here. It is reported in
Launchpad bug 2161900.
If you installed the service before 2026-09-29, replace it: that version
could kill the controller itself. The service is below.
wakes the machine.
The Bluetooth-after-boot service
Check your own boot logs first: if
journalctl _TRANSPORT=kernel | grep "Controller in error state"finds nothingover several boots, you do not need it.
It uses
hciconfig, which some distributions ship in a separate package ofdeprecated BlueZ tools.
DEVat the top of the script is the controller's PCIaddress,
0000:00:14.7here;lspci -D | grep -i bluetoothshows yours.It waits before it acts. The firmware setup runs after the probe has returned,
with the address at zero throughout, and a failing one takes about 8 s to give
up. Unloading the module in the middle of it leaves no adapter at all, which is
what the version from before 2026-09-29 did. So a zero address counts as dead
only after 15 s. Keep the wait if you adapt it. Here this version has brought
the controller back on five boots since 2026-09-29, one of them on the second
reload.
/usr/local/sbin/sp11-bt-recover:/etc/systemd/system/sp11-bt-recover.service:An earlier version of this page also listed a sleep hook that unloads
btintel_pciearound suspend. It never ran here: systemd reads sleep hooksonly from
/usr/lib/systemd/system-sleep/, and it sat in/etc. Everysuspend on this machine has used the driver's own path, 30 in a row clean
after the first day, so it is gone from the list.
Keep Secure Boot on
If you build patched modules, sign them with a Machine Owner Key rather than
turning Secure Boot off. On this machine the Windows Hello PIN is sealed to TPM
PCR 7, which measures Secure Boot state: turning it off invalidates the PIN on
the Windows side, and Windows is still the only way to apply firmware bundles.
This is not exotic — MOK is the same mechanism Ubuntu already uses for nvidia
and virtualbox. It does not touch the boot chain: the distribution kernel stays
signed by Canonical, shim by Microsoft's third-party CA. Only your own modules
need your key.
Known unsolved
driver has to be told which sensor pin drives it, and ACPI does not say.
Told by a local test patch, it lights, but only while the exposure is under
about 70 % of the frame; in the dark the sensor's auto exposure goes past
that and the picture stays black.
drives a hardware ISP that Linux does not.
rather than left open.
Upstream threads
ACPI dumps for this machine are in
linux-surface/acpidumps#34,
not merged yet.
All reactions