Disclaimer: changing hidden BIOS settings is inherently dangerous and could permanently brick your machine. Proceed with caution and at your own risk.
Starting with BIOS version `2.14.0` Dell removed the ability to undervolt the CPU by setting the Overclocking Lock in BIOS because of Plundervolt, see here.
Fortunately there are hidden BIOS options to undo this which can be accessed using `setup_var.efi` or similar tools. However the Overclocking Lock specifically is reset after a reboot so instead we’ll set the voltage offsets directly.
One can obtain the correct offsets for the variables we want to change by extracting them from the BIOS upgrade package provided by Dell, a python script to extract the actual BIOS files from it and software that can read the UEFI BIOS image. The resulting offsets are specific to both the exact model and BIOS version in use, and blindly using them on a different model or version is a VERY BAD IDEA as it can brick your machine. If this happens to you, you may be able to unbrick it by performing a CMOS reset, but if you accidentally set a wrong cpu offset voltage in this way your machine may be destroyed permanently.
Here’s are some relevant offsets obtain from this process, slightly edited for readability and clarity:
Overclocking Lock | VarStore: Setup | VarOffset: 0x58D | Size: 0x1 Disabled: 0x0 Enabled: 0x1 XTU Interface | VarStore: Setup | VarOffset: 0x64E | Size: 0x1 Disabled: 0x0 Enabled: 0x1 CFG Lock | VarStore: Setup | VarOffset: 0x4DE | Size: 0x1 Disabled: 0x0 Enabled: 0x1 Core Voltage Offset | VarStore: Setup | VarOffset: 0x653 | Size: 0x2 Min: 0x0 | Max: 0x3E8 | Step: 0x1 Core Offset Prefix | VarStore: Setup | VarOffset: 0x655 | Size: 0x1 +: 0x0 -: 0x1 GPU Voltage Offset | VarStore: Setup | VarOffset: 0x85A | Size: 0x2 Min: 0x0 | Max: 0x3E8 | Step: 0x1 GPU Offset Prefix | VarStore: Setup | VarOffset: 0x85C | Size: 0x1 +: 0x0 -: 0x1
As stated previously, the Overclocking Lock is reset after a reboot, but can is nontheless useful for finding stable voltage offsets before we set them in BIOS as it makes tools like intel-undervolt work again.
Variable | Offset | Size | Default Value | Comment |
---|---|---|---|---|
Overclocking Lock | 0x58D | 0x1 | 0x1 (Enabled) | Forbid (0x1) or Allow (0x0) OS-level overclocking |
Core Voltage Offset | 0x653 | 0x2 | 0x0 (0 mV) | CPU offset voltage in mV in hexadecimal; 0x64 = 100mV |
Core Offset Prefix | 0x655 | 0x1 | 0x0 (Positive) | Sign of the previous offset; we want negative for undervolting |
GPU Voltage Offset | 0x85A | 0x2 | 0x0 (0 mV) | Same as Core Voltage Offset but for the GPU |
GPU Offset Prefix | 0x85C | 0x1 | 0x0 (Positive) | Sign of the previous offset; we want negative for undervolting |
Changing the hidden variables
To change the variables we’ll use something called setup_var.efi.
First try to read the values like so:
setup_var.efi Setup:0x58D(0x1)
Then we write to them for real:
setup_var.efi Setup:0x58D(0x1)=0x0
After testing we can permanently set the desired offset we got from testing earlier, in this example to -100mV:
setup_var.efi Setup:0x655(0x1)=0x1 setup_var.efi Setup:0x653(0x2)=0x64
- https://www.tonymacx86.com/threads/guide-dell-xps-13-9360-on-macos-sierra-10-12-x-lts-long-term-support-guide.213141/
- https://github.com/ajtang/XPS-9360-Hackintosh
- https://github.com/the-darkvoid/XPS9360-macOS/blob/master/README.md
- https://github.com/datasone/grub-mod-setup_var
- https://github.com/dreamwhite/bios-extraction-guide/blob/master/Dell/README.md
- kitsunyan/intel-undervolt#43 (comment)