internetnoob26

New Member
Sep 10, 2026
2
0
1
Hi everyone,

I wanted to document a power-consumption problem I spent quite a lot of time investigating, because some of the results were very unintuitive and may also be relevant to other people running Proxmox/Linux on older laptops or Haswell systems.

First, an important disclaimer: I am not a Linux/kernel expert. I started this as a home-server project and learned most of this while troubleshooting. So corrections or better technical explanations are very welcome. Also I used a lot of AI, also to summarize this post. I think it is readable quite good.

The interesting part is that I did not just end up throwing powertop --auto-tune at the machine. I tested the relevant devices and settings individually and measured the effect.

The final result was roughly:

State
Wall power​
Windows reference
often ~6-8 W​
Initial Proxmox idle
~19-20 W​
After PCIe/dGPU fix
~9-10 W​
Final optimized Proxmox idle
~4-5 W​

At the final 4–5 W idle state I measured approximately 94% Package C6 residency, while Ethernet remained connected and usable.


Hardware / software​

The machine is a Toshiba Satellite L70-B-132.

Relevant hardware:

ComponentHardware / PCI address
CPUIntel Core i7-4710HQ, Haswell
iGPUIntel HD Graphics 4600, 00:02.0, i915
dGPUAMD Radeon HD 8850M / R9 M265X, 01:00.0
dGPU root port / PEG00:01.0
EthernetRealtek RTL8111/8168 family, 07:00.0
Ethernet root port00:1c.0
WLANIntel Wireless 3160, 08:00.0
WLAN root port00:1c.1
Card readerRealtek RTS5229, 09:00.0
Card-reader root port00:1c.2
SATA/AHCIIntel 8 Series/C220, 00:1f.2
SSDSanDisk SDSSDH3 500 GB
USB xHCI00:14.0
USB EHCI00:1a.0, 00:1d.0
MEI00:16.0
The successful tests were done on Proxmox VE 9 / Debian Trixie, with a PVE 7.0-series kernel; at the final measurements I was running:

7.0.14-15-pve

The server is intended to run headless with Ethernet and eventually host Home Assistant, OMV, Immich and other services.


1. Why I started investigating this​

Before installing Proxmox I measured the laptop under Windows.

The readings initially fluctuated quite a lot. Depending on background activity, display state etc. I saw roughly 11–14 W, but after getting Windows properly idle I could repeatedly see periods around 6–8 W.

That became my reference.

I also logged the system with HWiNFO rather than relying only on the wall meter.

One strange observation actually happened very early.

I thought:

If I disable unused hardware in Windows Device Manager, power consumption should fall.
So I disabled WLAN, Bluetooth, optical-drive related hardware and eventually the AMD Radeon.

Instead of reducing consumption, at one point the machine went to approximately:

21 W.

CPU usage was still around 1%.

That seemed completely backwards.

I cannot prove the exact internal reason, but in retrospect I suspect that disabling the AMD device in Device Manager prevented the normal hybrid-graphics driver stack from performing the power transitions it normally performs.

In a later HWiNFO log with the AMD driver functioning normally, the dGPU was mostly inactive but occasionally woke briefly. Afterwards the PCIe-related values disappeared again.

That suggested that Windows was not simply leaving the GPU permanently disabled. It appeared to actively manage it, wake it when required and then shut the relevant hardware path down again.

This became important much later.


2. Initial Proxmox result: almost 20 W​

After installing Proxmox the laptop idled at roughly:

19.5–20 W, sometimes somewhat higher.

My first assumption was that Linux/Proxmox itself was simply much less efficient on this old laptop.

But CPU usage was tiny.

powertop made this even more confusing.

The individual CPU cores were spending roughly 98–99% of idle time in deep C-states, mostly C7/C7s.

So from my beginner's perspective, the CPU looked perfect:

CPU is asleep → it should not be consuming much power.
Yet the wall meter still showed approximately 20 W.

At this point I did not yet understand the importance of the distinction between core C-states and package C-states.


3. The AMD dGPU looked suspended — but something was still wrong​

The laptop contains both the Intel HD 4600 and an AMD Radeon.

Linux correctly detected Toshiba/AMD hybrid graphics. The kernel log contained ATPX/PowerXpress related messages and the AMD driver reported runtime power management.

