From Fedora 42 to 43 : after upgrade CPU frequency locked and how to go back to "regular clocking"

Fedora 43 – CPU Frequency Locked After Upgrade (Intel P-state / HWP Mode)

Context

After upgrading from Fedora 42 to Fedora 43, some users observed that the CPU frequency became capped at the base clock, even when Turbo Boost was enabled.
Example output from cpupower:

$ sudo cpupower frequency-info
driver: intel_pstate
hardware limits: 400 MHz – 1.60 GHz
current policy: frequency should be within 1.60 GHz and 1.60 GHz
current CPU frequency: 1.60 GHz

All cores were stuck at the same base frequency, and the files
/sys/devices/system/cpu/cpufreq/scaling_* were missing.


Root Cause

Starting with Fedora 43 (kernel ≥ 6.13), Intel CPUs automatically enable HWP (Hardware P-state) through the intel_pstate driver.
In this mode, the firmware—not the Linux kernel—controls frequency and power states.

As a result:

  • The firmware restricts the maximum CPU frequency to the base clock.
  • Kernel tools such as cpupower and the scaling_* sysfs interfaces can no longer override this behavior.

This effectively removes software control over frequency scaling.


Solution – Disable Intel P-state and Use acpi-cpufreq

Disabling the Intel P-state driver forces the kernel to fall back to the traditional acpi-cpufreq interface, restoring manual frequency scaling.

1. Edit the GRUB configuration

sudo nano /etc/default/grub

Locate the line:

GRUB_CMDLINE_LINUX="rd.luks.uuid=... rhgb quiet"

Append intel_pstate=disable inside the quotes:

GRUB_CMDLINE_LINUX="rd.luks.uuid=... rhgb quiet intel_pstate=disable"

2. Regenerate the GRUB menu

For BIOS systems:

sudo grub2-mkconfig -o /boot/grub2/grub.cfg

For UEFI systems:

sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg

3. Reboot

sudo reboot

Verification

After reboot:

sudo cpupower frequency-info

Expected result:

  • The active driver is acpi-cpufreq.
  • All standard governors (ondemand, performance, powersave, etc.) are available.
  • Turbo Boost is supported and active.

Additional Notes

  • Frequency variations under load are normal with Turbo Boost.

  • To disable Turbo Boost temporarily:

    echo 0 | sudo tee /sys/devices/system/cpu/cpufreq/boost
    

    Re-enable it with:

    echo 1 | sudo tee /sys/devices/system/cpu/cpufreq/boost
    
  • To monitor live frequencies:

    watch -n1 "grep 'cpu MHz' /proc/cpuinfo"
    
  • To set the governor persistently:

    sudo cpupower frequency-set -g performance
    

Summary

Step Action Command
Detect issue CPU locked at base frequency cpupower frequency-info
Identify cause intel_pstate HWP mode active
Fix Disable Intel P-state in GRUB intel_pstate=disable
Rebuild GRUB Update configuration sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Verify Confirm acpi-cpufreq driver cpupower frequency-info

:warning: Edit: After discussions, see below, the problem is not driver related, the fix suggested above does not solve the problem.

Do you know why the upgrade to F43 would trigger this? The kernel has been ≥ 6.13 since F41 was the latest release.

This command applies to both BIOS and UEFI systems. The config on the /boot/efi partition is a stub that you should not overwrite with grub2-mkconfig.

However, instead of editing /etc/default/grub and regenerating the config, it would be cleaner to use the grubby command.

NO !!!
That command should give you an error, and only the first one you show for BIOS systems has been used for quite some time. Ever since f32 or thereabouts. If you actually complete that command it would break booting with new kernels when updated.

There are 2 symlinks in /etc that are relevant and show what I am saying.

$ ls -l /etc/grub2*
lrwxrwxrwx. 1 root root 22 Aug  5 19:00 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
lrwxrwxrwx. 1 root root 22 Aug  5 19:00 /etc/grub2-efi.cfg -> ../boot/grub2/grub.cfg

