---
title: "Linux CPU Frequency Capping for Fan Noise Reduction"
aliases: [cpu frequency fan noise, pwm fan control linux, cpufreq homelab, hp elitedesk fan bios]
tags: [linux, homelab, cpu, fan-control, systemd, hp-elitedesk, power-management]
sources:
  - "daily/2026-04-30.md"
created: 2026-04-30
updated: 2026-04-30
---

# Linux CPU Frequency Capping for Fan Noise Reduction

The HP Elitedesk 800 G3 (and similar small-form-factor business PCs) exposes fan control only through BIOS — Linux `pwm` sysfs entries return `N/A` and writing to them has no effect. The only Linux-side lever for reducing fan noise is capping the CPU's maximum frequency via `cpufreq`, preventing the CPU from boosting to its turbo frequency and generating the heat that spins up the fan.

## Key Points

- HP Elitedesk 800 G3 `pwm1` (and similar) returns `N/A` — BIOS controls the fan exclusively
- Linux `lm-sensors` / `fancontrol` cannot manage this fan; any attempt silently does nothing
- Capping CPU max frequency from 3.8 GHz (boost) to 2.8 GHz is the only Linux-side noise lever
- The cap can be set persistently via a `systemd` service that runs at boot
- This trade-off reduces fan noise at the cost of peak single-core performance; sustained workloads are largely unaffected

## Details

### Confirming fan control is BIOS-only

```bash
# Check available PWM fans
cat /sys/class/hwmon/hwmon*/pwm*
# Output: N/A  ← BIOS-only; Linux cannot write to this

# Or via sensors
sensors
# fan1: will show RPM (read-only) but no controllable interface
```

### Checking current CPU frequency limits

```bash
# View current policy
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
# e.g., 3800000 (3.8 GHz turbo)

cpufreq-info   # if cpufrequtils installed
```

### Setting the cap for the current session

```bash
# Cap all cores to 2.8 GHz
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq; do
    echo 2800000 | sudo tee "$cpu"
done
```

### Persistent cap via systemd

Create `/etc/systemd/system/cpu-freq-cap.service`:

```ini
[Unit]
Description=Cap CPU max frequency to 2.8 GHz for fan noise reduction
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'for f in /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq; do echo 2800000 > $f; done'
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
```

```bash
sudo systemctl enable --now cpu-freq-cap.service
```

The cap persists across reboots.

### Alternative: cpupower

```bash
sudo apt install linux-tools-common linux-tools-$(uname -r)
sudo cpupower frequency-set -u 2800MHz
```

To make this persistent, add it to `/etc/rc.local` or a systemd `ExecStart`.

## Related Concepts

- [[wiki/concepts/proxmox-lxc-autostart]] — LXC containers on the same host; CPU throttling affects all containers
- [[wiki/homelab/_index]] — HP Elitedesk 800 G3 hardware inventory and homelab Proxmox host configuration

## Sources

- [[daily/2026-04-30.md]] — HP Elitedesk 800 G3 `pwm1` returned N/A confirming BIOS-only fan control; CPU max frequency capped at 2.8 GHz (from 3.8 GHz boost) via systemd to reduce fan noise; verified persistent across reboots
