acpi: implement ospm_status() method for PIIX4/ICH9_LPC devices
... using TYPE_ACPI_DEVICE_IF interface. Which provides status reporting of ACPI declared memory devices Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Acked-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
521b3673ac
commit
43f5041008
@ -309,3 +309,10 @@ void ich9_pm_device_plug_cb(ICH9LPCPMRegs *pm, DeviceState *dev, Error **errp)
|
||||
" type: %s", object_get_typename(OBJECT(dev)));
|
||||
}
|
||||
}
|
||||
|
||||
void ich9_pm_ospm_status(AcpiDeviceIf *adev, ACPIOSTInfoList ***list)
|
||||
{
|
||||
ICH9LPCState *s = ICH9_LPC_DEVICE(adev);
|
||||
|
||||
acpi_memory_ospm_status(&s->pm.acpi_memory_hotplug, list);
|
||||
}
|
||||
|
@ -4,6 +4,37 @@
|
||||
#include "hw/boards.h"
|
||||
#include "trace.h"
|
||||
|
||||
static ACPIOSTInfo *acpi_memory_device_status(int slot, MemStatus *mdev)
|
||||
{
|
||||
ACPIOSTInfo *info = g_new0(ACPIOSTInfo, 1);
|
||||
|
||||
info->slot_type = ACPI_SLOT_TYPE_DIMM;
|
||||
info->slot = g_strdup_printf("%d", slot);
|
||||
info->source = mdev->ost_event;
|
||||
info->status = mdev->ost_status;
|
||||
if (mdev->dimm) {
|
||||
DeviceState *dev = DEVICE(mdev->dimm);
|
||||
if (dev->id) {
|
||||
info->device = g_strdup(dev->id);
|
||||
info->has_device = true;
|
||||
}
|
||||
}
|
||||
return info;
|
||||
}
|
||||
|
||||
void acpi_memory_ospm_status(MemHotplugState *mem_st, ACPIOSTInfoList ***list)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < mem_st->dev_count; i++) {
|
||||
ACPIOSTInfoList *elem = g_new0(ACPIOSTInfoList, 1);
|
||||
elem->value = acpi_memory_device_status(i, &mem_st->devs[i]);
|
||||
elem->next = NULL;
|
||||
**list = elem;
|
||||
*list = &elem->next;
|
||||
}
|
||||
}
|
||||
|
||||
static uint64_t acpi_memory_hotplug_read(void *opaque, hwaddr addr,
|
||||
unsigned int size)
|
||||
{
|
||||
|
@ -35,6 +35,7 @@
|
||||
#include "hw/hotplug.h"
|
||||
#include "hw/mem/pc-dimm.h"
|
||||
#include "hw/acpi/memory_hotplug.h"
|
||||
#include "hw/acpi/acpi_dev_interface.h"
|
||||
|
||||
//#define DEBUG
|
||||
|
||||
@ -572,6 +573,13 @@ static void piix4_acpi_system_hot_add_init(MemoryRegion *parent,
|
||||
}
|
||||
}
|
||||
|
||||
static void piix4_ospm_status(AcpiDeviceIf *adev, ACPIOSTInfoList ***list)
|
||||
{
|
||||
PIIX4PMState *s = PIIX4_PM(adev);
|
||||
|
||||
acpi_memory_ospm_status(&s->acpi_memory_hotplug, list);
|
||||
}
|
||||
|
||||
static Property piix4_pm_properties[] = {
|
||||
DEFINE_PROP_UINT32("smb_io_base", PIIX4PMState, smb_io_base, 0),
|
||||
DEFINE_PROP_UINT8(ACPI_PM_PROP_S3_DISABLED, PIIX4PMState, disable_s3, 0),
|
||||
@ -589,6 +597,7 @@ static void piix4_pm_class_init(ObjectClass *klass, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
|
||||
AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_CLASS(klass);
|
||||
|
||||
k->init = piix4_pm_initfn;
|
||||
k->config_write = pm_write_config;
|
||||
@ -607,6 +616,7 @@ static void piix4_pm_class_init(ObjectClass *klass, void *data)
|
||||
dc->hotpluggable = false;
|
||||
hc->plug = piix4_device_plug_cb;
|
||||
hc->unplug = piix4_device_unplug_cb;
|
||||
adevc->ospm_status = piix4_ospm_status;
|
||||
}
|
||||
|
||||
static const TypeInfo piix4_pm_info = {
|
||||
@ -616,6 +626,7 @@ static const TypeInfo piix4_pm_info = {
|
||||
.class_init = piix4_pm_class_init,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_HOTPLUG_HANDLER },
|
||||
{ TYPE_ACPI_DEVICE_IF },
|
||||
{ }
|
||||
}
|
||||
};
|
||||
|
@ -658,6 +658,7 @@ static void ich9_lpc_class_init(ObjectClass *klass, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||
HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
|
||||
AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_CLASS(klass);
|
||||
|
||||
set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
|
||||
dc->reset = ich9_lpc_reset;
|
||||
@ -676,6 +677,7 @@ static void ich9_lpc_class_init(ObjectClass *klass, void *data)
|
||||
dc->cannot_instantiate_with_device_add_yet = true;
|
||||
hc->plug = ich9_device_plug_cb;
|
||||
hc->unplug = ich9_device_unplug_cb;
|
||||
adevc->ospm_status = ich9_pm_ospm_status;
|
||||
}
|
||||
|
||||
static const TypeInfo ich9_lpc_info = {
|
||||
@ -686,6 +688,7 @@ static const TypeInfo ich9_lpc_info = {
|
||||
.class_init = ich9_lpc_class_init,
|
||||
.interfaces = (InterfaceInfo[]) {
|
||||
{ TYPE_HOTPLUG_HANDLER },
|
||||
{ TYPE_ACPI_DEVICE_IF },
|
||||
{ }
|
||||
}
|
||||
};
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "hw/acpi/acpi.h"
|
||||
#include "hw/acpi/cpu_hotplug.h"
|
||||
#include "hw/acpi/memory_hotplug.h"
|
||||
#include "hw/acpi/acpi_dev_interface.h"
|
||||
|
||||
typedef struct ICH9LPCPMRegs {
|
||||
/*
|
||||
@ -59,4 +60,6 @@ extern const VMStateDescription vmstate_ich9_pm;
|
||||
void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm, Error **errp);
|
||||
|
||||
void ich9_pm_device_plug_cb(ICH9LPCPMRegs *pm, DeviceState *dev, Error **errp);
|
||||
|
||||
void ich9_pm_ospm_status(AcpiDeviceIf *adev, ACPIOSTInfoList ***list);
|
||||
#endif /* HW_ACPI_ICH9_H */
|
||||
|
@ -34,4 +34,5 @@ extern const VMStateDescription vmstate_memory_hotplug;
|
||||
VMSTATE_STRUCT(memhp, state, 1, \
|
||||
vmstate_memory_hotplug, MemHotplugState)
|
||||
|
||||
void acpi_memory_ospm_status(MemHotplugState *mem_st, ACPIOSTInfoList ***list);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user