# Intel Low Power Mode Daemon

Intel Low Power Mode Daemon (lpmd) is a Linux daemon designed to optimize active idle power. It selects the most power-efficient CPUs based on a configuration file or CPU topology. Depending on system utilization and other hints, it puts the system into Low Power Mode by activating the power-efficient CPUs and disabling the rest, and restores the system from Low Power Mode by activating all CPUs.

## Usage

Refer to the man pages for command line arguments and XML configurations:

```sh
man intel_lpmd
man intel_lpmd_control
man intel_lpmd_config.xml
```

## Install Dependencies

### Fedora

```sh
dnf install automake autoconf-archive gcc glib2-devel dbus-glib-devel libxml2-devel libnl3-devel systemd-devel gtk-doc upower-devel
```

### Ubuntu

```sh
sudo apt install autoconf autoconf-archive gcc libglib2.0-dev libdbus-1-dev libdbus-glib-1-dev libxml2-dev libnl-3-dev libnl-genl-3-dev libsystemd-dev gtk-doc-tools libupower-glib-dev
```

### OpenSUSE

```sh
zypper in automake gcc
```

## Build and Install

```sh
./autogen.sh
make
sudo make install
```

The generated artifacts are copied to respective directories under `/usr/local`. If a custom install path is preferred other than system default,  make sure `--localstatedir` and `--sysconfdir` are set to the right path that the system can understand. If installed via RPM then artifacts would be under `/usr`.

Example command for installation using prefix under `/opt/lpmd_install` dir with `--localstatedir` and `--sysconfdir` set to system default


```sh
./autogen.sh prefix=/opt/lpmd_install --localstatedir=/var --sysconfdir=/etc
```

## Run

### Start Service

```sh
sudo systemctl start intel_lpmd.service
```

### Get Status

```sh
sudo systemctl status intel_lpmd.service
```

### Stop Service

```sh
sudo systemctl stop intel_lpmd.service
```

### Terminate using DBUS Interface

```sh
sudo tests/lpm_test_interface.sh 1
```

## Testing Installation from Source

Launch `lpmd` in no-daemon mode:
```sh
./intel_lpmd --no-daemon --dbus-enable --loglevel=debug
```

Start `lpmd` using:
```sh
sudo sh tests/lpm_test_interface.sh 4
```

Run a workload and monitor `lpmd` to ensure it puts the system in the appropriate state based on the load.


## Releases

### Release 0.0.9

- Fix lpmd from processing HFI/WLT updates when it is not in auto mode.
- Improve README and other documents.
- Add support for graphics utilization detection.
- Add support for config states based on both WLT and graphics utilization.
- Introduce LunarLake platform specific config file.
- Minor fixes and cleanups.

### Release 0.0.8

- Introduce workload type proxy support.
- Add support for model/sku specific config file.
- Add detection for AC/DC status.
- Honor power profile daemon default EPP when restoring.
- Introduce MeteorLake-P platform specific config file.
- Minor fixes and cleanups.

### Release 0.0.7

- Change lpmd description from "Low Power Mode Daemon" to "Energy Optimizer (lpmd)" because it covers more scenarios.
- Fix invalid cgroup setting during probe, in case lpmd doesn't quit smoothly and cleanups are not done properly in the previous run.
- Introduce a new parameter `--ignore-platform-check`.
- Provide more detailed information when lpmd fails to probe on an unvalidated platform.
- Various fixes for array bound check, potential memory leak, etc.
- Autotool improvements.

### Release 0.0.6

- Remove automake and autoconf improvements due to a regression.
- Deprecate the dbus-glib dependency.

### Release 0.0.5

- Fix compiling errors with `-Wall`.
- Remove unintended default config file change to keep it unchanged since v0.0.3.

### Release 0.0.4

- Enhance HFI monitor to handle back-to-back HFI LPM hints.
- Enhance HFI monitor to handle HFI hints for banned CPUs.
- Introduce support for multiple Low Power states.
- Introduce support for workload type hint.
- Allow change EPP during Low Power modes transition.
- Minor fixes and cleanups.

### Release 0.0.3

- Convert from glib-dbus to GDBus.
- Add handling for CPU hotplug.
- Use strict CPU model check to allow intel_lpmd to run on validated platforms only, including ADL/RPL/MTL for now.
- CPUID.7 Hybrid bit is set
- /sys/firmware/acpi/pm_profile returns 2 (mobile platform)
- Use `cpuid()` to detect Lcores instead of using cache sysfs.
- Enhance Ecore module detection.
- Fix pthread error handling, suggested by ColinIanKing.
- Werror fixes from aekoroglu.

### Release 0.0.2

- Various fixes and cleanups.

### Release 0.0.1

- Add initial lpmd support.

## Security

See Intel's [Security Center](https://www.intel.com/content/www/us/en/security-center/default.html) for information on how to report a potential security issue or vulnerability.

See also: [Security Policy](security.md)
