Backlight

Screen brightness might be tricky to control. On some machines physical hardware switches are missing and software solutions may not work well. However, it is generally possible to find a functional method for a given hardware. This article aims to summarize all possible ways to adjust the backlight.
There are many ways to control brightness of a monitor, laptop or integrated panel (such as the iMac). According to
these
discussions
and this
wiki page
the control method can be divided into these categories:
brightness is controlled by vendor-specified hotkey and there is no interface for the OS to adjust the brightness.
brightness is controlled by either the
ACPI
, graphic or platform driver. In this case, backlight control is exposed to the user through
/sys/class/backlight
which can be used by user-space
backlight utilities
.
brightness is controlled by writing into a graphics card register through
setpci
.
Note
Since OLED screens have no backlight, brightness cannot be controlled by changing backlight power on laptops equipped with an OLED screen. In this case, perceived screen brightness can be adjusted with a PWM control (not implemented in the Linux kernel) or via
software color correction
.
Hardware interfaces
ACPI
The brightness of the screen backlight is adjusted by setting the power level of the backlight LEDs or cathodes. The power level can often be controlled using the ACPI kernel module for video. An interface to this module is provided via a
sysfs(5)
directory at
/sys/class/backlight/
.
The name of the directory depends on the graphics card model.
$ ls /sys/class/backlight/
acpi_video0
In this case, the backlight is managed by an ATI graphics card. In the case of an Intel card, the directory is called
intel_backlight
. In the following examples,
acpi_video0
is used. If you use an Intel card, simply replace
acpi_video0
with
intel_backlight
in the examples.
The directory contains the following files related to brightness:
$ ls /sys/class/backlight/acpi_video0/*brightness
actual_brightness  brightness         max_brightness
The maximum brightness can be read from
max_brightness
, like this:
$ cat /sys/class/backlight/acpi_video0/max_brightness
15
The brightness can be set by writing a number to
brightness
. However, its value often differs from
actual_brightness
, and it's device dependent. (See also
#Recent (2025) AMD changes
.)
# echo 5 > /sys/class/backlight/acpi_video0/brightness
Attempting to set a brightness greater than the maximum results in an error. By default, only
root
can change the brightness by this method.
To allow users in the
video
group to change the brightness, the
brightness
file's group and permissions must be changed at boot. The intuitive approach of using
GROUP=
and
MODE=
keys in a udev rule does not work here. Those keys only manage device nodes under
/dev
, and the backlight device has no
/dev
node. The brightness file is a sysfs attribute whose permissions (0644, root-owned) are
hardcoded in the kernel driver
via
DEVICE_ATTR_RW(brightness)
and are not affected by udev permission keys.
The reliable approach is to use a
RUN+=
rule that explicitly invokes
chgrp
and
chmod
on the file by its full literal path. The rule must also include a
KERNEL==
match to target only the specific backlight device. Without it, the rule fires on every backlight subsystem event, causing a flood of errors in the system journal until the sysfs file becomes available.
First, find your backlight device name:
$ ls /sys/class/backlight/
Then create the rule, substituting your device name (e.g.
acpi_video0
,
intel_backlight
or
amdgpu_bl0
):
/etc/udev/rules.d/backlight.rules
ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="acpi_video0", RUN+="/usr/bin/chgrp video /sys/class/backlight/acpi_video0/brightness"
ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="acpi_video0", RUN+="/usr/bin/chmod g+w /sys/class/backlight/acpi_video0/brightness"
After creating the file, either reboot or run:
# udevadm control --reload
# udevadm trigger --subsystem-match=backlight --action=add
Note
Entries under
/sys/class/backlight/
are symlinks to the real device path under
/sys/devices/
. Both
/sys/class/backlight/<device>/brightness
and the equivalent
$sys$devpath/brightness
refer to the same file. The hardcoded class path is used here because
$sys$devpath
substitution inside
RUN+=
has
proven unreliable
in practice across multiple systemd-udev versions.
Kernel command-line options
Sometimes ACPI does not work well due to different motherboard implementations and ACPI quirks. This results in, for instance, inaccurate brightness notifications. This includes some laptops with dual graphics (e.g., NVIDIA/AMD dedicated GPU with Intel/AMD integrated GPU). Additionally, ACPI sometimes needs to register its own
acpi_video0
backlight even if one already exists (such as
intel_backlight
), which can be done by adding one of the following
kernel parameters
:
acpi_backlight=video
acpi_backlight=vendor
acpi_backlight=native
Tip
On Nvidia Optimus laptops, the kernel parameter
nomodeset
can interfere with the ability to adjust the backlight.
On an Asus notebooks you might also need to load the
asus-nb-wmi
kernel module
.
Disabling legacy boot on Dell XPS13 breaks backlight support.
Since Linux 6.1 the backlight subsystem was
revamped
, if your backlight does not work after an update first try to remove an existing
acpi_backlight
kernel parameter. On some Optimus laptops, you can try booting with
acpi_backlight=nvidia_wmi_ec
.
Udev rule
If the ACPI interface is available, the backlight level can be set at boot using a
udev
rule:
/etc/udev/rules.d/81-backlight.rules
# Set backlight level to 8
SUBSYSTEM=="backlight", ACTION=="add", KERNEL=="acpi_video0", ATTR{brightness}="8"
Note
The systemd-backlight service restores the previous backlight brightness level at boot. To prevent conflicts for the above rules, see
#Save and restore functionality
.
Tip
To set the backlight depending on power state, see
Power management#Using a script and a udev rule
and use your favourite
backlight utility
in the script.
setpci
In some cases (e.g. Intel Mobile 945GME
[1]
), it is possible to set the register of the graphics card to adjust the backlight. It means you adjust the backlight by manipulating the hardware directly, which can be risky and generally is not a good idea. Not all of the graphics cards support this method.
When using this method, you need to use
lspci
first to find out where your graphics card is.
# setpci -s 00:02.0 F4.B=0
External monitors
Display Data Channel Command Interface (
DDC/CI
)
can be used to communicate with external monitors implementing
Monitor Control Command Set (MCCS)
over
I2C
.
DDC
can control brightness, contrast, inputs, etc on supported monitors. Settings available via the
On-Screen Display (OSD)
panel can usually also be managed via
DDC
. The
kernel module
i2c-dev
may need to be loaded if the
/dev/i2c-*
devices do not exist.
ddcutil
can be used to query and set brightness settings:
# ddcutil capabilities | grep "Feature: 10"
Feature: 10 (Brightness)
# ddcutil getvcp 10
VCP code 0x10 (Brightness                    ): current value =    60, max value =   100
# ddcutil setvcp 10 70
Alternatively, one may use
ddcci-driver-linux-dkms
AUR
to expose external monitors in
sysfs
. Then, after loading the
ddcci
kernel module
, one can use any
backlight utility
.
Note
Using
ddcci
and
i2c-dev
simultaneously may result in resource conflicts such as a
Device or resource busy
error.
Users of NVIDIA's proprietary drivers may need to add
Option "RegistryDwords" "RMUseSwI2c=0x01; RMI2cSpeed=100"
to the
Device
section in the
Xorg configuration
or the
NVreg_RegistryDwords=RMUseSwI2c=0x01;RMI2cSpeed=100
kernel module parameter
for the
nvidia
module. See
[2]
and
[3]
.
ddcutil
will fail to set some VCP features if there is a feature enabled on the monitor which already automatically adjusts them (e.g.
Dynamic Contrast Ratio
or BenQ's
Eye Care
technology).
If
ddcutil
is installed, it provides the
/usr/share/ddcutil/data/90-nvidia-i2c.conf
file, which can be copied to
/etc/X11/xorg.conf.d/
instead of manually editing
Xorg
configuration files. It also provides
/usr/share/ddcutil/data/60-ddcutil-i2c.rules
and
/usr/share/ddcutil/data/60-ddcutil-usb.rules
for
udev
rules.
Switch off the backlight
This article or section is a candidate for merging with
DPMS
.
Notes:
Same topic. (Discuss in
Talk:Backlight
)
Switching off the backlight (for example when one locks a notebook) can be useful to conserve battery energy. Ideally the following command should work for any
Xorg
graphical session:
$ xset dpms force off
The backlight should switch on again on mouse movement or keyboard input. Alternately,
xset s
could be used for a similar effect.
If the previous commands do not work, there is a chance that
vbetool
may work. Note, however, that in this case the backlight must be manually activated again. The command is as follows:
$ vbetool dpms off
To activate the backlight again:
$ vbetool dpms on
For example, this can be put to use when closing the notebook lid using
acpid
.
Save and restore functionality
The
systemd
package includes the service
systemd-backlight@.service
, which is enabled by default and "static". It saves the backlight brightness level at shutdown and restores it at boot. The service uses the ACPI method described in
#ACPI
, generating services for each folder found in
/sys/class/backlight/
. For example, if there is a folder named
acpi_video0
, it generates a service called
systemd-backlight@backlight:acpi_video0.service
. When using other methods of setting the backlight at boot, it is recommended to stop systemd-backlight from restoring the backlight by setting the
kernel parameter
systemd.restore_state=0
. See
systemd-backlight@.service(8)
for details.
Note
Some laptops have multiple video cards (e.g. Optimus) and the backlight restoration fails. Try
masking
an instance of the service (e.g.
systemd-backlight@backlight:acpi_video1
for
acpi_video1
).
Additionally, the
brillo
AUR
and
light
AUR
utilities support save and restore functionality. These two may be more useful if one wishes to restore the screen brightness on a per-user basis, however no systemd units are provided to accomplish this.
Backlight utilities
Note
The utilities in the following table can be used to control screen brightness. All of them are compatible with Wayland and do not require X. Some (like
brightnessctl
or
light
AUR
) add udev rules to allow members of the
video
(or
input
) group to modify brightness.
Package name
Controls keyboard backlights
Reacts to ambient brightness
Language
License
Notes
acpi-backlight-notify
AUR
No
No
C
MIT
Simple notification daemon for the ACPI interface (reads
/sys/class/backlight/
)
acpilight
AUR
Yes
No
Python3
GPL-3.0-or-later
"xbacklight" executable provided
backlight_control
AUR
No
No
C
MIT
Extremely small and simple. Supports relative adjustments.
blight
AUR
Yes
No
Python3
ISC
Uses logind interface. Restricted to local users, but does not require suid or video group membership.
brightd
AUR
No
No
C
GPL-2.0
Dims the screen when there is no user input for some time.
brightnessctl
Yes
No
C
MIT
-
brillo
AUR
Yes
No
C
GPL-3.0-only
Supports smooth and relative adjustments.
clight
AUR
Yes
Yes
C
GPL-3.0-or-later
Manages screen temperature (
Xorg
only) and smoothly dims brightness after a timeout. Supports ambient light sensors
[4]
. Can turn webcam into an ambient light sensor.
enlighten-git
AUR
Yes
No
C
GPL-3.0-or-later
-
illum-git
AUR
No
No
C
AGPL-3.0
Reacts to key presses.
light
AUR
Yes
No
C
GPL-3.0-only
Dependency free. Does not rely on X server.
lux
AUR
No
No
Shell
MIT
-
macbook-lighter
AUR
Yes
Yes
Bash
GPL
Macbook screen/keyboard backlight CLI and auto-adjust on ambient light.
wluma
AUR
Yes
Yes
Rust
ISC
Automatic brightness adjustment based on screen contents and ambient light. Can use webcam or time to simulate ambient light sensor. Supports keyboards and external monitors. Uses wlroots.
xbacklight-notify
AUR
No
No
C
MIT
Simple notification daemon for X11 (reads the RandR backlight property)
ybacklight
AUR
No
No
Perl
GPL-2.0
Small Perl script similar to xbacklight but using sysfs drivers.
Tip
Commands involving these utilities can be bound to the
XF86MonBrightnessUp
and
XF86MonBrightnessDown
keyboard keys as described in
Keyboard shortcuts#Xorg
.
light
Install
light
AUR
and add your user to the
video
user group
.
Increase backlight brightness by 5 percent:
$ light -A 5
Decrease backlight brightness by 5 percent:
$ light -U 5
Set backlight brightness to 100 percent:
$ light -S 100
Using DBus with GNOME
Brightness can also be adjusted as the GNOME controls do. Changes are reflected in the GNOME UI using this method.
$ gdbus call --session --dest org.gnome.SettingsDaemon.Power --object-path /org/gnome/SettingsDaemon/Power --method org.freedesktop.DBus.Properties.Set org.gnome.SettingsDaemon.Power.Screen Brightness "<int32 50>"
Steps in brightness for keyboard control can be implemented with this method as well.
$ gdbus call --session --dest org.gnome.SettingsDaemon.Power --object-path /org/gnome/SettingsDaemon/Power --method org.gnome.SettingsDaemon.Power.Screen.StepUp
$ gdbus call --session --dest org.gnome.SettingsDaemon.Power --object-path /org/gnome/SettingsDaemon/Power --method org.gnome.SettingsDaemon.Power.Screen.StepDown
Using DBus with KDE
See
https://userbase.kde.org/KDE_Connect/Tutorials/Useful_commands#Brightness_settings
.
Color correction
This article or section needs expansion.
Reason:
Which utilities require
Xorg
and which work in
Wayland
? (Discuss in
Talk:Backlight
)
Color correction does not change the backlight power, it just modifies the video
lookup table
: this means that your battery life will be unaffected by the change. Nevertheless, it could be useful when no backlight control is available (desktop PCs or laptops with OLED screens).
Clight
— User daemon utility that aims to fully manage your display. It can manage the screen temperature depending on the current time of the day, just like redshift does. It tries to use
geoclue
to retrieve the user position if neither latitude or longitude are set in the configuration file. It also supports fixed times for sunrise and sunset.
https://github.com/FedeDP/Clight
||
clight
AUR
colord-brightness
—  Set the brightness via the colord-daemon and ICC-profile under Wayland and Xorg (like icc-brightness but a better performance).
https://github.com/Nikl174/colord-brightness
||
colord-brightness
AUR
Gammastep
— Color temperature adjustment tool, a fork of Redshift.
https://gitlab.com/chinstrap/gammastep
||
gammastep
icc-brightness
— Control OLED display brightness by applying ICC color profiles.
https://github.com/udifuchs/icc-brightness
||
icc-brightness-gnome-git
AUR
Monica
— Monitor calibration tool. It works as frontend to xgamma to alter the gamma correction.
https://web.archive.org/web/20090815224839/http://www.pcbypaul.com/software/monica.html
||
monica
AUR
Redshift
— Color temperature adjustment tool. It adjusts the color temperature of your screen according to your surroundings. This may help your eyes hurt less if you are working in front of the screen at night. This program is inspired by
f.lux
.
http://jonls.dk/redshift/
||
redshift
xcalib
— Lightweight monitor calibration loader which can load an ICC monitor profile to be shared across desktop applications.
https://github.com/OpenICC/xcalib
||
xcalib
xgamma
— Alter a monitor's gamma correction.
https://xorg.freedesktop.org/
||
xorg-xgamma
Wayland
Redshift
does not support Wayland (although a
patchset
exists). But it is possible to apply the desired temperature in
tty
before starting a compositor. For example:
$ redshift -m drm -PO 3000
Otherwise some compositors can apply color correction during runtime:
On
GNOME
, the built-in
Night Light
can be used.
On
KDE Plasma
, the built-in
KDE#Night Light
can be used.
On Sway and other wlroots-based compositors, as well as Orbital, Redshift fork
gammastep
,
wlsunset
,
clight
AUR
, or
wl-gammarelay
AUR
can be used.
Xorg: adjust perceived brightness with xrandr
xrandr
may be used to adjust the perceived brightness.
To adjust perceived brightness above its maximum level (the same caveats mentioned above for Nvidia apply):
$ xrandr --output
output_name
--brightness 2
This should roughly double luma in the image. It will sacrifice color quality for brightness, nevertheless it is particularly suited for situations where the ambient light is very bright (e.g. sunlight).
This can also be used to reduce perceived brightness in a dark room by specifying some value less than 1 (e.g. 0.5), this is useful when no backlight control is available (e.g. desktop PC).
The
output name
of the connected device may be determined by calling
xrandr
:
$ xrandr | grep -w connected | cut -f '1' -d ' '
Users may find it convenient to implement this as an alias:
$ alias b='echo -e "enter brightness:\n"; read val; xrandr --output
output name
--brightness "${val}"'
To automatically call xrandr when a backlight file changes,
oled_shmoled
AUR
can be used like so:
$ oled_shmoled
output_name
NVIDIA settings
Users of
NVIDIA
's proprietary drivers can change display brightness via the
nvidia-settings
utility under "X Server Color Correction." However, note that this has absolutely nothing to do with backlight (intensity), it merely adjusts the color output. (Reducing brightness this way is a power-inefficient last resort when all other options fail; increasing brightness spoils your color output completely, in a way similar to overexposed photos.)
Troubleshooting
Backlight PWM modulation frequency (Intel i915 only)
This article or section needs expansion.
Reason:
Modern LED display using IPS panel usually utilize DC dimming instead of PWM dimming. This can be indicated by the two upper bytes of 0xC8254 register 0x0001, which means the frequency is almost infinity. (Discuss in
Talk:Backlight
)
Laptops with LED backlight are known to have screen flicker sometimes. This is because the most efficient way of controlling LED backlight brightness is by turning the LED's on and off very quickly varying the amount of time they are on.
However, the frequency of the switching, so-called PWM (pulse-width modulation) frequency, may not be high enough for the eye to perceive it as a single brightness and instead see flickering. This causes some people to have symptoms such as headaches and eyestrain.
If you have an Intel i915 GPU, then it may be possible to adjust PWM frequency to eliminate flicker.
Period of PWM (inverse to frequency) is stored in 2 higher bytes of
0xC8254
register (if you are using the Intel GM45 chipset use address
0x61254
instead). To manipulate registers values,
install
the
intel-gpu-tools
package.
To increase the frequency, period must be reduced. For example:
# intel_reg read 0xC8254
0xC8254 : 0x12281228
Then to double PWM frequency divide 2 higher bytes (4 higher hex digits) by 2 and write back resulting value, keeping lower bytes unchanged:
# intel_reg write 0xC8254 0x09141228
You can use an
online calculator
to calculate the desired value
To set new frequency automatically, consider writing an udev rule or install
intelpwm-udev
AUR
.
Inverted Brightness (Intel i915 only)
Symptoms:
after installing
xf86-video-intel
systemd-backlight.service turns off the backlight during boot
possible solution: mask systemd-backlight.service
switching from X to another VT turns the backlight off
the brightness keys are inverted (i.e. turning up the brightness makes the screen darker)
This problem may be solved by adding
i915.invert_brightness=1
to the list of
kernel parameters
.
Unable to control eDP Panel brightness (Intel i915 only)
Embedded Display Port (eDP) v1.2 introduced a new display panel control protocol for backlight and other controls that works through the AUX channel
[5]
By default the i915 driver tries to use PWM to control backlight brightness, which might not work.
To set the backlight through writes to DPCD registers using the AUX channel set
i915.enable_dpcd_backlight=1
as a
kernel parameter
.
sysfs modified but no brightness change
Note
This behavior and their workarounds have been confirmed on the Dell M6700 with Nvidia K5000m (BIOS version prior to A10) and Clevo P750ZM (Eurocom P5 Pro Extreme) with Nvidia 980m.
On some systems, the brightness hotkeys on your keyboard correctly modify the values of the acpi interface in
/sys/class/backlight/acpi_video0/actual_brightness
but the brightness of the screen is not changed. Brightness applets from
desktop environments
may also show changes to no effect.
If you have tested the recommended kernel parameters and only
xbacklight
works, then you may be facing an incompatibility between your BIOS and kernel driver.
In this case the only solution is to wait for a fix either from the BIOS or GPU driver manufacturer.
A workaround is to use the inotify kernel api to trigger
xbacklight
each time the value of
/sys/class/backlight/acpi_video0/actual_brightness
changes.
First
install
inotify-tools
. Then create a script around inotify that will be launched upon each boot or through
autostart
.
/usr/local/bin/xbacklightmon
#!/bin/sh

path=/sys/class/backlight/acpi_video0

luminance() {
    read -r level < "$path"/actual_brightness
    factor=$(printf "$max" | awk '{print 100/$1}')
    printf "$level $factor" | awk '{print int($1*$2)}'
}

read -r max < "$path"/max_brightness

xbacklight -set "$(luminance)"

inotifywait -me modify --format '' "$path"/actual_brightness | while read; do
    xbacklight -set "$(luminance)"
done
NVIDIA-only laptops with nvidia_wmi_ec_backlight
On laptops where the Intel iGPU is disabled (e.g. via a MUX switch), such as the Razer Blade 18 (2023, RZ09-0484) with i9-13950HX and RTX 4090, the
nvidia_wmi_ec_backlight
driver registers a backlight device under
/sys/class/backlight/
and accepts brightness values, but the panel brightness does not actually change. The kernel log may show:
nvidia-modeset: ACPI reported no NVIDIA native backlight available; attempting to use ACPI backlight.
Adding
acpi_backlight=native
to the
kernel parameters
resolves the issue, allowing
nvidia_wmi_ec_backlight
to properly control the panel backlight.
Note
Using
acpi_backlight=vendor
may cause the backlight interface to disappear entirely on these systems.
sysfs and xbacklight both not working
check dmesg if you have seen like this :
i915 0000:00:02.0: [drm] *ERROR* [CONNECTOR:114:DSI-1] Failed to get the SoC PWM chip
Change
/etc/mkinitcpio.conf
to match the following:
/etc/mkinitcpio.conf
...
MODULES=(i915 pwm-lpss-platform)
...
Then
regenerate the initramfs
.
Backlight not working in MATE
Make sure the
mate-power-manager
package is
installed
.
Backlight control with function keys not working on Notebooks
Some Notebook Models e.g.
Razer Blade 14
,
Lenovo Yoga Slim 7
,
Lenovo IdeaPad Gaming 3
and Acer AN517-41 have issues with backlight control, pass
acpi_backlight=video
and/or
amdgpu.backlight=0
as
kernel parameters
.
Backlight keys not working in Xfce
In xfce4, the
Xfce4 Power Manager
handles the brightness keys.
In some installations of Xfce, the "Handle display brightness keys" setting may be turned off by default.
To activate the brightness keys again, open the
Xfce Power Manager dialog
and toggle on "Handle display brightness keys":
$ xfce4-power-manager -c
xbacklight returns : No outputs have backlight property
Depending on the video card installed, sometimes xbacklight from
xorg-xbacklight
returns the message "No outputs have backlight property". Installing
acpilight
AUR
provides an alternative xbacklight that may work as expected.
Allow <5% brightness to persist on reboot (disable backlight clamp)
According to
systemd-backlight@.service(8)
, if the udev property
ID_BACKLIGHT_CLAMP
is not set to false, the brightness is clamped to a value of at least 1 or 5% of maximum brightness, whichever is greater. This restriction will be removed when the kernel allows user space to reliably set a brightness value which does not turn off the display.
To allow <5% brightness to persist on reboot, create
udev
rule:
/etc/udev/rules.d/99-backlight_clamp.rules
# Allow <5% brightness to persist on reboot (disable clamped value of 5%)
SUBSYSTEM=="backlight", ENV{ID_BACKLIGHT_CLAMP}="0"
Recent (2025) AMD changes
This article or section is being considered for removal.
Reason:
6.18 is our LTS now. (Discuss in
Talk:Backlight
)
In 2025 there were two changes for AMD laptops, affecting kernel 6.16 and backported to 6.15.5. First, the previous max brightness was <= 255, but it is now <= 65535.
[6]
Notice this means using backlight values defined before this change results in a lower brightness.
Second is the relation of
brightness
and
actual_brightness
, found under
/sys/class/backlight/amdgpu_bl0
or so. Both in the former and the new kernels, these two values are not identical. In the new behavior, actual brightness changes according to the firmware setting.
[7]
[8]
This is because the brightness curve in the firmware possibly better reflects the characteristics of the panel.
To disable this firmware curve, set the following
kernel parameter
:
amdgpu.dcdebugmask=0x40000