Alienware fan control on Linux: what actually works
There is no Command Center, but the firmware interface it used is in the mainline kernel. Here is what each layer can and cannot do, with commands run on an m18 R2.
· 8 min read
Why there is no Command Center on Linux
Alienware Command Center is a Windows application, and Dell has never shipped a Linux build. That matters less than it sounds, because AWCC was never the thing cooling the laptop. The embedded controller (EC) runs the fans from firmware thermal tables, and those tables keep running with no operating system involved. What AWCC did was select which table is active, add a fan boost on top of it, toggle G-Mode, and drive the lighting.
So a stock Linux install on an Alienware m18 R2 is not uncooled. It is stuck on whichever table the firmware defaults to, with no way to change it unless the kernel exposes the same firmware interface AWCC used. Since Linux 6.13 it does: the mainline alienware-wmi driver calls the same WMI methods, and everything below builds on that.
The layers, bottom to top
| Layer | What it is | What you can do with it |
|---|---|---|
| EC thermal tables | Firmware fan curves per profile: Quiet, Balanced, Performance, G-Mode and so on | Nothing directly. Pick a table; the EC runs it. |
alienware-wmi | Mainline driver for the AWCC WMI interface. Since 6.15 it is built from alienware-wmi-base, -legacy (pre-2018 lighting, HDMI, amplifier) and -wmax (thermals). | Select a profile, read fan RPM and temperatures, write a fan boost. |
platform_profile | The kernel's generic profile API: per-driver nodes under /sys/class/platform-profile/ since 6.14, plus the older aggregate at /sys/firmware/acpi/platform_profile. | The sysfs files you actually write to. |
dell-smm-hwmon | The old Dell SMM BIOS interface (i8k). Direct pwm* fan control on a DMI whitelist of models. | Direct fan duty on whitelisted machines. Not the AWCC control plane. |
On the m18 R2 the WMAX interface is what matters. The driver only enables thermal profiles for models in its DMI table. The "Alienware m18" entry is a substring match, so the R2 is covered, and it carries the G-Mode quirk: the kernel's performance profile is G-Mode (firmware table 0xAB plus a Game Shift toggle) rather than plain Performance. Models missing from the table load the module but advertise nothing. force_platform_profile=1, force_hwmon=1 and force_gmode=1 exist as opt-ins for testing, and the kernel documentation asks you to submit your DMI string rather than live on them.
Fan RPM, temperatures and fan boost arrived in 6.16. On older kernels you get profiles but no alienware_wmi hwmon device, which is why so many older forum threads end in acpi_call scripts.
Read what your machine exposes
Run these before changing anything. The comments show output from an m18 R2 on kernel 7.2.
ls /sys/class/platform-profile/
# platform-profile-0
cat /sys/class/platform-profile/platform-profile-0/name
# alienware-wmi
cat /sys/class/platform-profile/platform-profile-0/choices
# cool quiet balanced balanced-performance performance custom
cat /sys/firmware/acpi/platform_profile_choices
# cool quiet balanced balanced-performance performance custom
grep . /sys/class/hwmon/hwmon*/name
# ... alienware_wmi ... dell_smm ... coretemp
sensors alienware_wmi-virtual-0
# CPU Fan: 1782 RPM (min = 0 RPM, max = 3700 RPM) ... CPU: +55.0°C GPU: +47.0°C
modinfo -p alienware-wmi
modinfo -p dell-smm-hwmonThree things to notice. The choices list has both balanced-performance and performance; on a WMAX machine that pairing means G-Mode is present. The hwmon lists four fans (two CPU, two GPU) with fan*_boost files but no pwm* files, because this driver has no direct duty-cycle control. And dell_smm loads too, showing pwm1 through pwm4 and even reporting "MANUAL CONTROL" while the EC is plainly running its own table. The SMM view and the WMI view are different control planes; only the WMI one matches what AWCC did.
Set a profile by hand
Write the per-driver node, not the aggregate. The aggregate refuses custom (there it is a read-only marker meaning "handlers disagree"), and once a second handler registers it only lists profiles common to all of them.
echo quiet | sudo tee /sys/class/platform-profile/platform-profile-0/profile
cat /sys/class/platform-profile/platform-profile-0/profilepowerprofilesctl set power-saver is the desktop route to the same file, but check powerprofilesctl list first. power-profiles-daemon maps its three profiles onto a platform driver only when it recognizes one; on the m18 R2 with version 0.30 it reports PlatformDriver: placeholder, which means it is adjusting intel_pstate energy preferences and leaving the alienware-wmi profile alone. When it does show a platform driver, you have two writers to one file and the last one wins.
None of this persists. Firmware does not always keep the profile across suspend, and nothing reapplies it on boot. A one-line systemd unit fixes that, or a daemon that owns the file.
The honest truth about custom fan curves
There is no fan PWM write in alienware-wmi. What the firmware offers is a boost. Per the kernel documentation, pwm = pwm_base + (fan_boost / 255) * (pwm_max - pwm_base), where pwm_base is whatever the active table wants right now. You can push a fan above the table; you cannot pull it below. The same documentation notes that on some devices the boost only works reliably in the custom profile.
Direct duty-cycle control exists only through dell-smm-hwmon, and only on models in its i8k_whitelist_fan_control list. The force=1 and ignore_dmi=1 module options skip those checks.
Caution. Those checks exist because the SMM calls hang or misbehave on machines they were not tested on, and pwm1_enable=1 disables BIOS control of that fan entirely. If the script that set it dies, the fan stays where it was left, under a CPU that can pull well over 100 W. Do not do this on an alienware-wmi machine that already has boost control.
Where Cryo fits
Cryo takes the boost route and nothing lower. In its Custom mode each fan group (CPU, GPU) follows a list of temperature-to-boost points with linear interpolation, a 3 °C hysteresis dead zone, and writes suppressed below a 5-point change. The shipped CPU curve starts at 45 °C and tops out at 95 °C; the GPU curve tops out at 87 °C. Above that, in every profile, a Thermal Guard pushes both groups to full boost when the CPU reaches 88 °C or the GPU 85 °C, holds for at least 30 seconds, and releases once both have dropped 10 °C below trip, restoring the boosts that were set before. At startup the daemon probes whether fan*_boost exists and accepts a write; if not, curves and guard disable themselves with a visible notice. All of this is verified on the m18 R2 and expected, not confirmed, on other alienware-wmi machines.
Keeping temperatures sane
On the maintainer's m18 R2 the CPU peak is a single-core 5.5 GHz hotspot on the i9-14900HX, and fans barely move it. Levers that actually change that number:
- Paste and dust. After a year or two, repasting and cleaning the fin stack does more than any software setting. Clogged fins read as "fans loud, temperatures still high."
- Undervolting is locked. Recent Dell BIOSes disable the voltage-offset interface, so tools like
intel-undervoltreturn errors. Do not spend an evening on it. max_perf_pct.echo 90 | sudo tee /sys/devices/system/cpu/intel_pstate/max_perf_pcttrims the top boost bins. On that m18 R2 it cut the single-core peak from 96 °C to 87 °C for the last few hundred MHz of single-core boost. It resets on reboot.- Turbo.
intel_pstate/no_turbois the blunt version of the same lever. - NVIDIA Dynamic Boost.
nvidia-powerdshifts power budget between CPU and GPU under load. Active is usually what you want in games. - Graphics mode. In hybrid (PRIME offload) mode the RTX 4080 sleeps in D3cold until something uses it, and its temperature reading disappears with it. In dGPU-only mode it drives the display, idles warm, and a compositor can look like load.
- thermald pulls CPU power limits near trip. It never touches Alienware fans.
Two setups, step by step
Quiet desk (docked, browsing, compiling):
echo quiet | sudo tee /sys/class/platform-profile/platform-profile-0/profileecho 85 | sudo tee /sys/devices/system/cpu/intel_pstate/max_perf_pct- Keep the laptop in hybrid graphics so the dGPU sleeps.
- Watch
sensorsfor ten minutes under your normal load; if the CPU sits above 85 °C, dropmax_perf_pctto 80 before touching fans. - Put steps 1 and 2 in a systemd unit, or run
cryoctl profile quietand let the daemon re-assert it after suspend.
Gaming (plugged in):
- Plug in first; every profile is power-limited on battery.
echo performance | sudo tee /sys/class/platform-profile/platform-profile-0/profile(G-Mode on the m18 R2), orbalanced-performanceif you want the clocks without the noise.- Confirm Dynamic Boost is running:
systemctl is-active nvidia-powerd. - If the CPU throttles anyway, cap
max_perf_pctat 90 instead of boosting fans; the GPU is the bottleneck in most games. - Set it back afterward, or let game detection do both ends: Cryo enters G-Mode when it sees a sustained dGPU game process and restores the previous profile when it exits.
Troubleshooting
Profile resets after suspend. Firmware behavior, not a bug in your script. Re-write the profile from a unit hooked to suspend.target; Cryo ships cryod-resume.service for exactly this, and it also reopens the lighting controller and NVML.
Fans stuck at max. Check cat /sys/class/hwmon/hwmon*/fan*_boost for a leftover nonzero boost and write 0. Check the profile is not performance. If Cryo is running, cryoctl status shows whether Thermal Guard is engaged; it releases only after both temperatures drop 10 °C below trip.
No hwmon fan entries. Kernel older than 6.16, or a model missing from the driver's DMI table (dmesg | grep -i alienware). The fix is a newer kernel or a DMI patch, not force_hwmon=1 on a machine nobody has tested.
Secure Boot. alienware-wmi and dell-smm-hwmon are in-tree and signed by your distribution, so Secure Boot does not block them. It does block unsigned DKMS modules: an NVIDIA driver that failed to load means no NVML and no game detection, and acpi_call never loads at all.
Cryo will not start. It requires the alienware_wmi hwmon device. Run cryoctl doctor and file the output as a model report, working or not.
Next steps
Frequently asked questions
- Can I set an exact fan RPM on an Alienware laptop in Linux?
- Not through alienware-wmi. The driver exposes a fan boost that adds to whatever the active firmware table already wants, so you can push a fan above the table but never below it. Direct duty-cycle control only exists in dell-smm-hwmon on models in its whitelist, and that interface knows nothing about the AWCC profiles. Cryo's curves and Thermal Guard use the boost.
- Is it safe to load dell-smm-hwmon with force=1 or ignore_dmi=1?
- Those options bypass the checks that keep the SMM fan calls off machines where they hang or misbehave, and pwm1_enable=1 hands you a fan the BIOS no longer manages. On an alienware-wmi machine with fan boost there is no reason to take that risk; on anything else, treat it as an experiment with a temperature monitor open.
- Why are my fans louder on Linux than they were on Windows?
- Usually one of three things: the firmware is on a different table than AWCC used to select for you, the dGPU is awake all the time because the laptop is in dGPU-only mode, or the heatsink needs cleaning and it was already loud on Windows. Check the current platform profile first, then whether the NVIDIA GPU is in D3cold at idle.
- Does Cryo work on Dell G-Series or other Alienware models?
- It is designed for the whole alienware-wmi family and probes at startup which profiles, fan boost, lighting controller and NVML exist, hiding what is missing. The only model verified so far is the Alienware m18 R2. Run cryoctl doctor on your machine and open a model report either way.