The AMD device itself looked reasonably good:

01:00.0 AMD GPU
runtime_status: suspended
So initially I assumed that the AMD GPU could not be responsible.

Then I checked the PCIe hierarchy.

The topology is essentially:

00:01.0 Intel PEG / PCIe Root Port
|
+--- 01:00.0 AMD Radeon
And this was the important part:

The AMD endpoint could be suspended while the upstream PEG/root port remained active in D0.

So the GPU itself appearing "suspended" did not necessarily mean the whole PCIe branch had reached its lowest-power state.


4. First major breakthrough:​

I then tested the kernel parameter:

pcie_port_pm=force
The Linux kernel documentation describes this as forcibly enabling power management of PCIe ports.

After booting with it and allowing runtime PM on the AMD endpoint/root port:

echo auto > /sys/bus/pci/devices/0000:01:00.0/power/control
echo auto > /sys/bus/pci/devices/0000:00:01.0/power/control
the state changed to:

00:01.0 PEG:
runtime_status: suspended
runtime_usage: 0
power_state: D3cold

01:00.0 AMD:
runtime_status: suspended
runtime_usage: 0
power_state: D3cold
Linux documents D3cold as the PCI power state where the device's supply voltage is removed.

The wall measurement immediately changed from roughly:

19.5–20 W
to approximately:

9.2–10 W
This was by far the first major breakthrough.

Nearly ten watts disappeared.

So the original assumption that "Proxmox simply needs ~20 W on this laptop" was clearly wrong.

A very large part of the problem was the PCIe/dGPU power state.

It also made the earlier Windows behaviour much more interesting: Windows apparently had mechanisms capable of putting the hybrid-GPU branch into a much deeper power state automatically.


5. CPU cores were sleeping, but the CPU package was not​

After the dGPU fix the machine was around 9–10 W.

Now I started investigating CPU Package C-states directly.

This is where I finally understood why the earlier powertop result had been misleading to me.

Linux's intel_idle documentation explains that there are two relevant levels:

core C-states, which concern individual CPU cores, and package C-states, which concern the processor package as a whole and may depend on other components such as graphics, memory controllers or I/O devices.

So it is entirely possible to have:

Core C7: ~99%
while the processor package itself cannot reach a deep Package C-state.

That was basically my situation.

I measured Package residency directly through the Haswell MSRs:

TSC 0x10
Package C2 0x60D
Package C3 0x3F8
Package C6 0x3F9
Package C7 0x3FA
With the normal Ethernet configuration Package C6 was essentially:

0%

6. Ethernet turned out to be blocking Package C6​

The next test was very simple:

Temporarily disable Ethernet.

With Ethernet active I saw roughly:

Package C2: ~32%
Package C3: ~64%
Package C6: 0%
After taking the Ethernet device/link out of the equation:

Package C6: ~49%
That was a strong diagnostic result.

The active Realtek Ethernet path was preventing the processor from reaching Package C6.

Unfortunately, turning Ethernet off is not very useful for a Proxmox server.

So the question became:

How do I keep Ethernet running while still allowing Package C6?

7. I tested the Realtek​

The NIC is an RTL8111/8168-family device.

The normal kernel driver was:

r8169
Because the alternative r8168-dkms driver is often discussed for these controllers, I tested that too.

This involved installing DKMS/headers and dealing with module signing/Secure Boot.

Eventually r8168 was definitely bound and working.

Result:

No improvement.

Package C6 still remained unavailable with normal active Ethernet.

So I reverted everything and returned to the stock kernel:

r8169
For my hardware, r8168 provided no power-saving advantage.


8. Then I found the firmware/ASPM contradiction​

The kernel log contained this:

ACPI FADT declares the system doesn't support PCIe ASPM, so disable it
and around the Realtek device:

r8169 ... can't disable ASPM; OS doesn't have ASPM control
This was extremely interesting.

ASPM is PCI Express Active State Power Management — essentially allowing PCIe links themselves to enter low-power states when idle.

But Toshiba's firmware was telling Linux not to control it.

That created an obvious contradiction.

The same physical laptop could reach much lower power levels under Windows.

