Skip to content

Surface Pro 7 has CPU throttled to 1500 MHz after resume from suspend #706

Description

@japostoles

My Surface becomes slow, usually after a resume from suspend.

The CPU seems to be throttled to 1500 MHz. I've tried changing powersave/performance modes, etc, but nothing seems to help other than a reboot.

I'm viewing cpu information via: watch -n 0,3 'cat /proc/cpuinfo | grep "MHz"'

Environment

  • Hardware model: Surface Pro 7
  • Kernel version: Linux pop-os 5.15.14-surface Update to upstream #1 SMP Sat Jan 15 02:27:14 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
  • Distribution: Pop!OS

Activity

  1. japostoles commented on Jan 26, 2022

    @japostoles
    Author

    This also seems to happen if the device sleeps due to low battery.

    When it comes back up, the CPU is throttled.

  2. japostoles commented on Feb 23, 2022

    @japostoles
    Author

    It's definitely related to low battery. It seems to happen when the device is < 5% on battery. The processor is throttled to 1500, and then when the battery charges up the machine is still stuck in the throttled mode.

    To replicate, allow the Surface to auto-sleep/hibernate due to low battery, and then plug in and boot up.

  3. japostoles commented on Feb 23, 2022

    @japostoles
    Author

    Letting the battery charge, and then hibernate / resume will correct the issue.

    Suspend doesn't seem to trigger the "fix".

  4. japostoles commented on Apr 18, 2022

    @japostoles
    Author

    One other thing worth nothing that I just discovered is that this issue does not occur with the standard linux kernel (specifically, I'm running PopOS). This appears to be exclusive to the linux-surface kernel.

  5. RareMv commented on Apr 18, 2022

    @RareMv

    1500 Mhz? When I'm low battery after sleep, my CPU is throttled to 500 Mhz. I'd wish for 1500 Mhz, lol. Sometimes it unstucks itself and goes back to normal after battery charges a bit, sometimes it can remain stuck at 500 Mhz even with 100% battery and I have to restart. Can't remember if I tried putting it to sleep to see if it fixes it. Neither did I try Log Off. But a restart definitely fixes it past ... 20% battery I believe.

    SP7 i5 on Fedora 35 with Surface Kernel 5.16. (5.16.17-1.surface.fc35.x86_64)

  6. willoma commented on Jul 6, 2024

    @willoma

    I have the same behaviour on my Surface Laptop Go 3, stuck at 400MHz...

  7. danielzgtg commented on Jul 8, 2024

    @danielzgtg
    Contributor

    Run the following commands to fix the throttling:

    sudo apt install msr-tools
    sudo modprobe msr
    sudo wrmsr --all 0x601 0x408

    To reduce the risk of electrical fire, do not set this MSR_VR_CURRENT_CONFIG higher than observed for your device. This is the good value for my Surface Pro 7 i7.

    I obtained it by diffing it with the rdmsr giving a bad value of 0x78 when things were throttled. This variable seems to make all the difference. Setting it to a bad value on a good boot causes bad throttling, and setting it back to the good value fixes things without restarting.

  8. Flameopathic commented on Aug 25, 2024

    @Flameopathic

    Run the following commands to fix the throttling:

    sudo apt install msr-tools
    sudo modprobe msr
    sudo wrmsr --all 0x601 0x408

    To reduce the risk of electrical fire, do not set this MSR_VR_CURRENT_CONFIG higher than observed for your device. This is the good value for my Surface Pro 7 i7.

    I obtained it by diffing it with the rdmsr giving a bad value of 0x78 when things were throttled. This variable seems to make all the difference. Setting it to a bad value on a good boot causes bad throttling, and setting it back to the good value fixes things without restarting.

    after using this fix, my computer froze, which is not something that has happened before and i do not see another possible reason for why it could have. could changing that setting have caused this?

    edit: i have an sp7 i7 and rdmsr yeilded FFF, so i just went with your values being not totally sure what i was doing.

  9. danielzgtg commented on Oct 19, 2024

    @danielzgtg
    Contributor

    @Flameopathic A freeze shouldn't happen and I never saw one. Also, don't worry, this is a per-boot temporary register, not a permanent setting.

    Your computer certainly wasn't overheating, and letting it return to normal values shouldn't cause anything different from CPU operation in a normal boot. Specifically my i7 is 512GB. This MSR is a maximum not a target, according to the Intel docs:

    Register Address: 601H, 1537 MSR_VR_CURRENT_CONFIG
    Power Limit 4 (PL4) Package
    Package-level maximum power limit (in Watts). It is a proactive, instantaneous limit.
    12:0 PL4 Value
    PL4 value in 0.125 A increments. This field is locked by VR_CURRENT_CONFIG[LOCK]. When the LOCK bit is set to 1b, this
    field becomes Read Only.

    I don't know what set yours to FFF, which looks corrupt and too high. We want to take the value from a normal boot to restore on problematic boots. Despite worrying, I set FFF for a minute and nothing froze, but I prefer the proper value. You can also search the Intel manual for LIMIT, or just loop rdmsr for all registers across good and bad boots to diff.

    If the GUI freezes, try TTY to know if there's a panic. Today I'm on 6.10.5-surface-1. If it still freezes, then try disabling secure boot (which might've caused wrmsr to freeze) and updating Surface firmware using Windows.

  10. Flameopathic commented on Oct 19, 2024

    @Flameopathic

    @danielzgtg thank you for the help and resources! everything seems to be playing a little nicer, the freeze must have been unrelated.

  11. KakeyaK commented on Nov 12, 2024

    @KakeyaK

    @danielzgtg Can I ask you for some guidance?
    I have this same problem with my Surface Pro 7 i5 256gb. However, the battery doesn't work any longer, so I cannot get the values from a good boot, as it's never happening. Do you know where I could find possibles register values to test?

  12. danielzgtg commented on Nov 13, 2024

    @danielzgtg
    Contributor

    @KakeyaK You can just use my 0x408 value. Nothing bad happened to the user who used the extreme 0xFFF value. Surfaces have other overheating protection mechanisms, and the risk so far appears to be no more than that that overclockers face.

  13. KakeyaK commented on Nov 14, 2024

    @KakeyaK

    @danielzgtg Thank you! It worked great!

    For future reference, I also found this issue #1041 that mentions the same error. Their answer involved doing some calculation regarding the cpu wattage to choose a value for the 0x601 MSR. I tried both values and both worked. However, doing the calculations stated in the other issue I got slightly lower values for vCore and frequency (measured via i7z).

  14. GrauBlitz commented on May 19, 2025

    @GrauBlitz

    I also have this issue randomly with my i5-1135G7 after a cold boot, @danielzgtg your suggestion work like a charm on my Manjaro installation, thanks! Without it i7z reported a multiplier of max. 5x-6x on all CPU Cores which is unbearable slow...

  15. lizsugar commented on May 23, 2025

    @lizsugar

    This worked for me once, and now it's not working at all. Same register same value. I'm not sure what else to try at the moment. All my cores are stuck at 400MHz or slower.

    Further, I cannot get a good reboot or shutdown where the cores are working right

  16. 33 remaining items

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions