docs/hardware-status.md

Hardware status

On this page

Lenovo Legion Tab Gen 5 / Legion Y700 5th Gen (TB323FU), mainline Linux 7.3-rc4 plus this project's patch series (release kernel kernel-t40; most entries were checked on the development kernels before it, with the same patches). Tested mostly with Debian 13 and GNOME 48 on the device, the guided install with Ubuntu 26.04 and GNOME 50, and booted with five other distributions (distros.md); the kernel itself does not depend on any of them. How fast it is compared with Android: Performance. Android firmware: everything here is on ZUI 18.0.12.104; on 18.0.12.187 the kernel hangs during boot (#9). Last updated 2026-10-04.

How to read this page#

A driver that probes, a device node that exists, or a media element that shows up is not evidence that a feature works. Every row carries one of these evidence levels:

EvidenceMeaning
measuredchecked on the device with logs, counters or numbers (current, fps, CRC, frame counters, events, bit-exact output)
observeda person saw, heard or felt it (screen, sound, LEDs, vibration)
user-reporteda person reported it working, but no log or numbers were kept; will be re-checked with a record
probe onlydriver, node or element present; never actually used
untestednever tried

Status: ✅ works · 🟡 partial or conditional · ❌ does not work · ❓ not verified · — not applicable / not implemented.

A feature that needs a human to judge (display, sound, LEDs, vibration) is never marked ✅ without an observation. Repeated or probabilistic results (suspend, mode sets) are counted as N/M.

Labels on other pages#

Other pages say in their own words how far something was tried. This is how those words relate to the evidence levels above:

PageLabelMeansClosest level here
install.md and the pages for each PCfollowed end to enda person ran the guide as written against a rooted tablet; how far (up to the first start, or further) and how often is said next to itmeasured / observed
install-manual.md, custom-kernel.md[verified]done on the development tablet with the command or tool shownmeasured / observed
[from records]done on the development tablet, but the commands are reconstructed from notes and were not re-run in this formuser-reported
[untested]not done on any tablet; follows from how the tools workuntested
distros.mdchecked on the deviceseen on the device with that system, not "should work"observed
distribution modulesverifiedthe guided install with that module was followed end to end on a tabletmeasured / observed
experimentaltried on a tablet, with known gaps listed next to it; the installer warns before using it🟡
customyour own module; nothing is known about ituntested
this page✅ 🟡 ❌ ❓the status of a feature; every row also carries one of the evidence levels above—
How a check is done

Each ✅ comes from reproducing the feature on the device the same way every time: a scripted run that measures something (frame counters and CRCs for display modes, bit-exact comparison against a software decoder for video, battery current and temperatures for charging and thermal, repeated suspend cycles counted as N/M, traffic soaks for Wi-Fi), or a person watching or listening while a script drives the feature. A kernel change resets confidence: after a large rebase the whole table is re-checked.

Display, graphics, video#

FeatureStatusEvidenceNotes
Internal panel (CSOT, Novatek NT36536 TDDI, dual DSI)✅measured + observedused daily
DSC 1.2, 10 bpc✅measured
120 Hz✅measured + observeddefault mode
Idle refresh 60 / 30 Hz✅measured + observeddone in the kernel: the mode stays 120 Hz and only the vertical porch is stretched, so the desktop sees no mode change. No flicker; back to 120 Hz before suspend and display off
90 Hz✅measured + observedvendor timing; screen and touch fine, no underruns
164 Hz (instead of 165)✅measured + observed120 Hz horizontal timing; screen and touch fine, no underruns. SteamOS picks it by default; long sessions not yet watched
165 Hz (vendor timing)❌measured + observedhorizontal blanking too short → display underruns every frame. Not exposed by default
144 Hz❌measured + observedvendor timing underruns; a variant with the 120 Hz horizontal timing breaks touch. Not exposed by default
Backlight✅measured + observed
Display off / on (with and without an external display)✅measured
GPU OpenGL 4.6 / GLES 3.2 (Adreno 840, freedreno)✅measured + observedup to 1200 MHz
GPU idle power collapse (IFPC)✅measured
Vulkan (turnip)✅measuredVulkan 1.4; SteamOS's gamescope runs on it; heavy workloads not tried yet
Video decode H.264 / HEVC / VP9 / AV1 (iris)✅measuredoutput bit-exact against software decoders, 1080p and 4K
Video decode 10-bit (HEVC Main10, VP9 profile 2, AV1 Main 10-bit)✅measuredbit-exact, 1080p and 4K; needs this project's iris line-buffer fix
Video encode H.264 / HEVC (8-bit)✅measuredNV12 input
AV1 in applications—untestedthe driver works, but Debian's GStreamer 1.26 and FFmpeg 7.1 have no stateful V4L2 AV1 decoder; newer distributions not tried yet
Browser hardware video decode—untestedFirefox does not use V4L2 stateful decoders

