Signed-off-by: Leonid Bloch <[email protected]>
---
 MAINTAINERS          |   5 ++
 docs/specs/acad.rst  | 126 +++++++++++++++++++++++++++++++++++++++++++
 docs/specs/index.rst |   1 +
 3 files changed, 132 insertions(+)
 create mode 100644 docs/specs/acad.rst

diff --git a/MAINTAINERS b/MAINTAINERS
index ce50329f48..47436ec878 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3043,6 +3043,11 @@ F: docs/specs/battery.rst
 F: hw/acpi/battery*
 F: include/hw/acpi/battery.h
 
+AC Adapter
+M: Leonid Bloch <[email protected]>
+S: Maintained
+F: docs/specs/acad.rst
+
 Subsystems
 ----------
 Overall Audio backends
diff --git a/docs/specs/acad.rst b/docs/specs/acad.rst
new file mode 100644
index 0000000000..af79b4b8d7
--- /dev/null
+++ b/docs/specs/acad.rst
@@ -0,0 +1,126 @@
+.. SPDX-License-Identifier: GPL-2.0-or-later
+
+=================
+AC Adapter Device
+=================
+
+The AC adapter device provides AC power state information to the guest via 
ACPI.
+AC adapter state is controlled via QMP commands, providing deterministic 
control
+for testing and migration safety.
+
+Configuration
+-------------
+
+The AC adapter device is created as an ISA device using ``-device acad``.
+
+Properties
+~~~~~~~~~~
+
+``ioport`` (default: 0x53c)
+  I/O port base address for the AC adapter device register.
+
+ACPI Interface
+--------------
+
+The AC adapter device is exposed to the guest as an ACPI device with:
+
+* **HID**: ``ACPI0003`` (AC Adapter)
+* **Device Path**: ``\_SB.ADP0``
+* **Notification Values**:
+
+  * ``0x80``: Status change (connected/disconnected)
+
+ACPI Methods
+~~~~~~~~~~~~
+
+``_PSR`` (Power Source)
+  Returns the current AC adapter state (0 = offline, 1 = online).
+
+``_PCL`` (Power Consumer List)
+  Returns the list of devices powered by this adapter.
+
+``_PIF`` (Power Source Information)
+  Returns static information about the power source including model number,
+  serial number, and OEM information.
+
+I/O Interface
+-------------
+
+The device uses a single I/O port register:
+
+* **Port**: ``ioport`` property value (default 0x53c)
+* **Size**: 1 byte
+* **Access**: Read-only
+
+Register Layout
+~~~~~~~~~~~~~~~
+
+**PWRS** (offset 0x00, 1 byte)
+  Current AC adapter state:
+
+  * ``0x00``: AC adapter offline (unplugged)
+  * ``0x01``: AC adapter online (plugged in)
+
+QMP Commands
+------------
+
+The following QMP commands control the AC adapter state:
+
+``ac-adapter-set-state``
+  Set the AC adapter connection state.
+
+  * ``connected``: Whether the AC adapter is connected (boolean)
+
+  Example::
+
+    -> { "execute": "ac-adapter-set-state",
+         "arguments": { "connected": true }}
+    <- { "return": {} }
+
+``query-ac-adapter``
+  Query the current AC adapter state.
+
+  Example::
+
+    -> { "execute": "query-ac-adapter" }
+    <- { "return": { "connected": true }}
+
+Examples
+--------
+
+Basic usage::
+
+  # Start VM with AC adapter
+  qemu-system-x86_64 -device acad -qmp tcp:localhost:4444,server,wait=off
+
+  # From another terminal, set AC adapter state via QMP:
+  echo '{"execute":"qmp_capabilities"}
+        {"execute":"ac-adapter-set-state",
+         "arguments":{"connected":true}}' | \
+  nc -N localhost 4444
+
+Simulate unplugging AC adapter::
+
+  # Start with AC adapter connected
+  echo '{"execute":"ac-adapter-set-state",
+         "arguments":{"connected":true}}' | nc -N localhost 4444
+
+  # Later, disconnect AC adapter
+  echo '{"execute":"ac-adapter-set-state",
+         "arguments":{"connected":false}}' | nc -N localhost 4444
+
+  # Reconnect AC adapter
+  echo '{"execute":"ac-adapter-set-state",
+         "arguments":{"connected":true}}' | nc -N localhost 4444
+
+Combined with battery device::
+
+  # Create a complete laptop power environment
+  qemu-system-x86_64 -device battery -device acad
+
+  # Simulate unplugging AC while on battery
+  echo '{"execute":"battery-set-state",
+         "arguments":{"state":{"present":true,"charging":false,
+                               "discharging":true,"charge-percent":75}}}
+        {"execute":"ac-adapter-set-state",
+         "arguments":{"connected":false}}' | nc -N localhost 4444
diff --git a/docs/specs/index.rst b/docs/specs/index.rst
index 3442b76da6..a19c75384c 100644
--- a/docs/specs/index.rst
+++ b/docs/specs/index.rst
@@ -22,6 +22,7 @@ guest hardware that is specific to QEMU.
    acpi_pci_hotplug
    acpi_nvdimm
    acpi_erst
+   acad
    battery
    sev-guest-firmware
    fw_cfg
-- 
2.54.0


Reply via email to