On Fri, Feb 6, 2026 at 6:45 PM Igor Mammedov <[email protected]> wrote:
>
> Add definitions for WDAT[1] actions/instructions
> and build_append_wdat_ins() API to build table entries.
>
> 1)
> "Hardware Watchdog Timers Design Specification"
>   https://uefi.org/acpi 'Watchdog Action Table (WDAT)'
>
> Signed-off-by: Igor Mammedov <[email protected]>

Reviewed-by: Ani Sinha <[email protected]>

> ---
>  include/hw/acpi/wdat.h | 118 +++++++++++++++++++++++++++++++++++++++++
>  hw/acpi/aml-build.c    |  14 +++++
>  2 files changed, 132 insertions(+)
>  create mode 100644 include/hw/acpi/wdat.h
>
> diff --git a/include/hw/acpi/wdat.h b/include/hw/acpi/wdat.h
> new file mode 100644
> index 0000000000..89803eef4b
> --- /dev/null
> +++ b/include/hw/acpi/wdat.h
> @@ -0,0 +1,118 @@
> +/*
> + * Watchdog Action Table (WDAT) definitions
> + *
> + * Copyright Red Hat, Inc. 2026
> + * Author(s): Igor Mammedov <[email protected]>
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +#ifndef QEMU_HW_ACPI_WDAT_H
> +#define QEMU_HW_ACPI_WDAT_H
> +
> +#include "hw/acpi/acpi-defs.h"
> +
> +/*
> + * Watchdog actions as described in
> + *  "Hardware Watchdog Timers Design Specification"
> + * for link to spec see https://uefi.org/acpi
> + *     'Watchdog Action Table (WDAT)'
> + */
> +typedef enum {
> +    /*
> +     * Restarts the watchdog timer's countdown. This action is
> +     * required.
> +     */
> +    WDAT_ACTION_RESET = 0x1,
> +    /*
> +     * Returns the current countdown value of the watchdog hardware
> +     * (in count intervals).
> +     */
> +    WDAT_ACTION_QUERY_CURRENT_COUNTDOWN_PERIOD = 0x4,
> +    /*
> +     * Returns the countdown value the watchdog hardware is
> +     * configured to use when reset (in count intervals).
> +     */
> +    WDAT_ACTION_QUERY_COUNTDOWN_PERIOD = 0x5,
> +    /*
> +     * Sets the countdown value (in count intervals) to be used when
> +     * the watchdog timer is reset. This action is required if
> +     * WDAT_ACTION_RESET does not explicitly write a new
> +     * countdown value to a register during a reset. Otherwise, this
> +     * action is optional.
> +     */
> +    WDAT_ACTION_SET_COUNTDOWN_PERIOD = 0x6,
> +    /*
> +     * Determines if the watchdog hardware is currently in enabled/
> +     * running state. The same result must occur when performed from
> +     * both from enabled/stopped state and enabled/running state. If
> +     * the watchdog hardware is disabled, results are indeterminate.
> +     * This action is required.
> +     */
> +    WDAT_ACTION_QUERY_RUNNING_STATE = 0x8,
> +    /*
> +     * Starts the watchdog, if not already in running state. If the
> +     * watchdog hardware is disabled, results are indeterminate.
> +     * This action is required.
> +     */
> +    WDAT_ACTION_SET_RUNNING_STATE = 0x9,
> +    /*
> +     * Determines if the watchdog hardware is currently in enabled/
> +     * stopped state. The same result must occur when performed from
> +     * both the enabled/stopped state and enabled/running state. If
> +     * the watchdog hardware is disabled, results are indeterminate.
> +     * This action is required.
> +     */
> +    WDAT_ACTION_QUERY_STOPPED_STATE = 0xA,
> +    /*
> +     * Stops the watchdog, if not already in stopped state. If the
> +     * watchdog hardware is disabled, results are indeterminate.
> +     * This action is required.
> +     */
> +    WDAT_ACTION_SET_STOPPED_STATE = 0xB,
> +    /*
> +     * Determines if the watchdog hardware is configured to perform a
> +     * reboot when the watchdog is fired.
> +     */
> +    WDAT_ACTION_QUERY_REBOOT = 0x10,
> +    /*
> +     * Configures the watchdog hardware to perform a reboot when it
> +     * is fired.
> +     */
> +    WDAT_ACTION_SET_REBOOT = 0x11,
> +    /*
> +     * Determines if the watchdog hardware is configured to perform a
> +     * system shutdown when fired.
> +     */
> +    WDAT_ACTION_QUERY_SHUTDOWN = 0x12,
> +    /*
> +     * Configures the watchdog hardware to perform a system shutdown
> +     * when fired.
> +     */
> +    WDAT_ACTION_SET_SHUTDOWN = 0x13,
> +    /*
> +     * Determines if the current boot was caused by the watchdog
> +     * firing. The boot status is required to be set if the watchdog
> +     * fired and caused a reboot. It is recommended that the
> +     * Watchdog Status be set if the watchdog fired and caused a
> +     * shutdown. This action is required.
> +     */
> +    WDAT_ACTION_QUERY_WATCHDOG_STATUS = 0x20,
> +    /*
> +     * Sets the watchdog's boot status to the default value. This
> +     * action is required.
> +     */
> +    WDAT_ACTION_SET_WATCHDOG_STATUS = 0x21,
> +} WDATAction;
> +
> +#define WDAT_INS_READ_VALUE 0x0
> +#define WDAT_INS_READ_COUNTDOWN 0x1
> +#define WDAT_INS_WRITE_VALUE 0x2
> +#define WDAT_INS_WRITE_COUNTDOWN 0x3
> +#define WDAT_INS_PRESERVE_REGISTER 0x80
> +
> +void build_append_wdat_ins(GArray *table_data,
> +                           WDATAction action, uint8_t flags,
> +                           struct AcpiGenericAddress as,
> +                           uint32_t val, uint32_t mask);
> +
> +#endif /* QEMU_HW_ACPI_WDAT_H */
> diff --git a/hw/acpi/aml-build.c b/hw/acpi/aml-build.c
> index ea1c415b21..9f9ce28dcc 100644
> --- a/hw/acpi/aml-build.c
> +++ b/hw/acpi/aml-build.c
> @@ -32,6 +32,7 @@
>  #include "hw/pci/pci_bus.h"
>  #include "hw/pci/pci_bridge.h"
>  #include "qemu/cutils.h"
> +#include "hw/acpi/wdat.h"
>
>  static GArray *build_alloc_array(void)
>  {
> @@ -2647,3 +2648,16 @@ Aml *aml_error_device(void)
>
>      return dev;
>  }
> +
> +void build_append_wdat_ins(GArray *table_data,
> +                           WDATAction action, uint8_t flags,
> +                           struct AcpiGenericAddress as,
> +                           uint32_t val, uint32_t mask)
> +{
> +    build_append_int_noprefix(table_data, action, 1);    /* Watchdog Action 
> */
> +    build_append_int_noprefix(table_data, flags, 1);     /* Instruction 
> Flags */
> +    build_append_int_noprefix(table_data, 0, 2);         /* Reserved */
> +    build_append_gas_from_struct(table_data, &as);       /* Register Region 
> */
> +    build_append_int_noprefix(table_data, val, 4);       /* Value */
> +    build_append_int_noprefix(table_data, mask, 4);      /* Mask */
> +}
> --
> 2.47.3
>


Reply via email to