GitHub PR for ease of review: https://github.com/blochl/qemu/pull/2
Link to v1:
https://lists.gnu.org/archive/html/qemu-devel/2021-01/msg05246.html
On Thu, Aug 21, 2025 at 8:46 PM Leonid Bloch <lb.workbox@gmail.com> wrote:
> First, I must apologize for the extremely long delay since v1 - it has been
> nearly 4 years, which is unacceptable. Life circumstances intervened.
>
> This series introduces three ACPI devices that are particularly useful
> for laptop/mobile virtualization:
>
> * Battery
> * AC adapter
> * Laptop lid button
>
> Changes in v2:
> --------------
> Based on the feedback from Philippe Mathieu-Daudé and Michael S. Tsirkin:
>
> * Complete redesign with dual-mode operation:
> - QMP control mode (default): Devices are controlled via QMP commands,
> providing deterministic behavior essential for migration and CI/testing
> - Host mirroring mode (opt-in): Original sysfs/procfs monitoring
> behavior,
> now disabled by default
>
> * Migrated to modern QEMU ACPI architecture:
> - Devices now implement ACPI_DEV_AML_IF interface
> - AML generation moved from centralized acpi-build.c to device files
>
> * Added a QMP interface:
> - battery-set-state/query-battery
> - ac-adapter-set-state/query-ac-adapter
> - lid-button-set-state/query-lid-button
>
> * Documentation improvements:
> - Converted to .rst format
> - Added examples for both QMP and "fake" sysfs/procfs testing
>
> The dual-mode design ensures these devices are migration-safe and
> deterministic by default, while still allowing host state mirroring
> when explicitly requested for desktop use cases.
>
> Use cases:
> ----------
> 1. Testing: CI systems can programmatically control power states
> 2. Cloud: Expose virtual battery for usage-based resource limiting
> 3. Desktop virtualization: Mirror host laptop state to guest (opt-in)
> 4. Development: Test power management without physical hardware
>
> Example usage:
> --------------
> # Default QMP-controlled battery
> qemu-system-x86_64 -device battery
>
> # Mirror host battery
> qemu-system-x86_64 -device battery,use-qmp=false,enable-sysfs=true
>
> # Control via QMP
> {"execute": "battery-set-state",
> "arguments": {"state": {"present": true, "charging": false,
> "discharging": true, "charge-percent": 42,
> "rate": 500}}}
>
> The series has been tested with Windows and Linux guests, correctly
> showing battery status, AC adapter state, and lid button events in
> guest UIs and triggering appropriate power management actions.
>
> Thanks again for your patience and feedback.
> Leonid.
>
> Leonid Bloch (4):
> hw/acpi: Increase the number of possible ACPI interrupts
> hw/acpi: Introduce the QEMU Battery
> hw/acpi: Introduce the QEMU AC adapter
> hw/acpi: Introduce the QEMU lid button
>
> MAINTAINERS | 18 +
> docs/specs/acad.rst | 195 +++++++
> docs/specs/battery.rst | 225 ++++++++
> docs/specs/button.rst | 189 +++++++
> docs/specs/index.rst | 3 +
> hw/acpi/Kconfig | 12 +
> hw/acpi/acad.c | 447 ++++++++++++++++
> hw/acpi/battery.c | 735 +++++++++++++++++++++++++++
> hw/acpi/button.c | 438 ++++++++++++++++
> hw/acpi/core.c | 17 +-
> hw/acpi/meson.build | 3 +
> hw/acpi/trace-events | 15 +
> hw/i386/Kconfig | 3 +
> hw/i386/acpi-build.c | 1 +
> include/hw/acpi/acad.h | 27 +
> include/hw/acpi/acpi_dev_interface.h | 3 +
> include/hw/acpi/battery.h | 33 ++
> include/hw/acpi/button.h | 25 +
> qapi/acpi.json | 171 +++++++
> 19 files changed, 2558 insertions(+), 2 deletions(-)
> create mode 100644 docs/specs/acad.rst
> create mode 100644 docs/specs/battery.rst
> create mode 100644 docs/specs/button.rst
> create mode 100644 hw/acpi/acad.c
> create mode 100644 hw/acpi/battery.c
> create mode 100644 hw/acpi/button.c
> create mode 100644 include/hw/acpi/acad.h
> create mode 100644 include/hw/acpi/battery.h
> create mode 100644 include/hw/acpi/button.h
>
> --
> 2.50.1
>
>