qemu/include/hw/acpi/generic_event_device.h
<<
>>
Prefs
   1/*
   2 *
   3 * Copyright (c) 2018 Intel Corporation
   4 * Copyright (c) 2019 Huawei Technologies R & D (UK) Ltd
   5 * Written by Samuel Ortiz, Shameer Kolothum
   6 *
   7 * This program is free software; you can redistribute it and/or modify it
   8 * under the terms and conditions of the GNU General Public License,
   9 * version 2 or later, as published by the Free Software Foundation.
  10 *
  11 * The ACPI Generic Event Device (GED) is a hardware-reduced specific
  12 * device[ACPI v6.1 Section 5.6.9] that handles all platform events,
  13 * including the hotplug ones. Generic Event Device allows platforms
  14 * to handle interrupts in ACPI ASL statements. It follows a very
  15 * similar approach like the _EVT method from GPIO events. All
  16 * interrupts are listed in  _CRS and the handler is written in _EVT
  17 * method. Here, we use a single interrupt for the GED device, relying
  18 * on IO memory region to communicate the type of device affected by
  19 * the interrupt. This way, we can support up to 32 events with a
  20 * unique interrupt.
  21 *
  22 * Here is an example.
  23 *
  24 * Device (\_SB.GED)
  25 * {
  26 *     Name (_HID, "ACPI0013")
  27 *     Name (_UID, Zero)
  28 *     Name (_CRS, ResourceTemplate ()
  29 *     {
  30 *         Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, ,, )
  31 *         {
  32 *              0x00000029,
  33 *         }
  34 *     })
  35 *     OperationRegion (EREG, SystemMemory, 0x09080000, 0x04)
  36 *     Field (EREG, DWordAcc, NoLock, WriteAsZeros)
  37 *     {
  38 *         ESEL,   32
  39 *     }
  40 *
  41 *     Method (_EVT, 1, Serialized)  // _EVT: Event
  42 *     {
  43 *         Local0 = ESEL // ESEL = IO memory region which specifies the
  44 *                       // device type.
  45 *         If (((Local0 & One) == One))
  46 *         {
  47 *             MethodEvent1()
  48 *         }
  49 *         If ((Local0 & 0x2) == 0x2)
  50 *         {
  51 *             MethodEvent2()
  52 *         }
  53 *         ...
  54 *     }
  55 * }
  56 *
  57 */
  58
  59#ifndef HW_ACPI_GENERIC_EVENT_DEVICE_H
  60#define HW_ACPI_GENERIC_EVENT_DEVICE_H
  61
  62#include "hw/sysbus.h"
  63#include "hw/acpi/memory_hotplug.h"
  64#include "hw/acpi/ghes.h"
  65#include "qom/object.h"
  66
  67#define ACPI_POWER_BUTTON_DEVICE "PWRB"
  68
  69#define TYPE_ACPI_GED "acpi-ged"
  70OBJECT_DECLARE_SIMPLE_TYPE(AcpiGedState, ACPI_GED)
  71
  72#define TYPE_ACPI_GED_X86 "acpi-ged-x86"
  73
  74#define ACPI_GED_EVT_SEL_OFFSET    0x0
  75#define ACPI_GED_EVT_SEL_LEN       0x4
  76
  77#define ACPI_GED_REG_SLEEP_CTL     0x00
  78#define ACPI_GED_REG_SLEEP_STS     0x01
  79#define ACPI_GED_REG_RESET         0x02
  80#define ACPI_GED_REG_COUNT         0x03
  81
  82/* ACPI_GED_REG_RESET value for reset*/
  83#define ACPI_GED_RESET_VALUE       0x42
  84
  85/* ACPI_GED_REG_SLEEP_CTL.SLP_TYP value for S5 (aka poweroff) */
  86#define ACPI_GED_SLP_TYP_S5        0x05
  87
  88#define GED_DEVICE      "GED"
  89#define AML_GED_EVT_REG "EREG"
  90#define AML_GED_EVT_SEL "ESEL"
  91
  92/*
  93 * Platforms need to specify the GED event bitmap
  94 * to describe what kind of events they want to support
  95 * through GED.
  96 */
  97#define ACPI_GED_MEM_HOTPLUG_EVT   0x1
  98#define ACPI_GED_PWR_DOWN_EVT      0x2
  99#define ACPI_GED_NVDIMM_HOTPLUG_EVT 0x4
 100
 101typedef struct GEDState {
 102    MemoryRegion evt;
 103    MemoryRegion regs;
 104    uint32_t     sel;
 105} GEDState;
 106
 107struct AcpiGedState {
 108    SysBusDevice parent_obj;
 109    MemHotplugState memhp_state;
 110    MemoryRegion container_memhp;
 111    GEDState ged_state;
 112    uint32_t ged_event_bitmap;
 113    qemu_irq irq;
 114    AcpiGhesState ghes_state;
 115};
 116
 117void build_ged_aml(Aml *table, const char* name, HotplugHandler *hotplug_dev,
 118                   uint32_t ged_irq, AmlRegionSpace rs, hwaddr ged_base);
 119void acpi_dsdt_add_power_button(Aml *scope);
 120
 121#endif
 122