acpi: ged: add control regs
Add control regs (sleep, reset) for hw-reduced acpi. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Igor Mammedov <imammedo@redhat.com> Message-id: 20200915120909.20838-5-kraxel@redhat.com
This commit is contained in:
parent
38edb514c9
commit
14404dd2d1
|
@ -20,6 +20,7 @@
|
||||||
#include "hw/qdev-properties.h"
|
#include "hw/qdev-properties.h"
|
||||||
#include "migration/vmstate.h"
|
#include "migration/vmstate.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
|
#include "sysemu/runstate.h"
|
||||||
|
|
||||||
static const uint32_t ged_supported_events[] = {
|
static const uint32_t ged_supported_events[] = {
|
||||||
ACPI_GED_MEM_HOTPLUG_EVT,
|
ACPI_GED_MEM_HOTPLUG_EVT,
|
||||||
|
@ -176,6 +177,45 @@ static const MemoryRegionOps ged_evt_ops = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static uint64_t ged_regs_read(void *opaque, hwaddr addr, unsigned size)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ged_regs_write(void *opaque, hwaddr addr, uint64_t data,
|
||||||
|
unsigned int size)
|
||||||
|
{
|
||||||
|
bool slp_en;
|
||||||
|
int slp_typ;
|
||||||
|
|
||||||
|
switch (addr) {
|
||||||
|
case ACPI_GED_REG_SLEEP_CTL:
|
||||||
|
slp_typ = (data >> 2) & 0x07;
|
||||||
|
slp_en = (data >> 5) & 0x01;
|
||||||
|
if (slp_en && slp_typ == 5) {
|
||||||
|
qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
case ACPI_GED_REG_SLEEP_STS:
|
||||||
|
return;
|
||||||
|
case ACPI_GED_REG_RESET:
|
||||||
|
if (data == ACPI_GED_RESET_VALUE) {
|
||||||
|
qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static const MemoryRegionOps ged_regs_ops = {
|
||||||
|
.read = ged_regs_read,
|
||||||
|
.write = ged_regs_write,
|
||||||
|
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||||
|
.valid = {
|
||||||
|
.min_access_size = 1,
|
||||||
|
.max_access_size = 1,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static void acpi_ged_device_plug_cb(HotplugHandler *hotplug_dev,
|
static void acpi_ged_device_plug_cb(HotplugHandler *hotplug_dev,
|
||||||
DeviceState *dev, Error **errp)
|
DeviceState *dev, Error **errp)
|
||||||
{
|
{
|
||||||
|
@ -332,6 +372,10 @@ static void acpi_ged_initfn(Object *obj)
|
||||||
sysbus_init_mmio(sbd, &s->container_memhp);
|
sysbus_init_mmio(sbd, &s->container_memhp);
|
||||||
acpi_memory_hotplug_init(&s->container_memhp, OBJECT(dev),
|
acpi_memory_hotplug_init(&s->container_memhp, OBJECT(dev),
|
||||||
&s->memhp_state, 0);
|
&s->memhp_state, 0);
|
||||||
|
|
||||||
|
memory_region_init_io(&ged_st->regs, obj, &ged_regs_ops, ged_st,
|
||||||
|
TYPE_ACPI_GED "-regs", ACPI_GED_REG_COUNT);
|
||||||
|
sysbus_init_mmio(sbd, &ged_st->regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void acpi_ged_class_init(ObjectClass *class, void *data)
|
static void acpi_ged_class_init(ObjectClass *class, void *data)
|
||||||
|
|
|
@ -74,6 +74,17 @@ DECLARE_INSTANCE_CHECKER(AcpiGedState, ACPI_GED,
|
||||||
#define ACPI_GED_EVT_SEL_OFFSET 0x0
|
#define ACPI_GED_EVT_SEL_OFFSET 0x0
|
||||||
#define ACPI_GED_EVT_SEL_LEN 0x4
|
#define ACPI_GED_EVT_SEL_LEN 0x4
|
||||||
|
|
||||||
|
#define ACPI_GED_REG_SLEEP_CTL 0x00
|
||||||
|
#define ACPI_GED_REG_SLEEP_STS 0x01
|
||||||
|
#define ACPI_GED_REG_RESET 0x02
|
||||||
|
#define ACPI_GED_REG_COUNT 0x03
|
||||||
|
|
||||||
|
/* ACPI_GED_REG_RESET value for reset*/
|
||||||
|
#define ACPI_GED_RESET_VALUE 0x42
|
||||||
|
|
||||||
|
/* ACPI_GED_REG_SLEEP_CTL.SLP_TYP value for S5 (aka poweroff) */
|
||||||
|
#define ACPI_GED_SLP_TYP_S5 0x05
|
||||||
|
|
||||||
#define GED_DEVICE "GED"
|
#define GED_DEVICE "GED"
|
||||||
#define AML_GED_EVT_REG "EREG"
|
#define AML_GED_EVT_REG "EREG"
|
||||||
#define AML_GED_EVT_SEL "ESEL"
|
#define AML_GED_EVT_SEL "ESEL"
|
||||||
|
@ -89,6 +100,7 @@ DECLARE_INSTANCE_CHECKER(AcpiGedState, ACPI_GED,
|
||||||
|
|
||||||
typedef struct GEDState {
|
typedef struct GEDState {
|
||||||
MemoryRegion evt;
|
MemoryRegion evt;
|
||||||
|
MemoryRegion regs;
|
||||||
uint32_t sel;
|
uint32_t sel;
|
||||||
} GEDState;
|
} GEDState;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue