Librevious

Workbench ยท 25 October 2026

Brightness keys on the Galaxy Book2 Pro

I had this wrong for a long time. On the Samsung Galaxy Book2 Pro, Fn+F2 and Fn+F3 bring up the brightness meter and the meter moves. For months I treated that as a broken key, because the picture never got any darker. Volume, mute, and the keyboard backlight were fine. The screen just sat there at full blast.

The machine:

Samsung Galaxy Book2 Pro, the 15 inch one.

Board name NP950XED-KA1IN.

Product name in DMI is 950XED.

SKU is SCAI-ICPS-A5A5-ADLP-PRGF.

BIOS P11RGF.057.230404.ZQ.

The panel is a Samsung Display OLED, EDID name ATNA56YX02-1. Graphics are Intel Iris Xe on Alder Lake-P. The driver in use is i915, not xe. Kernel when this was fixed: 7.0.0-38-generic, Ubuntu 26.04.1 LTS.

I came from Ubuntu 24.04, where I had been using the normal GNOME desktop on X11. Ubuntu 26 dropped the X11 session for GNOME. I installed Cinnamon 6.4 instead, which still starts an X11 session. Cinnamon is not what fixed the brightness. The keys were already reaching the desktop. The panel was ignoring the value they wrote.

What it looked like before the fix

Pressing the brightness keys did this:

The on-screen meter moved.
/sys/class/backlight/intel_backlight/brightness moved with it.
The OLED did not.

I watched the file while pressing the keys. max_brightness was 65535. The current value jumped around 62324, then 20577, then 43057, depending on where the meter was. type was “raw” and scale was “unknown”. That shape, a 16-bit raw backlight, is the PWM interface. This panel does not listen to PWM. The firmware table that i915 trusts on this model tells the driver to use PWM anyway, so the driver happily updates a register the OLED never reads.

Cinnamon was doing its job. csd-power logs “using backlight-helper” at login, and the helper can write that sysfs file through polkit. Idle dim on battery was also writing it. None of that reached the panel.

The app I used to use, and why I stopped

On 24.04 I installed Brightness Controller because the keys felt dead. The package still on this machine was brightness-controller 2.3.4-4~ubuntu23.10.1, left over from the Archisman Panigrahi PPA. That PPA file is pinned to Ubuntu 23.10 (mantic) and is disabled. Ubuntu 26 has no newer build.

Launching it on 26.04 dies immediately:

    qtpy.QtBindingsNotFoundError: No Qt bindings could be found

python3-qtpy is installed. PyQt5, PyQt6, and PySide6 are not. On 26.04, python3-qtpy no longer pulls a real Qt toolkit in by itself. The desktop file runs with Terminal=false, so a click from the menu just does nothing. Exit code is 1.

Even when that app worked, it was the wrong tool. It does not touch the backlight. It runs xrandr and darkens the pixels. My saved config at ~/.config/brightness_controller/settings still says brightness = 21 for eDP-1. If the app ever starts again, it will slam the image down to 21 percent on launch. I am leaving it alone. Installing python3-qtpy-pyqt5 would make the window open, and I still would not want it.

The actual fix:

i915 has a module parameter for this. From the driver:

    -1   automatic, follow the firmware table. This is the default, and it is what was failing.
     0   off, PWM only
     1   enable the AUX backlight
     2   force the VESA AUX interface
     3   force Intel's own eDP backlight interface

On this NP950XED the value that works is 3. People with the same chassis hit the same wall years ago: the meter and actual_brightness move, the glass does not, and loading i915 with enable_dpcd_backlight=3 makes the panel follow. The driver’s own hint, when it refuses the Intel interface, is to boot with that parameter set to 3.

It does not change GPU clocks, panel self-refresh, or PCIe power management. I already had other boot options for the disk and for sleep. Those stayed. I did not add enable_psr changes, and I did not turn MST off. Guides that pile those on are solving other problems and will change how the machine behaves.

The line in /etc/default/grub, after the edit:

    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nvme_core.default_ps_max_latency_us=0 pcie_aspm=off mem_sleep_default=shallow i915.enable_dpcd_backlight=3"

The two older lines above it are comments. I left them. GRUB_CMDLINE_LINUX stays empty.

crashkernel=2G-4G:320M,4G-32G:512M,32G-64G:1024M,64G-128G:2048M,128G-:4096M shows up on the real command line even though it is not in that quote. It is appended by /etc/default/grub.d/kdump-tools.cfg. Leave that file alone.

The step I missed the first time:

Editing /etc/default/grub does not change the next boot. GRUB reads /boot/grub/grub.cfg, and that file is only rewritten by update-grub.

I saved /etc/default/grub at 18:02. grub.cfg was still stamped 16:48. I rebooted, and /proc/cmdline was the old line: quiet splash, the nvme option, pcie_aspm=off, mem_sleep_default=shallow, crashkernel, and no i915 parameter. The text file was right. The boot menu was not.

What actually applies it:

sudo cp /etc/default/grub /etc/default/grub.bak
sudo nano /etc/default/grub
sudo update-grub
sudo reboot

update-grub should mention Found linux image for vmlinuz-7.0.0-38-generic and exit cleanly. Then reboot. After login, cat /proc/cmdline has to contain i915.enable_dpcd_backlight=3. If it does not, grub.cfg was not regenerated. Do not edit the default file again until you have checked that.

After the reboot the command line included the parameter. The backlight file looked different, which matters more than the command line:

max_brightness   was 65535, became 400
actual_brightness sat around 121
brightness        sat around 122

A max of 400, instead of a 16-bit PWM range, means i915 is talking to the panel over the Intel eDP interface. Fn+F2 and Fn+F3 then dimmed and brightened the picture, not just the meter.

Reading the parameter itself needs root, because the sysfs file is not world-readable:

sudo cat /sys/module/i915/parameters/enable_dpcd_backlight

It should print 3. A value of -1 means the boot parameter never arrived.

If I have to undo it:

Put the old line back, or copy the backup over /etc/default/grub:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nvme_core.default_ps_max_latency_us=0 pcie_aspm=off mem_sleep_default=shallow"

Then:

sudo update-grub
sudo reboot

The parameter does not brick the boot. If a future kernel changes the meaning of the value, the check is the same: does max_brightness stay near 400, and does the glass follow the keys. If the glass stops following and max jumps back to 65535, the parameter is being ignored and this note needs another look.

These are from the keymap Ubuntu already applies to Samsung machines whose SKU contains SCAI, which this one does, plus what I actually tried.

Fn+F2 and Fn+F3. Screen brightness. Keys and the Cinnamon meter were always fine. The panel only follows them with the i915 parameter above.

Fn+F6, Fn+F7, Fn+F8. Mute, volume down, volume up. These worked before the fix and still work. The volume scancodes are mapped on purpose for this keyboard.

Fn+F9. Keyboard backlight. Works. The samsung_galaxybook driver catches the key and cycles /sys/class/leds/samsung-galaxybook::kbd_backlight from 0 to 3. In a bright room the ambient sensor can force it back off, which feels like a dead key when it is not.

Fn+F5. Touchpad toggle. Mapped to the touchpad key, and Cinnamon binds that. It should toggle the pad.

Fn+F1. Opens nothing. The key is delivered as KEY_PROG1, and Cinnamon has no shortcut on it.

Fn+F4. Display switch. Nothing is bound to it in Cinnamon. The video-outputs shortcut list is empty.

Fn+F10. Camera and mic block. The Samsung driver handles it inside the kernel. There is a camera-lens-cover switch and no on-screen meter, so it is easy to think the key is dead.

Fn+F11. If the icon is the performance mode, nothing in the keymap cycles it. The driver does expose platform profiles: low-power, quiet, balanced, performance. No key is wired to them.

Fn+F12. Fn Lock. The keyboard controller handles this. Linux is told to ignore the scancodes. There is no popup.

Keep scrolling
to read next

This Defeat is a Pause

Next note
Secret Link