3 * Copyright (c) 2018 Intel Corporation
4 * Copyright (c) 2019 Huawei Technologies R & D (UK) Ltd
5 * Written by Samuel Ortiz, Shameer Kolothum
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.
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
26 * Name (_HID, "ACPI0013")
28 * Name (_CRS, ResourceTemplate ()
30 * Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, ,, )
35 * OperationRegion (EREG, SystemMemory, 0x09080000, 0x04)
36 * Field (EREG, DWordAcc, NoLock, WriteAsZeros)
41 * Method (_EVT, 1, Serialized) // _EVT: Event
43 * Local0 = ESEL // ESEL = IO memory region which specifies the
45 * If (((Local0 & One) == One))
49 * If ((Local0 & 0x2) == 0x2)
59 #ifndef HW_ACPI_GENERIC_EVENT_DEVICE_H
60 #define HW_ACPI_GENERIC_EVENT_DEVICE_H
62 #include "hw/sysbus.h"
63 #include "hw/acpi/memory_hotplug.h"
64 #include "hw/acpi/ghes.h"
65 #include "qom/object.h"
67 #define ACPI_POWER_BUTTON_DEVICE "PWRB"
69 #define TYPE_ACPI_GED "acpi-ged"
70 OBJECT_DECLARE_SIMPLE_TYPE(AcpiGedState
, ACPI_GED
)
72 #define TYPE_ACPI_GED_X86 "acpi-ged-x86"
74 #define ACPI_GED_EVT_SEL_OFFSET 0x0
75 #define ACPI_GED_EVT_SEL_LEN 0x4
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
82 /* ACPI_GED_REG_RESET value for reset*/
83 #define ACPI_GED_RESET_VALUE 0x42
85 /* ACPI_GED_REG_SLEEP_CTL.SLP_TYP value for S5 (aka poweroff) */
86 #define ACPI_GED_SLP_TYP_S5 0x05
88 #define GED_DEVICE "GED"
89 #define AML_GED_EVT_REG "EREG"
90 #define AML_GED_EVT_SEL "ESEL"
93 * Platforms need to specify the GED event bitmap
94 * to describe what kind of events they want to support
97 #define ACPI_GED_MEM_HOTPLUG_EVT 0x1
98 #define ACPI_GED_PWR_DOWN_EVT 0x2
99 #define ACPI_GED_NVDIMM_HOTPLUG_EVT 0x4
101 typedef struct GEDState
{
107 struct AcpiGedState
{
108 SysBusDevice parent_obj
;
109 MemHotplugState memhp_state
;
110 MemoryRegion container_memhp
;
112 uint32_t ged_event_bitmap
;
114 AcpiGhesState ghes_state
;
117 void build_ged_aml(Aml
*table
, const char* name
, HotplugHandler
*hotplug_dev
,
118 uint32_t ged_irq
, AmlRegionSpace rs
, hwaddr ged_base
);
119 void acpi_dsdt_add_power_button(Aml
*scope
);