Jump to content

Steam Deck

From ArchWiki
Note This article discusses use of the Steam Deck with plain Arch Linux, not SteamOS. While the latter is an Arch-based distribution, it has several packages that differ from the official repositories, and is not supported by the Arch Linux community.
Hardware PCI/USB ID Working?
microSD card reader 1217:8621 Yes
Wi-Fi (LCD/Jupiter) 10ec:c822 Yes
Wi-Fi (OLED/Galileo) 17cb:1103
GPU (LCD/Jupiter) 1002:163f Yes
GPU (OLED/Galileo) 1002:1435
Audio 1022:15e2 Yes
Bluetooth (LCD/Jupiter) 13d3:3553 Yes
Bluetooth (OLED/Galileo) 17cb:1103
Touchscreen 2808:1015 Yes
Steam Deck controls 28de:1205 Yes

The Steam Deck is a gaming-focused handheld PC from Valve. Since it is completely unlocked and by design has full Linux driver compatibility, it can easily be used as an all-purpose handheld PC with Arch Linux.

Accessibility

The firmware has white text on black background, which should be fine with OCR. Blind users may still want to request the help of a sighted person to change firmware settings or selecting a boot device.

Navigation can be done with a keyboard and mouse, or the physical buttons (DPad and A,B,X,Y) and tactile screen of the device.

There is a single LED at the top of the device. On the OLED version it provides diagnostic codes.

Installation

You can install Arch Linux from the SteamOS "Desktop Mode", although this way of installing is more involved than using a USB flash installation medium through the microSD card slot or the USB-C port.

If you choose to use an Arch Linux installation medium, hold down Volume Down and press the Power buttons to boot on it when starting up the deck.

Firmware

Updating the firmware works with fwupd.

For the LCD models, firmware F7A0131 is the first to enable support for the amd_pstate CPU frequency scaling driver.

