Message ID | 1477672540-27952-5-git-send-email-guangrong.xiao@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sat, Oct 29, 2016 at 12:35:40AM +0800, Xiao Guangrong wrote: > _GPE.E04 is dedicated for nvdimm device hotplug > > Signed-off-by: Xiao Guangrong <guangrong.xiao@linux.intel.com> > --- > docs/specs/acpi_mem_hotplug.txt | 3 +++ > hw/acpi/memory_hotplug.c | 31 +++++++++++++++++++++++-------- > hw/i386/acpi-build.c | 7 +++++++ > hw/i386/pc.c | 12 ++++++++++++ > hw/mem/nvdimm.c | 4 ---- > include/hw/acpi/acpi_dev_interface.h | 1 + > 6 files changed, 46 insertions(+), 12 deletions(-) Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
On Sat, 29 Oct 2016 00:35:40 +0800 Xiao Guangrong <guangrong.xiao@linux.intel.com> wrote: > _GPE.E04 is dedicated for nvdimm device hotplug > > Signed-off-by: Xiao Guangrong <guangrong.xiao@linux.intel.com> > --- > docs/specs/acpi_mem_hotplug.txt | 3 +++ > hw/acpi/memory_hotplug.c | 31 +++++++++++++++++++++++-------- > hw/i386/acpi-build.c | 7 +++++++ > hw/i386/pc.c | 12 ++++++++++++ > hw/mem/nvdimm.c | 4 ---- > include/hw/acpi/acpi_dev_interface.h | 1 + > 6 files changed, 46 insertions(+), 12 deletions(-) > > diff --git a/docs/specs/acpi_mem_hotplug.txt b/docs/specs/acpi_mem_hotplug.txt > index 3df3620..cb26dd2 100644 > --- a/docs/specs/acpi_mem_hotplug.txt > +++ b/docs/specs/acpi_mem_hotplug.txt > @@ -4,6 +4,9 @@ QEMU<->ACPI BIOS memory hotplug interface > ACPI BIOS GPE.3 handler is dedicated for notifying OS about memory hot-add > and hot-remove events. > > +ACPI BIOS GPE.4 handler is dedicated for notifying OS about nvdimm device > +hot-add and hot-remove events. that should be part of nvdimm spec > Memory hot-plug interface (IO port 0xa00-0xa17, 1-4 byte access): > --------------------------------------------------------------- > 0xa00: > diff --git a/hw/acpi/memory_hotplug.c b/hw/acpi/memory_hotplug.c > index ec4e64b..70f6451 100644 > --- a/hw/acpi/memory_hotplug.c > +++ b/hw/acpi/memory_hotplug.c so far nvdimm hotplug has nothing do with memory hotplug so revert all changes you did to this file and put nvdimm hotplug handler code into hw/acpi/nvdimm.c and call it from respective ich9/piix4_pm handlers. [...] > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c > index bc49958..32270c3 100644 > --- a/hw/i386/acpi-build.c > +++ b/hw/i386/acpi-build.c > @@ -2039,6 +2039,13 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, > method = aml_method("_E03", 0, AML_NOTSERIALIZED); > aml_append(method, aml_call0(MEMORY_HOTPLUG_HANDLER_PATH)); > aml_append(scope, method); > + > + if (pcms->acpi_nvdimm_state.is_enabled) { > + method = aml_method("_E04", 0, AML_NOTSERIALIZED); > + aml_append(method, aml_notify(aml_name("\\_SB.NVDR"), > + aml_int(0x80))); > + aml_append(scope, method); > + } > } > aml_append(dsdt, scope); > > diff --git a/hw/i386/pc.c b/hw/i386/pc.c > index 3be6304..200963f 100644 > --- a/hw/i386/pc.c > +++ b/hw/i386/pc.c > @@ -1729,6 +1729,12 @@ static void pc_dimm_unplug_request(HotplugHandler *hotplug_dev, > goto out; > } > > + if (object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)) { > + error_setg(&local_err, > + "nvdimm device hot unplug is not supported yet."); > + goto out; > + } > + > hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev); > hhc->unplug_request(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err); > > @@ -1746,6 +1752,12 @@ static void pc_dimm_unplug(HotplugHandler *hotplug_dev, > HotplugHandlerClass *hhc; > Error *local_err = NULL; > > + if (object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)) { > + error_setg(&local_err, > + "nvdimm device hot unplug is not supported yet."); > + goto out; > + } > + > hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev); > hhc->unplug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err); > > diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c > index 7895805..db896b0 100644 > --- a/hw/mem/nvdimm.c > +++ b/hw/mem/nvdimm.c > @@ -148,13 +148,9 @@ static MemoryRegion *nvdimm_get_vmstate_memory_region(PCDIMMDevice *dimm) > > static void nvdimm_class_init(ObjectClass *oc, void *data) > { > - DeviceClass *dc = DEVICE_CLASS(oc); > PCDIMMDeviceClass *ddc = PC_DIMM_CLASS(oc); > NVDIMMClass *nvc = NVDIMM_CLASS(oc); > > - /* nvdimm hotplug has not been supported yet. */ > - dc->hotpluggable = false; > - > ddc->realize = nvdimm_realize; > ddc->get_memory_region = nvdimm_get_memory_region; > ddc->get_vmstate_memory_region = nvdimm_get_vmstate_memory_region; > diff --git a/include/hw/acpi/acpi_dev_interface.h b/include/hw/acpi/acpi_dev_interface.h > index da4ef7f..901a4ae 100644 > --- a/include/hw/acpi/acpi_dev_interface.h > +++ b/include/hw/acpi/acpi_dev_interface.h > @@ -10,6 +10,7 @@ typedef enum { > ACPI_PCI_HOTPLUG_STATUS = 2, > ACPI_CPU_HOTPLUG_STATUS = 4, > ACPI_MEMORY_HOTPLUG_STATUS = 8, > + ACPI_NVDIMM_HOTPLUG_STATUS = 16, > } AcpiEventStatusBits; > > #define TYPE_ACPI_DEVICE_IF "acpi-device-interface"
On 11/02/2016 07:21 PM, Igor Mammedov wrote: > On Sat, 29 Oct 2016 00:35:40 +0800 > Xiao Guangrong <guangrong.xiao@linux.intel.com> wrote: > >> _GPE.E04 is dedicated for nvdimm device hotplug >> >> Signed-off-by: Xiao Guangrong <guangrong.xiao@linux.intel.com> >> --- >> docs/specs/acpi_mem_hotplug.txt | 3 +++ >> hw/acpi/memory_hotplug.c | 31 +++++++++++++++++++++++-------- >> hw/i386/acpi-build.c | 7 +++++++ >> hw/i386/pc.c | 12 ++++++++++++ >> hw/mem/nvdimm.c | 4 ---- >> include/hw/acpi/acpi_dev_interface.h | 1 + >> 6 files changed, 46 insertions(+), 12 deletions(-) >> >> diff --git a/docs/specs/acpi_mem_hotplug.txt b/docs/specs/acpi_mem_hotplug.txt >> index 3df3620..cb26dd2 100644 >> --- a/docs/specs/acpi_mem_hotplug.txt >> +++ b/docs/specs/acpi_mem_hotplug.txt >> @@ -4,6 +4,9 @@ QEMU<->ACPI BIOS memory hotplug interface >> ACPI BIOS GPE.3 handler is dedicated for notifying OS about memory hot-add >> and hot-remove events. >> >> +ACPI BIOS GPE.4 handler is dedicated for notifying OS about nvdimm device >> +hot-add and hot-remove events. > that should be part of nvdimm spec Okay. > >> Memory hot-plug interface (IO port 0xa00-0xa17, 1-4 byte access): >> --------------------------------------------------------------- >> 0xa00: >> diff --git a/hw/acpi/memory_hotplug.c b/hw/acpi/memory_hotplug.c >> index ec4e64b..70f6451 100644 >> --- a/hw/acpi/memory_hotplug.c >> +++ b/hw/acpi/memory_hotplug.c > so far nvdimm hotplug has nothing do with memory hotplug so revert > all changes you did to this file and put nvdimm hotplug handler > code into hw/acpi/nvdimm.c > > and call it from respective ich9/piix4_pm handlers. Okay.
diff --git a/docs/specs/acpi_mem_hotplug.txt b/docs/specs/acpi_mem_hotplug.txt index 3df3620..cb26dd2 100644 --- a/docs/specs/acpi_mem_hotplug.txt +++ b/docs/specs/acpi_mem_hotplug.txt @@ -4,6 +4,9 @@ QEMU<->ACPI BIOS memory hotplug interface ACPI BIOS GPE.3 handler is dedicated for notifying OS about memory hot-add and hot-remove events. +ACPI BIOS GPE.4 handler is dedicated for notifying OS about nvdimm device +hot-add and hot-remove events. + Memory hot-plug interface (IO port 0xa00-0xa17, 1-4 byte access): --------------------------------------------------------------- 0xa00: diff --git a/hw/acpi/memory_hotplug.c b/hw/acpi/memory_hotplug.c index ec4e64b..70f6451 100644 --- a/hw/acpi/memory_hotplug.c +++ b/hw/acpi/memory_hotplug.c @@ -2,6 +2,7 @@ #include "hw/acpi/memory_hotplug.h" #include "hw/acpi/pc-hotplug.h" #include "hw/mem/pc-dimm.h" +#include "hw/mem/nvdimm.h" #include "hw/boards.h" #include "hw/qdev-core.h" #include "trace.h" @@ -232,11 +233,8 @@ void acpi_memory_plug_cb(HotplugHandler *hotplug_dev, MemHotplugState *mem_st, DeviceState *dev, Error **errp) { MemStatus *mdev; - DeviceClass *dc = DEVICE_GET_CLASS(dev); - - if (!dc->hotpluggable) { - return; - } + AcpiEventStatusBits event; + bool is_nvdimm = object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM); mdev = acpi_memory_slot_status(mem_st, dev, errp); if (!mdev) { @@ -244,10 +242,23 @@ void acpi_memory_plug_cb(HotplugHandler *hotplug_dev, MemHotplugState *mem_st, } mdev->dimm = dev; - mdev->is_enabled = true; + + /* + * do not set is_enabled and is_inserting if the slot is plugged with + * a nvdimm device to stop OSPM inquires memory region from the slot. + */ + if (is_nvdimm) { + event = ACPI_NVDIMM_HOTPLUG_STATUS; + } else { + mdev->is_enabled = true; + event = ACPI_MEMORY_HOTPLUG_STATUS; + } + if (dev->hotplugged) { - mdev->is_inserting = true; - acpi_send_event(DEVICE(hotplug_dev), ACPI_MEMORY_HOTPLUG_STATUS); + if (!is_nvdimm) { + mdev->is_inserting = true; + } + acpi_send_event(DEVICE(hotplug_dev), event); } } @@ -262,6 +273,8 @@ void acpi_memory_unplug_request_cb(HotplugHandler *hotplug_dev, return; } + /* nvdimm device hot unplug is not supported yet. */ + assert(!object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)); mdev->is_removing = true; acpi_send_event(DEVICE(hotplug_dev), ACPI_MEMORY_HOTPLUG_STATUS); } @@ -276,6 +289,8 @@ void acpi_memory_unplug_cb(MemHotplugState *mem_st, return; } + /* nvdimm device hot unplug is not supported yet. */ + assert(!object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)); mdev->is_enabled = false; mdev->dimm = NULL; } diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index bc49958..32270c3 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -2039,6 +2039,13 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, method = aml_method("_E03", 0, AML_NOTSERIALIZED); aml_append(method, aml_call0(MEMORY_HOTPLUG_HANDLER_PATH)); aml_append(scope, method); + + if (pcms->acpi_nvdimm_state.is_enabled) { + method = aml_method("_E04", 0, AML_NOTSERIALIZED); + aml_append(method, aml_notify(aml_name("\\_SB.NVDR"), + aml_int(0x80))); + aml_append(scope, method); + } } aml_append(dsdt, scope); diff --git a/hw/i386/pc.c b/hw/i386/pc.c index 3be6304..200963f 100644 --- a/hw/i386/pc.c +++ b/hw/i386/pc.c @@ -1729,6 +1729,12 @@ static void pc_dimm_unplug_request(HotplugHandler *hotplug_dev, goto out; } + if (object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)) { + error_setg(&local_err, + "nvdimm device hot unplug is not supported yet."); + goto out; + } + hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev); hhc->unplug_request(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err); @@ -1746,6 +1752,12 @@ static void pc_dimm_unplug(HotplugHandler *hotplug_dev, HotplugHandlerClass *hhc; Error *local_err = NULL; + if (object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)) { + error_setg(&local_err, + "nvdimm device hot unplug is not supported yet."); + goto out; + } + hhc = HOTPLUG_HANDLER_GET_CLASS(pcms->acpi_dev); hhc->unplug(HOTPLUG_HANDLER(pcms->acpi_dev), dev, &local_err); diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c index 7895805..db896b0 100644 --- a/hw/mem/nvdimm.c +++ b/hw/mem/nvdimm.c @@ -148,13 +148,9 @@ static MemoryRegion *nvdimm_get_vmstate_memory_region(PCDIMMDevice *dimm) static void nvdimm_class_init(ObjectClass *oc, void *data) { - DeviceClass *dc = DEVICE_CLASS(oc); PCDIMMDeviceClass *ddc = PC_DIMM_CLASS(oc); NVDIMMClass *nvc = NVDIMM_CLASS(oc); - /* nvdimm hotplug has not been supported yet. */ - dc->hotpluggable = false; - ddc->realize = nvdimm_realize; ddc->get_memory_region = nvdimm_get_memory_region; ddc->get_vmstate_memory_region = nvdimm_get_vmstate_memory_region; diff --git a/include/hw/acpi/acpi_dev_interface.h b/include/hw/acpi/acpi_dev_interface.h index da4ef7f..901a4ae 100644 --- a/include/hw/acpi/acpi_dev_interface.h +++ b/include/hw/acpi/acpi_dev_interface.h @@ -10,6 +10,7 @@ typedef enum { ACPI_PCI_HOTPLUG_STATUS = 2, ACPI_CPU_HOTPLUG_STATUS = 4, ACPI_MEMORY_HOTPLUG_STATUS = 8, + ACPI_NVDIMM_HOTPLUG_STATUS = 16, } AcpiEventStatusBits; #define TYPE_ACPI_DEVICE_IF "acpi-device-interface"
_GPE.E04 is dedicated for nvdimm device hotplug Signed-off-by: Xiao Guangrong <guangrong.xiao@linux.intel.com> --- docs/specs/acpi_mem_hotplug.txt | 3 +++ hw/acpi/memory_hotplug.c | 31 +++++++++++++++++++++++-------- hw/i386/acpi-build.c | 7 +++++++ hw/i386/pc.c | 12 ++++++++++++ hw/mem/nvdimm.c | 4 ---- include/hw/acpi/acpi_dev_interface.h | 1 + 6 files changed, 46 insertions(+), 12 deletions(-)