I’m documenting this here, in the hopes that it may help someone else down the road.
I recently inherited a Lenovo IdeaPad S340 from someone who had dumped an entire glass of water across it. After drying out for an appropriate amount of time, the laptop boots but is throttled at 200Mhz. Here is my tale of (mostly) victory in getting it back to a workable condition.
A visual inspection of the laptop shows no obvious areas of damage or corrosion, but something was definitely causing it to throttle. Some digging in HWINFO revealed a BD PROCHOT flag, being triggered by a temp sensor in the power regulator of the GPU. This is the culprit which was causing the throttling. Just for reference, BD PROCHOT refers to a Bi-Directional Processor Hot condition, where the processor decides to throttle itself based on temperature data from some other part of the machine. This is normally a good thing, as it can prevent unnecessary damage to the machine. In this case, the machine is not worth sending in for hardware repair. Fortunately, there are a couple of ways to disable the BD PROCHOT flag while leaving the internal temperature sensors in the CPU active to protect it from damage.
The easy part of the solution, was to install ThrottleStop. After launching ThrottleStop, a simple un-check of the ‘BD PROCHOT’ box and a click of the ‘Turn On’ button disabled the defective sensor and allowed the CPU to immediately run up to full clock speed! This can be verified by running resmon.exe on Windows, and clicking to the CPU tab. The blue line on the graph will show you the clock speed at which the CPU is currently running.
This should have been enough for me…but I had decided to go farther and dual-boot the machine on Ubuntu 20.04.4 LTS (primary OS is Win10). ThrottleStop works great, but it is unfortunately Windows-only at this time (although some efforts are being made to port it to *nix). Thus began my journey to disable BD PROCHOT on Ubuntu.
Before I could even install Ubuntu, I had to disable Intel Rapid Storage Technology on the laptop (Ubuntu install found this and halted). The actual process necessary to disable this is a simple change in the UEFI firmware, but Windows will not know how to boot after RST is disabled, unless you take the proper steps first. I followed the steps HERE.
VERY IMPORTANT! Make sure you finish ALL the steps in the previous link BEFORE you disable RST in UEFI, or you will almost certainly be unable to boot back into Windows 10. You can use a Windows 10 boot USB drive to repair this, but it is outside the scope of this blog post.
AFTER taking the necessary steps to prepare Windows for disabling RST, reboot into your UEFI firmware settings and disable RST by following these steps:
- Hold down ‘Shift’ while clicking the Reboot button in Windows, and keep holding it down until you reach the Windows Diagnostic screen
- Choose ‘Troubleshoot’ from that screen, then click ‘Advanced Options’.
- Click ‘UEFI Firmware Settings’, then confirm ‘Restart’
- At the UEFI firmware screen, navigate to ‘Configuration’, choose ‘Storage’, then select ‘Controller Mode’.
- Switch ‘Controller Mode’ from RST to AHCI. You’ll see a warning pop up, that all data on the drive will be erased. This is not true, UNLESS you have an RAID array set up through RST. If you’re not sure, then I’d advise you not to proceed any further until you can verify.
- You may want to choose at this point to also disable Secure Boot, depending on how you will be using Ubuntu and your specific needs.
- Press F10 to save/exit.
Once you’ve finished disabling RST (and verify that Windows can still boot…), you can proceed with installing Ubuntu.
After installing Ubuntu, my first stop was HERE. The instructions to disable BD PROCHOT seemed simple enough, but I had trouble getting it to work for me. Likely user error, but I continued to search.
My solution ultimately was found HERE. Several solutions are provided, but scrolling down toward the end of the list reveals the simplest solution, which worked well for me (with a couple of minor changes):
sudo apt install msr-tools
sudo modprobe msr
sudo wrmsr 0x1FC 2
At this point your CPU should no longer be throttled, until you reboot. You can verify the current clock speed by doing the following:
sudo apt install i7z
sudo i7z
Once you’ve verified this is working, you’ll probably want to make this persistent across reboots. Proceed with caution on the following, as changes to the crontab can cause all sorts of excitement.
sudo crontab -l > ~/crontab.root.bak
sudo echo "/usr/sbin/wrmsr 0x1FC 2" > ~/nothrottle.sh
sudo crontab -l > tempfile.tmp; sudo echo "@reboot /absolute/path/to/nothrottle.sh" >> tempfile.tmp; sudo crontab tempfile.tmp; sudo rm tempfile.tmp
Don’t forget to edit the path to your script in the command above, to reflect it’s correct absolute path. Reboot, and check CPU frequency again with i7z as listed above. Once you’ve tested everything working, you can delete the file at ~/crontab.root.bak
Hope this proves helpful to someone else out there!