There are 3 valid commands that all perform the exact same job on all non-atomic systems, whether legacy (MBR) boot or UEFI boot.
sudo grub2-config -o /boot/grub2/grub.cfg
sudo grub2-config -o /etc/grub2.cfg
sudo grub2-config -o /etc/grub2-efi.cfg

The file /boot/efi/EFI/fedora/grub.cfg is a static pointer file that is created at the time of installation and never gets changed after that. Its job is to redirect grub to the real grub.cfg file at /boot/grub2/grub.cfg.

Yes, you are right, wrong copy/paste, I tried the faulty one before, I correct myself right away.

I don’t know why it triggered it, I was up to date before upgrading.

Maybe I didn’t notice before and was more attentive after upgrade, but I think i’d notice such a downgrade (I noticed though that CPU consumption rose after upgrade).

About grubby I’m not familiar with the command, sudo grub2-mkconfig -o /boot/grub2/grub.cfg did the trick. What would have been the grubby way ?

sudo grubby --update-kernel=ALL --args="intel_pstate=disable"

That replaces both the edit to /etc/default/grub and the grub2-mkconfig step.

I think HWP / intel_pstate is part of the kernel for much longer.
It was introduced some time between 2013-2014 (I think kernel 3.9). Since kernel 5.18 the kernel automatically decides whether to use intel_pstate in active (direct control) or passive mode (f scaling exposed to cpufreq) or acpi_cpufreq (fallback for unsupported CPUs).

If it’s supported, intel_pstate should be used because it’s much faster and more efficient than acpi-cpufreq.

If your issue appeared with upgrading to f43, it is likely that you are experiencing a regression that should be reported.

After returning back to intel_pstate, what do the following commands tell you:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver 
cat /sys/devices/system/cpu/intel_pstate/status  
cpuid | grep HWP   

Well, I switched back to intel_pstate using @pg-tips grubby suggestion, and CPU clocking limit seemed to still not be here.

To sum up, my issue:

  1. Upgrade from f42 (fully updated) to f43
  2. CPU freq topped @1.6GHz
  3. Switch to acpi-cpufreq as scaling drvier
  4. CPU freq limit disappears, up to 3.4GHz at peaks
  5. Switch back to intel_pstate
  6. CPU freq limit still not showing, up to 3.4GHz at peaks

here are the outputs of command you asked:

Before switching back to intel_pstate:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver 
acpi-cpufreq

cat /sys/devices/system/cpu/intel_pstate/status  
cat: /sys/devices/system/cpu/intel_pstate/status: Aucun fichier ou dossier de ce nom

cpuid | grep HWP   
      HWP base registers                      = true
      HWP notification                        = true
      HWP activity window                     = true
      HWP energy performance preference       = true
      HWP package level request               = false
      HWP capabilities                        = false
      HWP PECI override                       = false
      flexible HWP                            = false
      IA32_HWP_REQUEST MSR fast access mode   = false
      ignoring idle logical processor HWP req = false
      IA32_HWP_CTL MSR supported              = false
         HWP state                            = false
         IA32_XSS supported: HWP state       = false
      HWP base registers                      = true
      HWP notification                        = true
      HWP activity window                     = true
      HWP energy performance preference       = true
      HWP package level request               = false
      HWP capabilities                        = false
      HWP PECI override                       = false
      flexible HWP                            = false
      IA32_HWP_REQUEST MSR fast access mode   = false
      ignoring idle logical processor HWP req = false
      IA32_HWP_CTL MSR supported              = false
         HWP state                            = false
         IA32_XSS supported: HWP state       = false
      HWP base registers                      = true
      HWP notification                        = true
      HWP activity window                     = true
      HWP energy performance preference       = true
      HWP package level request               = false
      HWP capabilities                        = false
      HWP PECI override                       = false
      flexible HWP                            = false
      IA32_HWP_REQUEST MSR fast access mode   = false
      ignoring idle logical processor HWP req = false
      IA32_HWP_CTL MSR supported              = false
         HWP state                            = false
         IA32_XSS supported: HWP state       = false
      HWP base registers                      = true
      HWP notification                        = true
      HWP activity window                     = true
      HWP energy performance preference       = true
      HWP package level request               = false
      HWP capabilities                        = false
      HWP PECI override                       = false
      flexible HWP                            = false
      IA32_HWP_REQUEST MSR fast access mode   = false
      ignoring idle logical processor HWP req = false
      IA32_HWP_CTL MSR supported              = false
         HWP state                            = false
         IA32_XSS supported: HWP state       = false
      HWP base registers                      = true
      HWP notification                        = true
      HWP activity window                     = true
      HWP energy performance preference       = true
      HWP package level request               = false
      HWP capabilities                        = false
      HWP PECI override                       = false
      flexible HWP                            = false
      IA32_HWP_REQUEST MSR fast access mode   = false
      ignoring idle logical processor HWP req = false
      IA32_HWP_CTL MSR supported              = false
         HWP state                            = false
         IA32_XSS supported: HWP state       = false
      HWP base registers                      = true
      HWP notification                        = true
      HWP activity window                     = true
      HWP energy performance preference       = true
      HWP package level request               = false
      HWP capabilities                        = false
      HWP PECI override                       = false
      flexible HWP                            = false
      IA32_HWP_REQUEST MSR fast access mode   = false
      ignoring idle logical processor HWP req = false
      IA32_HWP_CTL MSR supported              = false
         HWP state                            = false
         IA32_XSS supported: HWP state       = false
      HWP base registers                      = true
      HWP notification                        = true
      HWP activity window                     = true
      HWP energy performance preference       = true
      HWP package level request               = false
      HWP capabilities                        = false
      HWP PECI override                       = false
      flexible HWP                            = false
      IA32_HWP_REQUEST MSR fast access mode   = false
      ignoring idle logical processor HWP req = false
      IA32_HWP_CTL MSR supported              = false
         HWP state                            = false
         IA32_XSS supported: HWP state       = false
      HWP base registers                      = true
      HWP notification                        = true
      HWP activity window                     = true
      HWP energy performance preference       = true
      HWP package level request               = false
      HWP capabilities                        = false
      HWP PECI override                       = false
      flexible HWP                            = false
      IA32_HWP_REQUEST MSR fast access mode   = false
      ignoring idle logical processor HWP req = false
      IA32_HWP_CTL MSR supported              = false
         HWP state                            = false
         IA32_XSS supported: HWP state       = false

After switching back to intel_pstate:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_driver
intel_pstate

cat /sys/devices/system/cpu/intel_pstate/status
active

