Ubuntu – Can’t control cpu frequencies in 19.10 on 7390 xps 13 2-in-1


I have been unable to control the cpu frequencies using either tlp, or cpupower, or other tools. Kernel version is 5.3.0-19-generic.

I tried using intel_pstate active or turning off intel pstate with 'intel_pstate=disabled' as a kernel boot parameter, which then makes acpi-cpufreq the driver. Either way nothing controlled the cpu frequencies.

Note: I had to turn off 'secure-boot' in the BIOS to allow changing the perf policy with x86_energy_perf_policy. Still, no matter, it didn't work.

Here is the behavior:

(1) Using intel_pstate driver with policy 'performance' the cpu frequencies hover near the max 1.3GHz (around 1.25GHz). Using policy 'powersave' the cpu frequencies hover near 1.1GHz, or maybe didn't change at all. Trying to set anything with either cpupower, or the tlp settings did nothing.

(2) using acpi-cpufreq driver no settings with any of the tools (used separately) mattered.

I made sure the tools were not conflicting by using them one at a time, while removing the others from the system.

What the system does:
The cpu frequencies adjust as if they are always controlled by the 'ondemand' governor. But no matter, I cannot set the performance policy or governor or other settings to keep the cpus below any frequency – they spike up whenever they like.

I have scoured Google for two weeks now looking at everything related to my problems and tried lots of the suggestions, but nothing worked. With all tools (tlp, cpupower, cpufreqd, cpurequtils, etc.), the cpus will be default controlled by the 'ondemand' governor. (The system calls the script /lib/systemd/set-cpufreq which sets this.) I can change this, of course, but it doesn't seem to matter.

Any help is greatly appreciated.

Best Answer

Found the solution. First, do not disable intel_pstate. Second, set the tlp defaults as you like.

Next, temporarily turn off 'secure boot' in the BIOS. This is necessary for the following command to work.

Issue (I have 8 cpus, hence the 0-7)

$ x86_energy_perf_policy -c 0-7 --hwp-max 1

This sets some kind of hardware max frequency parameter (?firmware) to the lowest level so that the max cpu frequency can be changed by cpupower to the match the lowest cpu frequency. (--hwp-min 1 will set the min frequency parameter if it is not already. But you shouldn't need to do this.)

You can now turn on 'secure boot' in the BIOS again.

Then issue

$ cpupower -c all frequency-set -u 800Mhz -g powersave

with whatever speed you like and it should work. So far things are working for me. Suspend/wake does not disturb the cpu frequency settings. AC and BATT setting in tlp are honored as they should be.

Notes: The lowest power I have been able to reach is about 3.5 Watts when the system is idle. If you can get your 7390 lower, please post!

Related Question