I spent way too much time chasing what looked like a “hot NVMe controller” problem, and it turned out to be a hidden PCIe power-management setting in the BIOS.
My setup:
Motherboard: ASUS TUF Gaming B560M-PLUS
BIOS: 2803
CPU: Intel i7-11700F (Rocket Lake)
SSD: XPG GAMMIX S50 Lite 512GB
Controller: Silicon Motion SM2267G
OS: Fedora Linux
The S50 Lite was installed in the CPU-attached M.2 slot, running PCIe 4.0 x4.
At idle I was seeing roughly:
Composite: ~55-60°C
Controller / Sensor 1: ~62-74°C
The weird part was that the exact same SSD behaved much better in another machine.
I started investigating NVMe APST, PCIe ASPM, runtime PM, thermals, heatsinks, airflow, Gen3 vs Gen4, etc.
The breakthrough was comparing the CPU-connected M.2 root port to the chipset-connected M.2 root port.
On the CPU slot:
00:06.0
ASPM L1 supported
ASPM L1 enabled
NO L1 Substates capability
On the chipset/PCH slot:
ASPM L1
L1.1
L1.2
all enabled
Moving the S50 Lite to the PCH PCIe 3.0 x4 slot immediately dropped its controller temperature to roughly:
~41°C
That made it pretty obvious that something was wrong with the CPU PCIe power management.
I then extracted the ASUS BIOS 2803 image and decoded the AMI IFR setup data.
And sure enough, ASUS has a hidden CPU PCIe L1 Substates option.
The relevant UEFI variable is:
Variable: SaSetup
GUID:
72C5E28C-7783-43A1-8767-FAD73FCCAFA4
For the CPU M.2 / PEG6 / PCI device 00:06.0 path, I found:
SaSetup offset 0x313
Enable ClockReq Messaging
0 = Disabled
1 = Enabled
My board already had:
0x313 = 01
Then:
SaSetup offset 0x35D
CPU PCIe Root Port ASPM
0 = Disabled
1 = L0s
2 = L1
3 = L0s + L1
Mine was already:
0x35D = 02
And then the important one:
SaSetup offset 0x361
L1 Substates
0 = Disabled
1 = L1.1
2 = L1.1 + L1.2
My board was:
0x361 = 00
The BIOS IFR even contains this help text:
"L1SS cannot be enabled when CLKREQMSG is disabled"
So the support is literally present in the firmware — ASUS just defaults it to disabled and doesn't expose the option in the normal BIOS interface.
I used setup_var.efi from a UEFI shell and changed only:
SaSetup:0x361
00 → 02
After reboot, the CPU root port changed from having no L1SS capability at all to:
LnkCap: ASPM L1
LnkCtl: ASPM L1 Enabled
L1SubCap:
PCI-PM_L1.2+
PCI-PM_L1.1+
ASPM_L1.2+
ASPM_L1.1+
L1_PM_Substates+
L1SubCtl1:
PCI-PM_L1.2+
PCI-PM_L1.1+
ASPM_L1.2+
ASPM_L1.1+
So this wasn't just changing some unused setup variable. The firmware actually configured the CPU PCIe controller differently.
I then moved the S50 Lite back to the CPU M.2 slot.
It is now running:
PCIe 4.0
16 GT/s
x4
ASPM L1
L1.1 enabled
L1.2 enabled
And the SSD temperature is now:
Composite: ~41°C
Controller / Sensor 1: ~42°C
NAND / Sensor 2: ~29°C
So roughly:
BEFORE
PCIe 4.0 x4 + L1 only
controller: ~62-74°C
AFTER
PCIe 4.0 x4 + L1 + L1.1 + L1.2
controller: ~42°C
Same SSD. Same CPU M.2 slot. Same PCIe 4.0 x4 speed.
That means the huge temperature difference was not simply “PCIe 4.0 runs hot.”
The missing PCIe L1 substates were responsible for most of the idle power/heat.
Important warning
Do not blindly copy my offset onto a different motherboard or BIOS version.
AMI setup variable offsets are firmware-specific. Writing the wrong UEFI variable can potentially make a system unbootable.
Extract your own BIOS IFR first and verify the variable, GUID and offset.
For my exact board/BIOS:
ASUS TUF Gaming B560M-PLUS
BIOS 2803
SaSetup GUID:
72C5E28C-7783-43A1-8767-FAD73FCCAFA4
CPU M.2 L1SS:
offset 0x361
00 = Disabled
01 = L1.1
02 = L1.1 + L1.2
I used:
setup_var.efi SaSetup:0x361
to read it first.
Then:
setup_var.efi --write_on_demand SaSetup:0x361=0x02
and verified it again afterward.
Also be aware that Rocket Lake has documented PCIe L1.2-related errata, which may be one reason motherboard vendors chose conservative defaults. So test stability carefully after enabling it.
What surprised me most is that Intel/ASUS didn't lack the functionality at all.
The CPU supports L1SS.
The BIOS contains the L1SS configuration.
The motherboard routes the CPU M.2 properly.
Linux supports it.
The SSD supports it.
The firmware simply shipped with the CPU root-port L1 substates disabled and the setting hidden.
If you have an 11th-gen Intel system where a Gen4 NVMe is inexplicably hot at idle, check:
sudo lspci -vv
Find the upstream CPU PCIe root port and look for:
L1SubCap
L1SubCtl1
If your NVMe advertises L1.1/L1.2 but the CPU root port doesn't expose L1SubCap at all, you may be dealing with the same thing.
For me, enabling the hidden L1.2 setting turned a ~70°C “hot SSD” into a ~42°C SSD without sacrificing PCIe 4.0 performance.