Shortcuts

  • Hold down Volume Up and press the Power button to access the UEFI settings,
  • Hold down Volume Down and press the Power button to access the UEFI boot menu (called "Boot Manager" in Valve's documentation),
  • Hold down ("Three Dots" button under the right touchpad) and press the Power button to access Valve's boot loader menu,
  • Hold down Volume Down+Power+⋯ ("Three Dots" button under the right touchpad) to reset the UEFI settings to their defaults (keep the two buttons other than Power held after the first blink of the LED: the LED will blink during the operation and stop once done, then release the buttons).
  • With the Deck turned off and plugged into the charger, hold down Volume Up+⋯ ("Three Dots" button under the right touchpad) for 10 seconds, and then unplug the Deck to enter Battery Storage Mode. On LCD models the LED will then flash 3 times, on OLED models the LED will blink blue twice. Battery Storage mode also be entered from the UEFI through Setup Utility > Power Menu.

Audio

The LCD model's built-in audio works out of the box since kernel version 6.1.

For the OLED model's built-in audio, linux has nominal support since version 7.0.10, but still may break audio after resuming from suspend. Also, alsa-ucm-conf and sof-firmware do not yet include compatible topology and firmware files.

The suspend problem is fixed in patched kernels such as cachyos-deckify; version 7.1.3-2 from CachyOS's repository was observed to work perfectly with contemporary Arch Linux.

The necessary topology and firmware files, known collectively as the steamdeck-dsp package, can be compiled from source; alternatively, a lightweight build is maintained in CachyOS's repository. Installing via any means a build of steamdeck-dsp that's not much older or newer than the rest of the system will enable the kernel to drive the audio.

PipeWire

Some applications, notably Wine, cause audio crackling on the OLED Deck's built-in speakers. When using pipewire-pulse, this can be fixed by increasing the minimum quantum size in pipewire.conf:

default.clock.min-quantum = 256

256 is the lowest value that has been observed to work well with wine. Higher, safer values of 512 or 1024 can also be used.

Controller

The built-in game controller works out of the box, but is in lizard mode [1][2] by default. In this mode, the touchpads act as a mouse, and some buttons as keys, while other buttons do nothing. Presumably, it is intended to be used outside of gaming, for general computing tasks. The controller could be switched into gamepad mode [3] by holding down the button, and vice-versa. In gamepad mode, all actions on the controller result in some event, but the events differ significantly from lizard mode:

Key / Button / Action Lizard mode input event Lizard mode PC equivalent Gamepad mode input event
KEY_TAB Tab key BTN_SELECT
KEY_ESC Esc key BTN_START
D-pad Up KEY_UP key BTN_DPAD_UP
D-pad Left KEY_LEFT key BTN_DPAD_LEFT
D-pad Right KEY_RIGHT key BTN_DPAD_RIGHT
D-pad Down KEY_DOWN key BTN_DPAD_DOWN
Left analog stick move from up to down - - ABS_Y, from -32767 to 32767
Left analog stick move from left to right - - ABS_X, from -32767 to 32767
Right analog stick move from up to down - - ABS_RY, from -32767 to 32767
Right analog stick move from left to right - - ABS_RX, from -32767 to 32767
Press on left analog stick - - BTN_THUMBL
Press on right analog stick - - BTN_THUMBR
A KEY_ENTER Enter key BTN_SOUTH
B KEY_ESC Esc key BTN_EAST
X - - BTN_NORTH
Y - - BTN_WEST
Left touchpad swipe from up to down REL_WHEEL, REL_WHEEL_HI_RES Vertical mouse wheel scroll ABS_HAT0Y, from -32767 to 32767
Left touchpad swipe from left to right REL_HWHEEL, REL_HWHEEL_HI_RES Horizontal mouse wheel scroll, found on some mice ABS_HAT0X, from -32767 to 32767
Press on left touchpad - - BTN_THUMB
Right touchpad swipe from up to down REL_Y Vertical mouse movement ABS_HAT1Y, from -32767 to 32767
Right touchpad swipe from left to right REL_X Horizontal mouse movement ABS_HAT1X, from -32767 to 32767
Press on right touchpad BTN_LEFT Mouse left-click BTN_THUMB2
Steam - - BTN_MODE
- - BTN_BASE
L1 - - BTN_TL
R1 - - BTN_TR
L2 BTN_RIGHT, when fully pressed Mouse right-click ABS_HAT2Y, from 0 (fully depressed) to 32767, and then BTN_TL2
R2 BTN_LEFT, when fully pressed Mouse left-click ABS_HAT2X, from 0 (fully depressed) to 32767, and then BTN_TR2
L4 - - BTN_GRIPL
R4 - - BTN_GRIPR
L5 - - BTN_GRIPL2
R5 - - BTN_GRIPR2

There are also -, +, keys found on the Steam Deck, not controlled by the built-in Steam Controller, so they aren't in the table. They emit KEY_VOLUMEDOWN, KEY_VOLUMEUP, KEY_POWER events, respectively.

One of the following methods can be used to remap the controller for gaming.

Raw

On some kernel-firmware-game combinations, the Steam Deck's controller will detect that a game is trying to use it, and switch from lizard mode to emulating a simple Xbox-compatible controller until the game is exited. While this precludes use of touchpads, gyros, and extra buttons that a basic Xbox controller would not have, it requires no configuration and may be preferred over more involved methods for some games.

sc-controller

You can use sc-controller as an alternative to Steam Input.

If the C0rn3j fork listed above gives you trouble with the right touchpad only working as a joystick mouse, or with the right joystick refusing to work in game, try the kozec beta branch.

This is useful if you wish to use complex profiles without using Steam, for non-Steam games, or as a fix for games that send double inputs.

You can use this while using Steam, just ensure the profile you wish to use is selected before launching a game. If you want to go back to the Steam driver, disable sc-controller from its GUI using the green "burger" button on the top left: if Steam is already open it will automatically switch.

Steam Input

Steam Input can detect and remap the Deck's controls, complete with complex tools such as gyros and capacitive thumbsticks. If Steam is being used to run games, using it to also handle controller mapping may be desirable.

Even if Steam is not being used to run games, it can still serve a dedicated controller remapper – it will create a virtual Xbox-compatible controller under /dev/input that respects the mapping configured in the Steam client and can be used by any application. If Steam's role is limited to remapping controls, it can optionally be set to permanent offline mode, and in case of the Flatpak version, most permissions can be revoked.

OpenSD

Available via opensd-gitAUR, OpenSD is a highly-configurable userspace driver for the Steam Deck. It aims to be lightweight, very fast and provide a way to fully utilize the hardware. Configuration is done through text files and it provides a great user's manual.

Display

Orientation

On Wayland, the display and the touchscreen may or may not need a manual configuration, it depends on the compositor used. For example, while in Sway both the orientation and the touchscreen are landscape, in wayfire both need to be explicitly configured. The compositor may or may not honor the 'video' kernel parameter.

On Xorg, a manual orientation fix may be needed depending on the display manager used. If the screen defaults to portrait, it can be rotated using xrandr.

$ xrandr --output eDP-1 --rotate right

The touchscreen can then be mapped to the proper orientation using xinput.

$ xinput --map-to-output 'pointer:FTS3528:00 2808:1015' eDP

To have this persist on reboots, create an autostart script.

Refresh rates

This article or section needs expansion.

Reason: Check which rates are auto-detected on the BOE OLED, experiment with forced KMS on both Samsung and BOE OLEDs, experiment with EDID editing. (Discuss in Talk:Steam Deck)

The Steam Deck's display supports a wide range of refresh rates, but display managers will not auto-detect most of them.

On LCD models, only 60Hz is auto-detected, but 50Hz works well when force-enabled via KMS:

video=eDP-1:800x1280M@50

On OLED models with the Samsung display, 90Hz and 60Hz are auto-detected.

Brightness

If your monitor is unusually dimmed while booting, give priority to the vendor ACPI driver with a kernel parameter:

acpi_backlight=vendor

Gamut

The OLED models are billed as HDR-capable and have a much wider gamut than sRGB, but this causes sRGB-targeting content, including most games, to appear greatly oversaturated.

Fortunately, the display's EDID exposes fairly accurate color information, which can be used to good effect even without any calibration hardware.

As of 7.1.4, linux cannot yet properly read that EDID, but specialized kernels like cachyos-deckify and neptune can, which enables GNOME and KDE to automatically generate an accurate ICC profile that can be used with various desktop applications.

To set up the same color correction for games, run displaycal GUI on the Deck, tell it to generate its own ICC profile from EDID (this is recommended over re-using the profile generated by GNOME since that uses a newer version of the ICC format), then convert that profile to a LUT via DisplayCAL's 3D LUT Maker. This LUT can then be injected into games via vkbasaltAUR.

The above was observed to give excellent results on the Samsung OLED. An even better method would be to tell AMDGPU to load the LUT into its color management pipeline, but while technical capability to do this is being adopted into mainline, documentation is scarce.

Status LED

The Steam Deck OLED provides a multi-colored LED on top of the device for status diagnostic, over the purely white from the Steam Deck LCD. Valve provides a basic list for troubleshooting, but it actually displays more information:

  • Static green: Unit's battery is fully charged and has recognized the power supply (PSU) plugged in and is charging.
  • Static white: Unit has recognized the power supply plugged in, is charging, and the power supply is equal to or better than the official PSU (40 W).
  • Static orange: Unit has recognized the power supply plugged in and is slow charging due to the PSU.
  • Blinking white: Unit is in process of booting.
  • Single white flash: Forced shutdown.
  • Blinking blue: Unit is applying updates.
  • 3 quick red flashes: Unit does not have enough battery charge to boot.
  • Static red: Unit too hot to boot (temperature detected over 95 C).
  • Off: Unit is not plugged in or does not recognize power supply being used.

Fan controls

The Steam Deck's fan control can be enhanced by a daemon provided in Valve's jupiter repository, but are fully functional without it.

If you are using a mainline kernel, you need patches from Valve's kernel to expose the corresponding ACPI functionality, for example by installing the user-adapted steamdeck-dkmsAUR ACPI platform driver in DKMS form.

Battery limiting

If you leave your Steam Deck docked or with the charger plugged in, then it is worth to set a charging limit to a value below 100% to improve the battery life. Either valve's neptune kernel or mainline kernel with kernel patch from valve applied is needed (Example: using steamdeck-dkmsAUR). Then, limiting battery charge level can be achieved by writing the target limit in /sys/class/hwmon/hwmonX/max_battery_charge_level where hwmonX is directory containing name file with steamdeck_hwmon written on it. Example for setting charge limit to 80 percents:

$ echo 80 | sudo tee $(grep -l "steamdeck_hwmon" /sys/class/hwmon/hwmon*/name | sed "s/name$/max_battery_charge_level/")

This can also be set persistently with a udev rule:

/etc/udev/rules.d/99-battery.rules
ACTION=="add|change", SUBSYSTEM=="hwmon", ATTR{name}=="steamdeck_hwmon", ATTR{max_battery_charge_level}="80"


Tip
  • 65% is the optimal charge limit in terms of longevity.
  • 70 – 80% are more practical if you undock your Steam Deck at times.

Mimic SteamOS behavior

Note Compared to a stock SteamOS install, Steam will be missing widgets to adjust "Framerate Limit" and "Thermal Power (TDP) Limit". See Gamescope and AMDGPU#Manual for how to make the same adjustments manually.

Auto-login

To set your system to automatically login without password:

  1. Setup automatic login to virtual console.
  2. Add your desktop environment's startup command to your login shell script.

Big Picture Networking

To enable Steam Big Picture networking support, you must use NetworkManager.

Steam client integration

You can launch steam with the -steamdeck launch option to enable fullscreen UI elements such as login and client updates.

On-screen keyboard

See KDE#Plasma Mobile, GNOME on-screen keyboard or List of applications/Utilities#On-screen keyboards for information on how to set up an on-screen keyboard.

Steam's on-screen keyboard also fully works, but Wayland will by design prevent it from interacting with other applications' windows. The lib32-extestAUR library can be injected into Steam to effectively remove this boundary, but this weakens the security inherently offered by Wayland.

See also