So either Windows had additional vendor-specific mechanisms, or the firmware restriction was more conservative than what the hardware was actually capable of.

There is even an old Intel discussion involving Haswell laptops and Linux vs Windows Package C-state residency where a very similar class of problem is discussed: Linux respects firmware/BIOS power-management restrictions while Windows on the same hardware can achieve much deeper package residency. It is not evidence for my exact Toshiba, but it was an interesting parallel.


9. Second major breakthrough:​

I therefore tested:

pcie_aspm=force
Important warning:

The kernel documentation explicitly says that pcie_aspm=force enables ASPM even on devices claiming not to support it and warns:

forcing ASPM may cause system lockups.

So I initially used this only as a temporary GRUB test.

After booting with:

pcie_port_pm=force pcie_aspm=force
the runtime ASPM policy could finally be changed:

echo powersave > /sys/module/pcie_aspm/parameters/policy
With Ethernet still connected and working, Package residency changed dramatically:

Package C2 : ~26.8%
Package C3 : ~0.7%
Package C6 : ~69%
Package C7 : 0%
So:

Before:
Ethernet active → Package C6 = 0%

After forced ASPM:
Ethernet active → Package C6 ≈ 69%
This solved the Ethernet/Package-C6 problem without losing network connectivity.

I also tested:

powersupersave
versus:

powersave
There was effectively no advantage in my measurements.

So I kept:

powersave

10. Interesting ASPM detail on this Realtek link​

The Realtek endpoint/root-port pair does not advertise PCIe L1 PM Substates.

So there is no L1.1/L1.2 available on this particular Ethernet branch.

It supports the older ASPM states.

After forcing ASPM and selecting powersave, lspci produced a somewhat odd-looking result where the endpoint showed L0s enabled while the root side still appeared as ASPM disabled.

Nevertheless, Package C6 worked reliably in the measurement.

So I would caution against looking only at one LnkCtl line and assuming that tells the entire platform-power story.

The important result for me was the actual Package residency measurement.
 

Attachments

11. RAPL showed the CPU was already extremely efficient​

At around 9 W wall power I also measured Intel RAPL energy.

Over roughly 30 seconds I obtained approximately:

CPU Package : 1.89 W
CPU Core : 0.085 W
DRAM : 1.47 W

This was another useful reality check.

The machine was drawing around 9 W at the wall, but the CPU package itself was below 2 W.

So chasing CPU frequency or CPU utilisation was clearly not going to recover the missing several watts.

The remaining consumption had to be in the rest of the platform:

PCIe, PCH, graphics/display, SSD, PHYs, voltage conversion losses etc.


12. Several things I tested did almost nothing​

At this stage I systematically tried several other candidates.

WLAN was brought down and iwlwifi/iwlmvm were unloaded.

Almost no measurable wall-power change.

The USB controllers were changed to runtime PM auto. They could suspend into D3hot when idle, but this did not produce a large measurable change at the wall.

The Realtek card reader was suspended and even removed from the PCI bus as a test.

Again, maybe a few tenths of a watt at most — hard to distinguish from meter variation.

Intel MEI drivers were unloaded.

No meaningful improvement.

For SATA, I tried:

min_power
which sounds like it should obviously be the best option.

It was not.

Power actually appeared slightly worse, around 9.5 W.

So I reverted to:

med_power_with_dipm
I think these negative tests are worth mentioning because they stopped me from building an unnecessarily complicated "tuning" configuration.


13. I was almost ready to accept ~9 W​

At this point most obvious devices had been checked.

AMD branch: D3cold.

Package C6: working.

Ethernet: active.

CPU package: ~1.9 W.

WLAN: not important.

USB: not important.

Card reader: not important.

MEI: not important.

SATA: already reasonable.

Wall power still:

~9–9.5 W
It was already much better than the original 20 W.

I was beginning to wonder whether the original Windows 6–8 W numbers simply were not directly comparable.

Then we checked the Intel iGPU.


14. The Intel iGPU was still fully active​

The Intel HD 4600 at 00:02.0 showed:

runtime_status: active
runtime_usage: 6
power_state: D0
And Linux still reported the internal eDP panel as connected.

The server was already operating headless, so I tested disabling the internal panel at the kernel level:

video=eDP-1:d
This is the part I least expected to make such a large difference.

