]>
Commit | Line | Data |
---|---|---|
ebb62075 SO |
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_GED_H | |
60 | #define HW_ACPI_GED_H | |
61 | ||
62 | #include "hw/sysbus.h" | |
63 | #include "hw/acpi/memory_hotplug.h" | |
a08a6462 | 64 | #include "hw/acpi/ghes.h" |
db1015e9 | 65 | #include "qom/object.h" |
ebb62075 | 66 | |
1962f31b SK |
67 | #define ACPI_POWER_BUTTON_DEVICE "PWRB" |
68 | ||
ebb62075 | 69 | #define TYPE_ACPI_GED "acpi-ged" |
db1015e9 | 70 | typedef struct AcpiGedState AcpiGedState; |
ebb62075 SO |
71 | #define ACPI_GED(obj) \ |
72 | OBJECT_CHECK(AcpiGedState, (obj), TYPE_ACPI_GED) | |
73 | ||
74 | #define ACPI_GED_EVT_SEL_OFFSET 0x0 | |
75 | #define ACPI_GED_EVT_SEL_LEN 0x4 | |
76 | ||
77 | #define GED_DEVICE "GED" | |
78 | #define AML_GED_EVT_REG "EREG" | |
79 | #define AML_GED_EVT_SEL "ESEL" | |
80 | ||
81 | /* | |
82 | * Platforms need to specify the GED event bitmap | |
83 | * to describe what kind of events they want to support | |
84 | * through GED. | |
85 | */ | |
86 | #define ACPI_GED_MEM_HOTPLUG_EVT 0x1 | |
1962f31b | 87 | #define ACPI_GED_PWR_DOWN_EVT 0x2 |
c2505d1c | 88 | #define ACPI_GED_NVDIMM_HOTPLUG_EVT 0x4 |
ebb62075 SO |
89 | |
90 | typedef struct GEDState { | |
32905fc9 | 91 | MemoryRegion evt; |
ebb62075 SO |
92 | uint32_t sel; |
93 | } GEDState; | |
94 | ||
db1015e9 | 95 | struct AcpiGedState { |
ebb62075 SO |
96 | SysBusDevice parent_obj; |
97 | MemHotplugState memhp_state; | |
98 | MemoryRegion container_memhp; | |
99 | GEDState ged_state; | |
100 | uint32_t ged_event_bitmap; | |
101 | qemu_irq irq; | |
a08a6462 | 102 | AcpiGhesState ghes_state; |
db1015e9 | 103 | }; |
ebb62075 SO |
104 | |
105 | void build_ged_aml(Aml *table, const char* name, HotplugHandler *hotplug_dev, | |
106 | uint32_t ged_irq, AmlRegionSpace rs, hwaddr ged_base); | |
107 | ||
108 | #endif |