Taming Intel-lpmd on Fedora
Intel-lpmd: short for “Intel Low Power Mode Daemon,” an official Intel background service that claims to improve “big.LITTLE scheduling.” It’s first-party, so it must have something going for it. Officially it only supports big.LITTLE chips anyway — running it on a non-hybrid CPU is pointless. And the whole thing is built around per-model tuning: users or OEMs can drop in dedicated XML configs to optimize power.
I bring this up because Fedora apparently started installing it by default a while back, and even more conveniently, Fedora pushed a version update recently that added support for two more CPUs: Arrow Lake-H and WildCat Lake.

As an Arrow Lake-H user I updated right away. LPMD picked up my ARL-H just fine and enabled a profile: /etc/intel_lpmd/intel_lpmd_config_F6_M197.xml. A few minutes of use and something felt off. I opened the config file, read the first comment, and lost it.
<?xml version="1.0"?>
<!--
Intel Energy Optimizer (LPMD) configuration for Arrow Lake-H
(family 6, model 0xC5 / 197).
Performance (PerformanceDef=-1) -> LPMD_OFF -> all CPUs active
Balanced (BalancedDef= 0) -> LPMD_AUTO -> E+L cores only (P-cores parked)
Powersaver (PowersaverDef= 1) -> LPMD_ON -> L-cores only
Design: P-cores are NEVER used in Balanced mode. All WLT states use
ActiveLcores=ALL + ActiveEcores=ALL (topology-portable, not hardcoded
CPU numbers). EPP/EPB vary per WLT state to spread the power-performance
tradeoff across E+L cores. If the user wants P-cores, they select
Performance mode or disable LPMD.-->
I don’t know what brain came up with this scheduling scheme, especially the line “P-cores are NEVER used in Balanced mode.” Most laptops run Balanced mode. You just told everyone’s big cores to sit down. Sure, power efficiency goes up — and performance falls off a cliff. You trust Intel’s E-cores and LP E-cores that much?
And the killer: this actually made it into Stable. From what I can tell it’s preinstalled by default too. No idea how many people are going to get wrecked. The bug list already has plenty of casualties:
https://bugzilla.redhat.com/show_bug.cgi?id=2532653
The fix is simple — follow the buglist, or just outsource it to an AI:
My own ARL-H 285 is set up like this:
<?xml version="1.0"?>
<Configuration>
<lp_mode_cpus></lp_mode_cpus>
<lp_mode_epp></lp_mode_epp>
<Mode>1</Mode>
<PerformanceDef>-1</PerformanceDef>
<BalancedDef>0</BalancedDef>
<PowersaverDef>1</PowersaverDef>
<HfiLpmEnable>0</HfiLpmEnable>
<WLTHintEnable>1</WLTHintEnable>
<WLTHintPollEnable>1</WLTHintPollEnable>
<HfiSuvEnable>0</HfiSuvEnable>
<WLTHintMask>15</WLTHintMask>
<IgnoreITMT>0</IgnoreITMT>
<States>
<CPUFamily> 6 </CPUFamily>
<CPUModel> 197 </CPUModel>
<CPUConfig> * </CPUConfig>
<State>
<ID> 1 </ID>
<Name> UTIL_IDLE </Name>
<WLTTypeMask> 3 </WLTTypeMask>
<ActiveLcores>ALL</ActiveLcores>
<ActiveEcores>ALL</ActiveEcores>
<IRQMigrate>0</IRQMigrate>
<EPP>192</EPP>
<EPB>8</EPB>
</State>
<State>
<ID> 2 </ID>
<Name> UTIL_IDLE_SUSTAIN </Name>
<WLTType> 2 </WLTType>
<ActivePcores>ALL</ActivePcores>
<ActiveLcores>ALL</ActiveLcores>
<ActiveEcores>ALL</ActiveEcores>
<IRQMigrate>0</IRQMigrate>
<EPP>64</EPP>
<EPB>4</EPB>
</State>
<State>
<ID> 3 </ID>
<Name> UTIL_IDLE_BURSTY </Name>
<WLTType> 3 </WLTType>
<ActivePcores>ALL</ActivePcores>
<ActiveLcores>ALL</ActiveLcores>
<ActiveEcores>ALL</ActiveEcores>
<IRQMigrate>0</IRQMigrate>
<EPP>128</EPP>
<EPB>6</EPB>
</State>
</States>
</Configuration>
The gist: in Balanced, P-cores only spin up when needed, and can be shut off under light load.
Following that setup, I wrote a separate profile for my other big.LITTLE laptop, a 1215U: /etc/intel_lpmd/intel_lpmd_config_F6_M154_T15.xml. If you don’t know which profile your CPU maps to, check the lpmd service log — it’ll tell you which file it’s looking for, so just create that file.
<?xml version="1.0"?>
<Configuration>
<lp_mode_cpus></lp_mode_cpus>
<lp_mode_epp></lp_mode_epp>
<Mode>1</Mode>
<PerformanceDef>-1</PerformanceDef>
<BalancedDef>0</BalancedDef>
<PowersaverDef>1</PowersaverDef>
<HfiLpmEnable>1</HfiLpmEnable>
<WLTHintEnable>1</WLTHintEnable>
<WLTHintPollEnable>1</WLTHintPollEnable>
<HfiSuvEnable>0</HfiSuvEnable>
<WLTHintMask>15</WLTHintMask>
<util_entry_threshold>10</util_entry_threshold>
<util_exit_threshold>70</util_exit_threshold>
<IgnoreITMT>0</IgnoreITMT>
<States>
<CPUFamily> 6 </CPUFamily>
<CPUModel> 154 </CPUModel>
<CPUConfig> * </CPUConfig>
<State>
<ID> 1 </ID>
<Name> UTIL_IDLE </Name>
<WLTTypeMask> 3 </WLTTypeMask>
<ActiveEcores>ALL</ActiveEcores>
<IRQMigrate>0</IRQMigrate>
<EPP>192</EPP>
<EPB>8</EPB>
</State>
<State>
<ID> 2 </ID>
<Name> UTIL_IDLE_SUSTAIN </Name>
<WLTType> 2 </WLTType>
<ActivePcores>ALL</ActivePcores>
<ActiveEcores>ALL</ActiveEcores>
<IRQMigrate>0</IRQMigrate>
<EPP>64</EPP>
<EPB>4</EPB>
</State>
<State>
<ID> 3 </ID>
<Name> UTIL_IDLE_BURSTY </Name>
<WLTType> 3 </WLTType>
<ActivePcores>ALL</ActivePcores>
<ActiveEcores>ALL</ActiveEcores>
<IRQMigrate>0</IRQMigrate>
<EPP>128</EPP>
<EPB>6</EPB>
</State>
</States>
</Configuration>
Same basic strategy. Write the file, restart the lpmd service.
systemctl restart intel_lpmd
systemctl status intel_lpmd
Honestly the ARL-H didn’t gain much in efficiency, but the 1215U improved noticeably — whole-system power while browsing often sits at just 5W.
Comments are hosted on the Chinese main site. This mirror is read-only.