| Component | Detail |
|---|---|
| Laptop | ASUS ProStudio W7604 (W7604J3 family) |
| CPU | Intel Core i9-13980HX (Raptor Lake-HX, 24 cores / 32 threads) |
| OS | Arch Linux, KDE Plasma |
| Bootloader | systemd-boot (/boot/loader/entries/linux.conf) |
| Shell | fish |
The system was experiencing severe CPU frequency throttling under sustained multi-core load, specifically during long compilation jobs. The CPU would briefly run at higher frequencies for 10–15 seconds, then drop and hold at a fraction of its rated performance for the entire remainder of the workload.
This made compilation jobs significantly slower than expected for a high-end mobile workstation CPU.
stress-ng --cpu 0, CPU frequencies would burst to ~3.8 GHz for roughly 10–15 seconds, then permanently settle to:
platform_profile and throttle_thermal_policy sysfs interfaces were not present — standard ASUS Linux tooling had no effect on the systemscaling_available_frequencies (under acpi-cpufreq) reported a maximum of 2.401 GHz — the firmware was presenting a throttled P-state table to the OSCORE LAYOUT
Total cores: 24
Total threads: 32
P-cores: 8 x Intel Raptor Cove architecture (HT = 2 threads each = 16 threads)
E-cores: 16 x Intel Gracemont architecture (1 thread each = 16 threads)
FREQUENCY SPECIFICATIONS (Intel spec)
P-core base frequency: 2.2 GHz
P-core max turbo (single): 5.6 GHz
P-core max turbo (all-core): ~3.5-4.5 GHz (workload dependent)
E-core max turbo: 4.0 GHz
E-core base frequency: 1.6 GHz
Note: The 5.6 GHz figure is the single-core Intel Turbo Boost Max 3.0 peak for the best-performing P-core. All-core sustained turbo under full load is significantly lower and depends entirely on power limits and thermal headroom.
CURRENT OBSERVED FREQUENCIES UNDER LOAD (this system)
Burst phase (~10-15s): ~3.2-3.8 GHz P-cores, limited by PL2=130W
Sustained phase (after burst): previously ~2.8 GHz P / ~2.3 GHz E at 55W
now ~3.2-3.8 GHz P / ~2.4 GHz E at 100W
CPU cores in /proc/cpuinfo: cpu0-cpu15 = P-cores (logical)
cpu16-cpu31 = E-cores
LINUX DRIVER NOTE
With intel_pstate=active, scaling_max_freq correctly reports 5.4 GHz for P-cores. With intel_pstate=disable (acpi-cpufreq), the ACPI _PSS table incorrectly reported 2.401 GHz as the ceiling for all cores — this was one of the early misdiagnoses in this session. The 4.0 GHz E-core ceiling previously caused confusion because intel_pstate in some modes reads it as the global hardware turbo limit, incorrectly capping P-cores at 4.0 GHz as well.
File: /boot/loader/entries/linux.conf (options line)
acpi_enforce_resources=lax — Allows asus-isa-000a hwmon driver to load. Exposes /sys/class/hwmon/hwmonX/pwm1_enable and pwm2_enable. Required for any fan control from the OS side.intel_pstate=active — Uses Intel P-state driver directly. Bypasses ACPI _PSS table which incorrectly caps at 2.4 GHz. Correctly exposes 5.4 GHz scaling_max_freq. Note: intel_pstate=disable was tried and reverted — it caused acpi-cpufreq to read the _PSS table and cap frequencies at 2.401 GHz, making performance worse./etc/throttled.conf)intel-rapl-mmio) RAPL domainsKey settings in [AC] section:
Enabled: True
Update_Rate_s: 5
PL1_Tdp_W: 100
PL1_Duration_s: 128
PL2_Tdp_W: 130
PL2_Duration_s: 0.002
Trip_Temp_C: 95
Note on PL2: Intel spec for i9-13980HX is 55W base TDP / 157W max turbo. 130W is a conservative, thermally safe choice for PL2. ASUS ROG Turbo mode sets PL1=170W/PL2=175W on the same CPU — so 130W has plenty of headroom.
systemctl enable --now throttled
File: /usr/local/bin/asus-performance-mode.sh
Service: /etc/systemd/system/asus-performance-mode.service
systemctl enable asus-performance-mode.service
What it does at every boot:
modprobe acpi_call / modprobe msrecho '\_SB.ATKD.FANL 0x02' > /proc/acpi/call — Calls ACPI method to set EC thermal profile to performance. Causes EC fans to spin up more aggressively. MUST be called at every boot — EC resets to conservative profile on reboot.intel-rapl:0 and intel-rapl-mmio:0ASUS hwmon device: /sys/class/hwmon/hwmon12 (may renumber on reboot; use: grep -rl "^asus$" /sys/class/hwmon/*/name to find it)
Mode values: 0 = full speed (EC hands off), 2 = EC automatic control
# Force full speed:
echo 0 > /sys/class/hwmon/hwmon12/pwm1_enable
echo 0 > /sys/class/hwmon/hwmon12/pwm2_enable
# Return to EC auto:
echo 2 > /sys/class/hwmon/hwmon12/pwm1_enable
echo 2 > /sys/class/hwmon/hwmon12/pwm2_enable
Note: FANL 0x02 performance profile causes the EC automatic curve to be more aggressive than the default conservative profile.
/etc/default/cpupower-service.conf)GOVERNOR='performance'
MIN_FREQ="800MHz"
MAX_FREQ="5600MHz"
systemctl enable cpupower
Sustained CPU package power: ~100W (up from 55W)
Sustained P-core frequency: ~3.2-3.8 GHz all-core under load
Max CPU temperature: ~93C under heavy load
Fans: EC automatic, performance profile
intel_pstate=disable / acpi-cpufreq — reads ACPI _PSS table which caps at 2.401 GHz; made performance worse; reverted to intel_pstate=activeintel_pstate=passive — same _PSS table ceiling problem; did not fix the frequency capcpupower frequency-set -u 5400000 — ignored when hardware limit is reported as 4 GHz; no effect against firmware-level capsscaling_max_freq overrides per-core — writing 5600000 to individual cores did not change sustained frequency under loadintel-rapl:0) — the intel-rapl-mmio domain was independently capped at ~55W; MSR writes had no effect because MMIO domain was the binding limitwrmsr -a 0x1FC 0xe40050 (one-shot) — EC reasserts bit 0 within milliseconds; no lasting effect\_SB.ATKD.CWAP with values 0x00-0x05) — just OR-masks an in-memory flag; no connection to BD_PROCHOT; all calls returned success but had zero effectDisable_BDPROCHOT: True — EC reasserts within milliseconds; BD_PROCHOT is a symptom, not the root causeintel-rapl-mmio (MCHBAR/MMIO) RAPL domain has an independent ~55W PL1 cap that the EC resets every few seconds. This is the binding power limit. throttled writing both MSR and MMIO domains every 5 seconds is the correct fix because the EC reset cadence is multi-second (winnable by a daemon), unlike BD_PROCHOT which is reset in microseconds.\_SB.ATKD.FANL 0x02 via acpi_call sets the EC to its performance thermal profile. Must be applied at every boot — the EC resets to conservative profile on every reboot.#!/usr/bin/env fish
echo "=== GOVERNOR ==="
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo "=== FREQUENCIES ==="
cat /proc/cpuinfo | grep "MHz"
echo "=== TEMPS ==="
sensors 2>/dev/null | grep -E Core | grep -oP '\+\K[0-9]+\.[0-9]+(?=°C\s+\()' | sort -n | awk 'NR==1{min=$0} END{print "Min: " min "°C Max: " $0 "°C"}'
echo "=== FANS ==="
sensors 2>/dev/null | grep -i fan
watch -n .2 ~/sysmon.fish
while true
set e1 (cat /sys/devices/virtual/powercap/intel-rapl/intel-rapl:0/energy_uj)
sleep 1
set e2 (cat /sys/devices/virtual/powercap/intel-rapl/intel-rapl:0/energy_uj)
echo (math "($e2 - $e1) / 1000000")" W"
end
echo 0 | tee /sys/class/hwmon/hwmon12/pwm1_enable
echo 0 | tee /sys/class/hwmon/hwmon12/pwm2_enable
# set back to 2 to return to automatic