After rebooting with:

quiet video=eDP-1:d pcie_port_pm=force pcie_aspm=force
and reapplying runtime PM settings, the iGPU changed to:

runtime_status: suspended
runtime_usage: 0
power_state: D3hot
And the wall meter changed from roughly:

9 W
to:

4–5 W
That was the largest surprise of the whole troubleshooting process.


15. Why could disabling the panel save several watts?​

I do not interpret this as "the Intel GPU itself consumed 4–5 W".

The i915 driver manages multiple graphics and display power domains.

The kernel i915 documentation specifically notes that entire hardware blocks can be dynamically enabled and disabled and that this is particularly important on the display side, where software has to manage multiple power gates.

My interpretation is therefore that keeping the eDP display path alive was preventing several display/iGPU/platform power domains from shutting down.

Once:

video=eDP-1:d
removed the internal display path, the Intel GPU was finally able to runtime suspend into D3hot and the platform could enter much deeper idle.

This interpretation fits the measurements, but I want to distinguish it from a directly measured fact: I did not individually measure every i915/display rail.

What I did directly observe was:

Before:
iGPU = active / D0
wall ≈ 9 W

After video=eDP-1:d:
iGPU = suspended / D3hot
wall ≈ 4–5 W
The kernel documentation also confirms that writing auto to a device's power/control permits its driver to runtime-power-manage the device; on prevents runtime PM.


16. Final Package C-state result​

After the eDP change, I measured Package residency again.

Result:

Package C2 : 2.591 %
Package C3 : 0.259 %
Package C6 : 94.054 %
Package C7 : 0.000 %
So the final system spends approximately 94% of idle time in Package C6.

This is important because the first powertop readings had already shown something like 98–99% deep core C-state residency.

At first I thought that meant the CPU was already fully optimized.

It did not.

The final Package C6 measurement showed the real change in whole-package/platform behaviour.


17. Final relevant power configuration​

The current successful kernel command line contains:

quiet video=eDP-1:d pcie_port_pm=force pcie_aspm=force
After boot I use:

echo powersave > /sys/module/pcie_aspm/parameters/policy
Runtime PM is allowed on the AMD endpoint and PEG root:

echo auto > /sys/bus/pci/devices/0000:01:00.0/power/control
echo auto > /sys/bus/pci/devices/0000:00:01.0/power/control
and on the Intel iGPU:

echo auto > /sys/bus/pci/devices/0000:00:02.0/power/control
USB controllers are also allowed to runtime suspend:

echo auto > /sys/bus/pci/devices/0000:00:14.0/power/control
echo auto > /sys/bus/pci/devices/0000:00:1a.0/power/control
echo auto > /sys/bus/pci/devices/0000:00:1d.0/power/control
The root SSD uses:

med_power_with_dipm
WLAN is disabled because I do not need it for this server.

Bluetooth remains available.

MEI is left alone.

The card reader is allowed runtime PM but is not forcibly removed.

Ethernet is left active and continues using the stock:

r8169
driver.


18. Final states​

At a good idle I now see approximately:

PEG 00:01.0
suspended
runtime_usage 0
D3cold

AMD 01:00.0
suspended
runtime_usage 0
D3cold

Intel iGPU 00:02.0
suspended
runtime_usage 0
D3hot
USB controllers can suspend when idle.

Ethernet remains D0/active, which is intentional.

Importantly, I stopped trying to force every remaining device into D3.

Some devices can remain active without preventing the whole processor package from spending ~94% of its time in PC6.


19. Measurement summary​

Test state
Approx. result​
Windows clean idle reference
~6–8 W​
Windows with various devices manually disabled, including AMD during one test
up to ~21 W​
Initial Proxmox
~19.5–20 W​
Core C7/C7s at initial Linux idle
~98–99%​
pcie_port_pm=force, AMD/PEG D3cold
~9.2–10 W​
Active Ethernet before ASPM override
Package C6 0%​
Ethernet down during test
Package C6 ~49%​
r8168 instead of r8169
no useful change​
pcie_aspm=force + powersave, Ethernet active
Package C6 ~69%​
powersupersave
no useful advantage​
WLAN off
no meaningful wall-power change​
USB runtime PM
no large isolated wall-power change​
MEI unloaded
no meaningful change​
Card reader removed
negligible / measurement-noise range​
SATA min_power
slightly worse​
SATA med_power_with_dipm
retained​
CPU Package RAPL
~1.89 W​
DRAM RAPL
~1.47 W​
Before disabling eDP
~9 W, iGPU D0​
video=eDP-1:d
~4–5 W, iGPU D3hot
Final Package C6
~94%

20. Why I think the Windows comparison was useful​

The most useful thing about measuring Windows first was not the exact 6 W number.

The measurements were not perfectly identical laboratory conditions, so I would not claim a strict Windows-vs-Linux benchmark.

The important information was:

the hardware was physically capable of substantially lower idle power.

Without that reference I probably would have stopped at 9–10 W and assumed it was normal for this machine.

The particularly strange Windows test — disabling the AMD device and seeing power rise instead of fall — also taught me not to equate:

"disabled in Device Manager"
with:

"electrically powered off"
For hybrid graphics, allowing the proper driver stack to manage the device can apparently be much more important than simply disabling the device logically.


21. Important warning about copying these settings​

I would not recommend blindly copying these kernel parameters to unrelated hardware.

Especially:

pcie_aspm=force
is deliberately overriding firmware behaviour.

The Linux kernel documentation explicitly warns that forcing ASPM can cause system lockups.

In my case I had a specific reason to test it:

ACPI FADT declares the system doesn't support PCIe ASPM
combined with measurements showing that the same hardware under another OS could operate at much lower platform power.

So I would treat this as a hardware-specific case study, not a generic Proxmox tuning guide.

I am continuing to test stability with network traffic, VMs/containers and normal server load.


22. Sources / references that helped me understand the results​

Linux kernel command-line parameter documentation

This documents both:

pcie_port_pm=force
as forcibly enabling PCIe-port power management, and:

pcie_aspm=force
as enabling ASPM even for devices claiming not to support it, including the explicit lockup warning.

Linux kernel PCI Power Management documentation

Useful for understanding PCI D0/D3hot/D3cold and runtime PCI power management.

Linux Runtime Power Management documentation

Useful for understanding /sys/.../power/control, particularly the difference between auto and on.

Linux intel_idle documentation

This was especially useful for understanding why high Core C7 residency does not mean the entire processor package can reach deep Package C-states. It explicitly describes core vs package C-states and notes that package states may depend on things such as GPUs, memory controllers and I/O.

Intel i915 documentation

Useful for understanding that the Intel graphics driver dynamically controls complete hardware/display power domains and that display-side power management involves several software-controlled power gates.

Intel Community: “Linux vs. Windows: package C-state residency over Haswell”

This is an old discussion and obviously not documentation for my exact Toshiba, but I found the similarity interesting: Haswell laptop, Windows achieving much deeper package idle than Linux, and discussion of BIOS/firmware restrictions affecting Linux power behaviour.


Conclusion​

What initially looked like:

"Proxmox uses almost three times as much power as Windows on this laptop"
turned out to be much more specific.

The CPU cores were already sleeping very well at the beginning.

The major problems were elsewhere in the platform.

First, the AMD GPU appeared suspended while its PCIe hierarchy was not reaching the lowest state.

Then active Ethernet prevented deep Package C-states because Linux was obeying Toshiba's ASPM firmware restrictions.

Finally, after most obvious devices had been eliminated, the still-active internal eDP/display path kept the Intel iGPU in D0 and apparently kept additional platform/display power domains active.

The three biggest changes were therefore:

pcie_port_pm=force
pcie_aspm=force
video=eDP-1:d
with ASPM policy:

powersave
The end result is approximately:

Initial Proxmox: ~20 W
Final Proxmox: 4–5 W
Package C6: ~94%
Ethernet: active
AMD dGPU: D3cold
Intel iGPU: D3hot
For an old Haswell 17" laptop with a quad-core i7, 16 GB RAM and a discrete AMD GPU, I am very happy with that result.

If anyone understands the Toshiba ATPX/ACPI implementation or the i915 display-power behaviour on Haswell better than I do, I would be particularly interested in corrections or a more precise explanation of why disabling eDP-1 had such a large wall-power effect.