Librem-EC 1.12 for the Librem 14 has been released with a fix to the PL4 power limit to address sudden shutoffs that still remained in the 1.11 release. Once again, the issue was in a subtle corner case, which we were able to identify with help from testers. Update to 1.12 with our update instructions, and check out the source code. Thank you to all those who helped us troubleshoot and fix this issue!
As we’ve discussed before, modern Intel CPUs have configurable power limits, called PL1 through PL4. Flexible power limits allow the EC to tune the system based on the current power source (battery or AC), battery state of charge, and other factors. Tuning these limits properly is the key to providing a device with long battery life and great performance.
PL4 is the preemptive power limit – the CPU will never exceed it. We set PL4 based on the amount of power the battery and AC adapter (if present) can deliver.
In the 1.11 release, we reduced the PL4 values to account for normal variations in components. However, some shutoffs persisted. We received reports that Librem EC 1.7 had fewer shutoffs. There were several changes between 1.7 and 1.8, and we isolated one by iterating with testers. The remaining issue was not caused by the value of PL4, but by the way we were setting it.
In older versions of Librem-EC, the firmware set the power limit every time it iterated to check its inputs – there was no persistent state.
We saw this as a lot of unneeded work, and we wanted to free up that time in the EC. The EC runs at just 9 MHz, and much of its work is synchronous. There is no need to set PL4 again if it hasn’t changed, so we had it remember the last PL4 setting. This means the EC only tells the CPU about PL4 if something changes, such as plugging in the AC adapter, or the battery reaching low charge.
The implementation is pretty simple – the function power_peci_limit() decides what the PL4 should be based on our current inputs. It just remembers the last decision, and if the new decision is the same, we don’t have to tell the CPU the current value of PL4.
However – there is one situation where the CPU will forget PL4 on its own. If it enters any sleep state, the CPU will not remember PL4 when it resumes again. The EC would not necessarily apply PL4 again, and we could end up running with no PL4 limit.
Of course, if you plugged in the AC adapter, the EC would update PL4. If the system shuts off for more than 7 seconds on battery, the EC shuts off too, so it would apply PL4 when turning on again. This meant that the problem was tough to find. After the incorrect behavior occurred, the system had to cause a shutoff before the EC decided to change PL4.
Once we realized that this state transition caused the problem, I was finally able to reproduce the shutoff. To fix it, we just forget our last PL4 setting if the CPU is in any sleep state. When it resumes, we will always apply PL4 again. This fixes the issue and preserves the optimization in Librem-EC 1.8.
While confirming this fix for the sudden shutoffs, we also received reports that this corrected a rare graphical corruption issue. This may have been caused by power usage that pushed a power rail below its intended voltage, but not low enough to shut the system off. Thanks to all of our users that helped test this issue and confirm the fix!
|Librem Mini||In Stock||10 days|
|Librem Servers||Out of Stock||--|
|Librem Key||In Stock||10 days|
|Librem 14||In Stock||10 days|
|Librem 5 USA||In Stock||10 days|
|Librem 5||Currently shipping backlogs||52 weeks|