Input, audio, camera, indicators#

FeatureStatusEvidenceNotes
Touchscreen✅measured + observedoccasional firmware-reset message after resume. SteamOS Gaming Mode rotates only the picture, so the builder adds a touch calibration matrix
Pen (AES)❓probe onlyno pen available for testing
Speakers (2 × Awinic aw882xx)✅measured + observedleft/right heard clean; both amplifiers start on every distribution in distros.md; speaker protection is a PipeWire filter, not Android's DSP protection
Microphones✅measuredthe internal microphone records speaker playback (noise floor −62 dBFS, playback peaks −26 dBFS)
USB-C analog audio (headset adapter)—probe onlyno audio route yet
Rear camera (Samsung S5KJNS)✅measured + observed1080p via libcamera; auto-exposure is imprecise
Front camera (GalaxyCore GC08A8)✅measured + observed
Rear camera focus (VCM)🟡measuredmanual focus works; no autofocus in libcamera
Camera streaming with the screen off✅measuredrestarting a capture with the display off used to hang the system; fixed by patch 0116 (repeated starts with the display off pass)
Torch✅observedalso from the helper's quick settings
Flash strobe❓probe only
RGB ring light✅observed + measuredcharge indicator, solid colors (a nine-color palette in the helper; colors are gamma-corrected because the LEDs are linear) and breathing run by the chip itself (hw_pattern) watched on 2026-10-03. Known limitation: every brightness or color change goes dark for about 45 ms while the chip's program restarts (no update command found in the vendor material)
Haptics (2 motors)✅observed
Volume and power keys✅observedpower key suspends and resumes (seen in SteamOS)
Emergency key (volume up + down, 10 s → back to Android)✅measured + observedAndroid restore starts 10 s after the keys are detected and Android boots (1/1); switching back to Linux from Android works

Wireless, sensors, power#