cpuid | grep HWP
      HWP base registers                      = true
      HWP notification                        = true
      HWP activity window                     = true
      HWP energy performance preference       = true
      HWP package level request               = false
      HWP capabilities                        = false
      HWP PECI override                       = false
      flexible HWP                            = false
      IA32_HWP_REQUEST MSR fast access mode   = false
      ignoring idle logical processor HWP req = false
      IA32_HWP_CTL MSR supported              = false
         HWP state                            = false
         IA32_XSS supported: HWP state       = false
      HWP base registers                      = true
      HWP notification                        = true
      HWP activity window                     = true
      HWP energy performance preference       = true
      HWP package level request               = false
      HWP capabilities                        = false
      HWP PECI override                       = false
      flexible HWP                            = false
      IA32_HWP_REQUEST MSR fast access mode   = false
      ignoring idle logical processor HWP req = false
      IA32_HWP_CTL MSR supported              = false
         HWP state                            = false
         IA32_XSS supported: HWP state       = false
      HWP base registers                      = true
      HWP notification                        = true
      HWP activity window                     = true
      HWP energy performance preference       = true
      HWP package level request               = false
      HWP capabilities                        = false
      HWP PECI override                       = false
      flexible HWP                            = false
      IA32_HWP_REQUEST MSR fast access mode   = false
      ignoring idle logical processor HWP req = false
      IA32_HWP_CTL MSR supported              = false
         HWP state                            = false
         IA32_XSS supported: HWP state       = false
      HWP base registers                      = true
      HWP notification                        = true
      HWP activity window                     = true
      HWP energy performance preference       = true
      HWP package level request               = false
      HWP capabilities                        = false
      HWP PECI override                       = false
      flexible HWP                            = false
      IA32_HWP_REQUEST MSR fast access mode   = false
      ignoring idle logical processor HWP req = false
      IA32_HWP_CTL MSR supported              = false
         HWP state                            = false
         IA32_XSS supported: HWP state       = false
      HWP base registers                      = true
      HWP notification                        = true
      HWP activity window                     = true
      HWP energy performance preference       = true
      HWP package level request               = false
      HWP capabilities                        = false
      HWP PECI override                       = false
      flexible HWP                            = false
      IA32_HWP_REQUEST MSR fast access mode   = false
      ignoring idle logical processor HWP req = false
      IA32_HWP_CTL MSR supported              = false
         HWP state                            = false
         IA32_XSS supported: HWP state       = false
      HWP base registers                      = true
      HWP notification                        = true
      HWP activity window                     = true
      HWP energy performance preference       = true
      HWP package level request               = false
      HWP capabilities                        = false
      HWP PECI override                       = false
      flexible HWP                            = false
      IA32_HWP_REQUEST MSR fast access mode   = false
      ignoring idle logical processor HWP req = false
      IA32_HWP_CTL MSR supported              = false
         HWP state                            = false
         IA32_XSS supported: HWP state       = false
      HWP base registers                      = true
      HWP notification                        = true
      HWP activity window                     = true
      HWP energy performance preference       = true
      HWP package level request               = false
      HWP capabilities                        = false
      HWP PECI override                       = false
      flexible HWP                            = false
      IA32_HWP_REQUEST MSR fast access mode   = false
      ignoring idle logical processor HWP req = false
      IA32_HWP_CTL MSR supported              = false
         HWP state                            = false
         IA32_XSS supported: HWP state       = false
      HWP base registers                      = true
      HWP notification                        = true
      HWP activity window                     = true
      HWP energy performance preference       = true
      HWP package level request               = false
      HWP capabilities                        = false
      HWP PECI override                       = false
      flexible HWP                            = false
      IA32_HWP_REQUEST MSR fast access mode   = false
      ignoring idle logical processor HWP req = false
      IA32_HWP_CTL MSR supported              = false
         HWP state                            = false
         IA32_XSS supported: HWP state       = false

Hi @augenauf,

I think I narrowed it down, and seems like a regression, and it’s linked to getting back from low battery state to normal battery state:

  1. Before f43, when my battery died, and I booted again plugged, the CPU frequency was topped (sometimes below 1GHz) when my power source was estimated too low power by the system. But, as soon as my battery reserve hit 10% (from 0%) my CPU frequency was unbridled.

  2. Now, from the same state (battery dies → PC down → PC up with power plugged) it starts with CPU frequency topped @1.6GHz, but, when my battery reserve is far above 10% (~80% in my test) the CPU frequency is still bridled @1.6GHz.

  3. After soft reboot (still plugged), CPU frequency unbridled.

When you make a major change to your initial post, as you just did, it totally breaks the logic of the following discussion.
Please, in the future do not make a major change like that.

Your final post just above contains all the data you put into your edited OP and now the discussion and how you discovered the final info is mostly impossible to relate.

Duely noted, I was afraid that someone may be misguided, but the definitive tone of my first post.

I have a backup. I will revert to my initial post with a tiny note explaining that the issue was elsewhere

You can certainly mark your post showing the solution as such, which will inform readers of what you found.

OK. Quick question: should I report it as a bug in f43 somewhere ?