FeatureStatusEvidenceNotes
Wi-Fi (WCN7860, ath12k)✅measuredused daily; a receive stall under sustained heavy traffic is fixed by this project's ath12k patch (30-minute 2.4 and 5 GHz soaks clean); the PCIe link trains at x2 but runs at x1; 6 GHz / 320 MHz / MLO not checked
Bluetooth LE input devices✅observed
Bluetooth audio (A2DP)✅observedthe first syllable of a stream can be clipped
Bluetooth HFP❓untested
Accelerometer / auto-rotate✅measured + observedvia the sensor hub (SSC)
Ambient light / auto-brightness✅measured + observed
Proximity✅measured
Compass🟡measured + observedrelative rotation is right (about 90° per quarter turn); absolute heading is about 30° off compared with a phone. Android's map apps are 90–180° off on this device too, so the sensor is uncalibrated on the stock OS as well. GNOME's sensor proxy only lets authorized clients read it
Gyroscope, SAR—untestedbehind the sensor hub, not wired to iio-sensor-proxy
Hall sensor (cover)❓measuredneeds the original folio case
GNSS / GPS❌measuredthe modem, location service and a location session run, but no satellites are ever seen; Android on the same device gets no GPS fix either — most likely no antenna (Lenovo's spec sheet lists GPS)
Modem (MPSS)🟡measuredboots and stays up when rmtfs and tqftpserv start before it; if its initialization stalls, the SoC firmware resets the whole tablet and Linux cannot contain it. Kept off (rmtfs and tqftpserv masked): no cellular, no usable GNSS
Thermal throttling✅measuredCPU (95 °C) and GPU (105 °C) chip limits, plus board-temperature steps from 43 °C following Android's policy; checked under a 10-minute full load
Battery readings✅measuredwhile bypass charging, status still reads "Charging" (display only)
USB PD charging, PPS✅measuredabout 40 W into the battery on PPS with a 65 W charger (about 9.25 V in). The USB-C controller reports the negotiated voltage and current as 0
Charge limit, bypass charging✅measured + observedbypass cuts the battery current (9 A → 185 mA) and it comes back when turned off; the kernel status stays "Charging", so the helper derives its State from the current ("Bypass" at ≤ 300 mA; logic tested, not yet re-checked on the charger)
Suspend (s2idle) and resume🟡measuredworks (9 of 9 RTC cycles: Wi-Fi, sensors, sound, USB and video decode back each time); suspend still uses the CPU cluster idle state that runtime idle leaves out (next rows)
Deep sleep (CX / DDR power collapse)✅measured
CPU cluster idle state in runtime idle🟡measuredleft out by default since patch 0118 (cpuidle_psci_domain.allow_cluster_off=0 on the built-in command line; switch at run time with /sys/module/cpuidle_psci_domain/parameters/allow_cluster_off, 1 = allowed). With it allowed the tablet reset when idle (2 resets in 78 min, no error message); refused, 3 h idle without one, at the same display-off power (658 / 659 / 621 mW allowed / refused / allowed). Why the cluster's power-down resets the SoC is not fixed; s2idle still uses the state (the system state needs it). The release kernels since t38 run with it refused
Wake sources✅measuredpower key, RTC; USB wake off by default

USB, storage, other#

FeatureStatusEvidenceNotes
USB host (SuperSpeed+, hubs)✅measuredthe second port is USB 2.0 only
USB low-speed devices❌measuredenumeration fails
USB gadget (network, serial)✅measured
DisplayPort alt mode✅measured + observed2 lanes HBR2, up to 3840×2160 at 30 Hz. Checked with a TV through a USB-C to HDMI adapter: extended desktop at 4K 30, no flicker on either screen while the internal panel idles down to 30 Hz, unplug/replug 3/3. The adapter's own low-speed USB device fails to enumerate (harmless)
DisplayPort MST (daisy chain / "extend" on MST hubs)❌measuredwaiting for upstream MST support
UFS storage✅measured
microSD✅measuredUHS-I SDR104; also used for the multiboot roots
Multiboot (systems on microSD partitions)✅measured + observedsix systems boot with this kernel, picked by the initramfs (falls back to the internal root); see distros.md
Firewall (nftables, iptables-nft, firewalld)✅measuredfirewalld including IPv6 reverse-path filtering, NixOS's default firewall; legacy iptables tables are not built
Audio DSP (ADSP)✅measured
Compute DSP / NPU❓probe only
CPU frequency scaling, boost✅measured6 cores up to 3.63 GHz and 2 up to 4.61 GHz (boost), the same maximum frequencies as Android; the helper sets limits per performance profile and can turn boost off
CPU capacity, energy-aware scheduling✅measuredpatch 0117 gives the scheduler the two core sizes (cpu_capacity 799 / 1024; before it all eight read 1024, so a busy single thread stayed on a small core) and energy-aware scheduling turns on. Geekbench 6 without pinning: single-core 3590 / multi-core 11016 on a development kernel with 0117 and 0118 (before 0117: 2288 / 10359); Android's published results for this tablet are about 3655 / 10758
Switching between Android and Linux✅measured + observedabout 40 s
Boot time✅measuredabout 6 s from kernel start to the desktop (Debian, automatic login); 7–15 s on the other distributions

Known issues#

  • CPU cluster idle state left out of runtime idle (patch 0118): with it the tablet reset when idle, without an error message. Leaving it out avoids that at the same idle power; the cause in the cluster's power-down path is not fixed, and suspend still uses the state (knob: /sys/module/cpuidle_psci_domain/parameters/allow_cluster_off).
  • 165 Hz / 144 Hz: the vendor timings underrun the display controller. 164 Hz (120 Hz horizontal timing) is offered instead; 144 Hz needs a different timing.
  • No DisplayPort MST yet: monitors that need MST for "extend" only mirror.
  • GNSS: no satellites on Linux, and no GPS fix on Android either — treated as not usable on this device.
  • Compass: only relative rotation can be trusted; the absolute heading is off on Android as well.
  • Bypass charging works; the kernel battery status still reads "Charging" while it is on (the helper shows "Bypass" from the current instead).
  • Modem: a stalled modem start resets the whole SoC, so rmtfs and tqftpserv stay masked on every root (see distros.md).
  • Low-speed USB devices (some keyboards, adapters) fail to enumerate.
  • SteamOS (systemd 257.7) can hang a shutdown when the USB serial console is connected to a PC that is not reading it (the tty reset waits for output to drain, then the watchdog resets the tablet). The SteamOS builder turns that tty reset off; fixed in systemd 257.8 and later; other distributions are not affected.
  • Do not force higher display bandwidth votes: it resets the SoC.
  • Do not stop the audio DSP at runtime: it takes the SoC down.

Still to test#

In rough order of value. Rows above marked user-reported, ❓ or 🟡, and rows last checked before a relevant kernel change, are here.

WhatHow it will be settledNeeds a person
164 Hz in long sessions, SteamOS orientation and UI size, touch on Fedora and NixOS10+ minutes in Gaming Mode with underrun counters; first taps on each desktopeyes, hands
Bluetooth HFPheadset call profile, microphone loopbackears, voice
Long idle with patch 0118hours of idle and display-off time without a reset, against the 78-minute baseline with the cluster state allowedno (scripted)
AV1 in applicationsnewer GStreamer / FFmpeg on Arch, Fedora or NixOS, compared bit-exact with a software decoderno (scripted)
144 Hzanother vertical-porch variant, underruns and toucheyes, hands
From the spec sheetbattery design capacity, OpenCL, heavy Vulkan, full-resolution (50 MP) rear capture, touch report rate (up to 480 Hz), HBM (800 nit) and HDR, 8K and film-grain videomostly no; touch rate needs a finger
Flash strobetrigger the strobe control and watcheyes
Board thermal above 45 °C20–30 minutes of CPU + GPU load, steps and frequencies logged, desktop smoothness watchedeyes (optional)
Needs hardware not at handpen, Bluetooth LE Audio, USB audio adapters, the original folio case, the 68 W charger, a 6 GHz / 320 MHz / MLO access pointhands

Spec sheet vs status#

Lenovo / Qualcomm specifications compared with the status here

Sources: Lenovo PSREF "Legion Tab (8.8", 5)" and datasheet, Qualcomm Snapdragon 8 Elite Gen 5 product brief.

AreaLenovo / QualcommStatus here
Display8.8" 3040×1904, up to 165 Hz, HBM 800 nit, HDR120 / 90 / 60 / 30 / 164 Hz ✅; 165 ❌; HBM and HDR untested
External displayUSB-C DisplayPort; SoC up to 4K 120 / 8K 304K 30, 2 lanes ✅; MST ❌
Video decodeH.264, H.265, VP9, AV1, 10-bitall ✅ in the driver (1080p and 4K); 8K untested
Video encodeHEVC 10-bitH.264 / HEVC 8-bit ✅; 10-bit untested
GPUGLES 3.2, Vulkan 1.3, OpenCL 3.0GL ✅, Vulkan ✅, OpenCL untested
Audio2 speakers, 2 microphones✅
Cameras50 MP rear with AF and flash, 8 MP front✅ at 1080p; AF manual only; full resolution untested
Sensorsaccelerometer + gyro, hall, proximity + light, compass, GPSaccelerometer, light, proximity ✅; compass 🟡 (relative only); gyro not wired; GPS ❌
Charging68 W PD 3.0 / PPS, bypass chargingabout 40 W on PPS ✅, bypass ✅
USBUSB-C 10 Gbps + DP, second port USB 2.0✅
StorageUFS 4.1, microSD up to 2 TB✅
Wi-Fi / BluetoothWi-Fi 7, Bluetooth 6.0Wi-Fi ✅ (2.4 / 5 GHz; 6 GHz untested), BT ✅ (HFP and LE Audio untested)

View this page's Markdown on GitHub