All of lore.kernel.org
 help / color / mirror / Atom feed
From: Xiao Guangrong <guangrong.xiao@linux.intel.com>
To: pbonzini@redhat.com, imammedo@redhat.com
Cc: gleb@kernel.org, mtosatti@redhat.com, stefanha@redhat.com,
	mst@redhat.com, rth@twiddle.net, ehabkost@redhat.com,
	dan.j.williams@intel.com, kvm@vger.kernel.org,
	qemu-devel@nongnu.org,
	Xiao Guangrong <guangrong.xiao@linux.intel.com>
Subject: [PATCH v2 7/8] pc: acpi: memhp: nvdimm hotplug support
Date: Fri, 12 Aug 2016 14:54:09 +0800	[thread overview]
Message-ID: <1470984850-66891-8-git-send-email-guangrong.xiao@linux.intel.com> (raw)
In-Reply-To: <1470984850-66891-1-git-send-email-guangrong.xiao@linux.intel.com>

It notifies the nvdimm root device if there is a nvdimm device
plugged/unplugged

A new bit is used to indicates it is a nvdimm device

Signed-off-by: Xiao Guangrong <guangrong.xiao@linux.intel.com>
---
 docs/specs/acpi_mem_hotplug.txt |  4 +++-
 hw/acpi/memory_hotplug.c        |  5 -----
 hw/i386/acpi-build.c            | 26 ++++++++++++++++++++++----
 hw/mem/nvdimm.c                 |  4 ----
 include/hw/acpi/pc-hotplug.h    |  1 +
 5 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/docs/specs/acpi_mem_hotplug.txt b/docs/specs/acpi_mem_hotplug.txt
index 3df3620..cd9e233 100644
--- a/docs/specs/acpi_mem_hotplug.txt
+++ b/docs/specs/acpi_mem_hotplug.txt
@@ -21,7 +21,9 @@ Memory hot-plug interface (IO port 0xa00-0xa17, 1-4 byte access):
                  It's valid only when bit 1 is set.
               2: Device remove event, used to distinguish device for which
                  no device eject request to OSPM was issued.
-              3-7: reserved and should be ignored by OSPM
+              3: reserved and should be ignored by OSPM
+              4: Device is a NVDIMM device.
+              5-7: reserved and should be ignored by OSPM
       [0x15-0x17] reserved
 
   write access:
diff --git a/hw/acpi/memory_hotplug.c b/hw/acpi/memory_hotplug.c
index 73fa62d..d1c2e92 100644
--- a/hw/acpi/memory_hotplug.c
+++ b/hw/acpi/memory_hotplug.c
@@ -239,11 +239,6 @@ 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;
-    }
 
     mdev = acpi_memory_slot_status(mem_st, dev, errp);
     if (!mdev) {
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index b1d0ced..02cfc4d 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -1008,9 +1008,10 @@ static Aml *build_crs(PCIHostState *host, CrsRangeSet *range_set)
     return crs;
 }
 
-static void build_memory_devices(Aml *sb_scope, int nr_mem,
-                                 uint16_t io_base, uint16_t io_len)
+static void build_memory_devices(Aml *sb_scope, int nr_mem, uint16_t io_base,
+                                 uint16_t io_len, bool enable_nvdimm)
 {
+    #define BASEPATH "\\_SB.PCI0." MEMORY_HOTPLUG_DEVICE "."
     int i;
     Aml *scope;
     Aml *crs;
@@ -1065,6 +1066,12 @@ static void build_memory_devices(Aml *sb_scope, int nr_mem,
     aml_append(field,
         /* initiates device eject, write only */
         aml_named_field(MEMORY_SLOT_EJECT, 1));
+
+    if (enable_nvdimm) {
+        aml_append(field,
+        /* initiates nvdimm device, read only */
+        aml_named_field(MEMORY_SLOT_NVDIMM, 1));
+    }
     aml_append(scope, field);
 
     field = aml_field(MEMORY_HOTPLUG_IO_REGION, AML_DWORD_ACC,
@@ -1079,7 +1086,6 @@ static void build_memory_devices(Aml *sb_scope, int nr_mem,
     aml_append(sb_scope, scope);
 
     for (i = 0; i < nr_mem; i++) {
-        #define BASEPATH "\\_SB.PCI0." MEMORY_HOTPLUG_DEVICE "."
         const char *s;
 
         dev = aml_device("MP%02X", i);
@@ -1124,6 +1130,17 @@ static void build_memory_devices(Aml *sb_scope, int nr_mem,
     method = aml_method(MEMORY_SLOT_NOTIFY_METHOD, 2, AML_NOTSERIALIZED);
     for (i = 0; i < nr_mem; i++) {
         ifctx = aml_if(aml_equal(aml_arg(0), aml_int(i)));
+
+        if (enable_nvdimm) {
+            Aml *ifnvdimm;
+
+            ifnvdimm = aml_if(aml_equal(aml_name(BASEPATH MEMORY_SLOT_NVDIMM),
+                                        aml_int(1)));
+            aml_append(ifnvdimm, aml_notify(aml_name("\\_SB.NVDR"),
+                                            aml_int(0x80)));
+            aml_append(ifctx, ifnvdimm);
+        }
+
         aml_append(ifctx,
             aml_notify(aml_name("MP%.02X", i), aml_arg(1))
         );
@@ -2285,7 +2302,8 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
     sb_scope = aml_scope("\\_SB");
     {
         build_memory_devices(sb_scope, nr_mem, pm->mem_hp_io_base,
-                             pm->mem_hp_io_len);
+                             pm->mem_hp_io_len,
+                             pcms->acpi_nvdimm_state.is_enabled);
 
         {
             Object *pci_host;
diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
index 5bc81fe..af32508 100644
--- a/hw/mem/nvdimm.c
+++ b/hw/mem/nvdimm.c
@@ -155,13 +155,9 @@ static void nvdimm_prepare_unplug(DeviceState *dev)
 
 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/pc-hotplug.h b/include/hw/acpi/pc-hotplug.h
index 6a8d268..a14977d 100644
--- a/include/hw/acpi/pc-hotplug.h
+++ b/include/hw/acpi/pc-hotplug.h
@@ -43,6 +43,7 @@
 #define MEMORY_SLOT_INSERT_EVENT     "MINS"
 #define MEMORY_SLOT_REMOVE_EVENT     "MRMV"
 #define MEMORY_SLOT_EJECT            "MEJ"
+#define MEMORY_SLOT_NVDIMM           "NVDM"
 #define MEMORY_SLOT_SLECTOR          "MSEL"
 #define MEMORY_SLOT_OST_EVENT        "MOEV"
 #define MEMORY_SLOT_OST_STATUS       "MOSC"
-- 
1.8.3.1


WARNING: multiple messages have this Message-ID (diff)
From: Xiao Guangrong <guangrong.xiao@linux.intel.com>
To: pbonzini@redhat.com, imammedo@redhat.com
Cc: gleb@kernel.org, mtosatti@redhat.com, stefanha@redhat.com,
	mst@redhat.com, rth@twiddle.net, ehabkost@redhat.com,
	dan.j.williams@intel.com, kvm@vger.kernel.org,
	qemu-devel@nongnu.org,
	Xiao Guangrong <guangrong.xiao@linux.intel.com>
Subject: [Qemu-devel] [PATCH v2 7/8] pc: acpi: memhp: nvdimm hotplug support
Date: Fri, 12 Aug 2016 14:54:09 +0800	[thread overview]
Message-ID: <1470984850-66891-8-git-send-email-guangrong.xiao@linux.intel.com> (raw)
In-Reply-To: <1470984850-66891-1-git-send-email-guangrong.xiao@linux.intel.com>

It notifies the nvdimm root device if there is a nvdimm device
plugged/unplugged

A new bit is used to indicates it is a nvdimm device

Signed-off-by: Xiao Guangrong <guangrong.xiao@linux.intel.com>
---
 docs/specs/acpi_mem_hotplug.txt |  4 +++-
 hw/acpi/memory_hotplug.c        |  5 -----
 hw/i386/acpi-build.c            | 26 ++++++++++++++++++++++----
 hw/mem/nvdimm.c                 |  4 ----
 include/hw/acpi/pc-hotplug.h    |  1 +
 5 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/docs/specs/acpi_mem_hotplug.txt b/docs/specs/acpi_mem_hotplug.txt
index 3df3620..cd9e233 100644
--- a/docs/specs/acpi_mem_hotplug.txt
+++ b/docs/specs/acpi_mem_hotplug.txt
@@ -21,7 +21,9 @@ Memory hot-plug interface (IO port 0xa00-0xa17, 1-4 byte access):
                  It's valid only when bit 1 is set.
               2: Device remove event, used to distinguish device for which
                  no device eject request to OSPM was issued.
-              3-7: reserved and should be ignored by OSPM
+              3: reserved and should be ignored by OSPM
+              4: Device is a NVDIMM device.
+              5-7: reserved and should be ignored by OSPM
       [0x15-0x17] reserved
 
   write access:
diff --git a/hw/acpi/memory_hotplug.c b/hw/acpi/memory_hotplug.c
index 73fa62d..d1c2e92 100644
--- a/hw/acpi/memory_hotplug.c
+++ b/hw/acpi/memory_hotplug.c
@@ -239,11 +239,6 @@ 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;
-    }
 
     mdev = acpi_memory_slot_status(mem_st, dev, errp);
     if (!mdev) {
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index b1d0ced..02cfc4d 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -1008,9 +1008,10 @@ static Aml *build_crs(PCIHostState *host, CrsRangeSet *range_set)
     return crs;
 }
 
-static void build_memory_devices(Aml *sb_scope, int nr_mem,
-                                 uint16_t io_base, uint16_t io_len)
+static void build_memory_devices(Aml *sb_scope, int nr_mem, uint16_t io_base,
+                                 uint16_t io_len, bool enable_nvdimm)
 {
+    #define BASEPATH "\\_SB.PCI0." MEMORY_HOTPLUG_DEVICE "."
     int i;
     Aml *scope;
     Aml *crs;
@@ -1065,6 +1066,12 @@ static void build_memory_devices(Aml *sb_scope, int nr_mem,
     aml_append(field,
         /* initiates device eject, write only */
         aml_named_field(MEMORY_SLOT_EJECT, 1));
+
+    if (enable_nvdimm) {
+        aml_append(field,
+        /* initiates nvdimm device, read only */
+        aml_named_field(MEMORY_SLOT_NVDIMM, 1));
+    }
     aml_append(scope, field);
 
     field = aml_field(MEMORY_HOTPLUG_IO_REGION, AML_DWORD_ACC,
@@ -1079,7 +1086,6 @@ static void build_memory_devices(Aml *sb_scope, int nr_mem,
     aml_append(sb_scope, scope);
 
     for (i = 0; i < nr_mem; i++) {
-        #define BASEPATH "\\_SB.PCI0." MEMORY_HOTPLUG_DEVICE "."
         const char *s;
 
         dev = aml_device("MP%02X", i);
@@ -1124,6 +1130,17 @@ static void build_memory_devices(Aml *sb_scope, int nr_mem,
     method = aml_method(MEMORY_SLOT_NOTIFY_METHOD, 2, AML_NOTSERIALIZED);
     for (i = 0; i < nr_mem; i++) {
         ifctx = aml_if(aml_equal(aml_arg(0), aml_int(i)));
+
+        if (enable_nvdimm) {
+            Aml *ifnvdimm;
+
+            ifnvdimm = aml_if(aml_equal(aml_name(BASEPATH MEMORY_SLOT_NVDIMM),
+                                        aml_int(1)));
+            aml_append(ifnvdimm, aml_notify(aml_name("\\_SB.NVDR"),
+                                            aml_int(0x80)));
+            aml_append(ifctx, ifnvdimm);
+        }
+
         aml_append(ifctx,
             aml_notify(aml_name("MP%.02X", i), aml_arg(1))
         );
@@ -2285,7 +2302,8 @@ build_dsdt(GArray *table_data, BIOSLinker *linker,
     sb_scope = aml_scope("\\_SB");
     {
         build_memory_devices(sb_scope, nr_mem, pm->mem_hp_io_base,
-                             pm->mem_hp_io_len);
+                             pm->mem_hp_io_len,
+                             pcms->acpi_nvdimm_state.is_enabled);
 
         {
             Object *pci_host;
diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
index 5bc81fe..af32508 100644
--- a/hw/mem/nvdimm.c
+++ b/hw/mem/nvdimm.c
@@ -155,13 +155,9 @@ static void nvdimm_prepare_unplug(DeviceState *dev)
 
 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/pc-hotplug.h b/include/hw/acpi/pc-hotplug.h
index 6a8d268..a14977d 100644
--- a/include/hw/acpi/pc-hotplug.h
+++ b/include/hw/acpi/pc-hotplug.h
@@ -43,6 +43,7 @@
 #define MEMORY_SLOT_INSERT_EVENT     "MINS"
 #define MEMORY_SLOT_REMOVE_EVENT     "MRMV"
 #define MEMORY_SLOT_EJECT            "MEJ"
+#define MEMORY_SLOT_NVDIMM           "NVDM"
 #define MEMORY_SLOT_SLECTOR          "MSEL"
 #define MEMORY_SLOT_OST_EVENT        "MOEV"
 #define MEMORY_SLOT_OST_STATUS       "MOSC"
-- 
1.8.3.1

  parent reply	other threads:[~2016-08-12  7:08 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-12  6:54 [PATCH v2 0/8] nvdimm: hotplug support Xiao Guangrong
2016-08-12  6:54 ` [Qemu-devel] " Xiao Guangrong
2016-08-12  6:54 ` [PATCH v2 1/8] acpi nvdimm: fix wrong buffer size returned by DSM method Xiao Guangrong
2016-08-12  6:54   ` [Qemu-devel] " Xiao Guangrong
2016-09-20 14:07   ` Igor Mammedov
2016-09-20 14:07     ` [Qemu-devel] " Igor Mammedov
2016-09-20 15:14     ` Michael S. Tsirkin
2016-09-20 15:14       ` [Qemu-devel] " Michael S. Tsirkin
2016-09-20 16:23       ` Igor Mammedov
2016-09-21  5:30     ` Xiao Guangrong
2016-09-21  5:30       ` [Qemu-devel] " Xiao Guangrong
2016-08-12  6:54 ` [PATCH v2 2/8] nvdimm acpi: prebuild nvdimm devices for available slots Xiao Guangrong
2016-08-12  6:54   ` [Qemu-devel] " Xiao Guangrong
2016-09-21 11:48   ` Igor Mammedov
2016-09-21 11:48     ` [Qemu-devel] " Igor Mammedov
2016-09-22  2:43     ` Xiao Guangrong
2016-09-22  2:43       ` [Qemu-devel] " Xiao Guangrong
2016-08-12  6:54 ` [PATCH v2 3/8] nvdimm acpi: introduce _FIT Xiao Guangrong
2016-08-12  6:54   ` [Qemu-devel] " Xiao Guangrong
2016-09-30 13:14   ` Igor Mammedov
2016-09-30 13:14     ` [Qemu-devel] " Igor Mammedov
2016-10-08  7:17     ` Xiao Guangrong
2016-10-08  7:17       ` [Qemu-devel] " Xiao Guangrong
2016-10-10 12:51       ` Igor Mammedov
2016-10-10 12:51         ` [Qemu-devel] " Igor Mammedov
2016-10-10 13:09         ` Xiao Guangrong
2016-10-10 13:09           ` [Qemu-devel] " Xiao Guangrong
2016-10-11 11:49           ` Igor Mammedov
2016-10-11 11:49             ` [Qemu-devel] " Igor Mammedov
2016-10-12  8:20             ` Xiao Guangrong
2016-10-12  8:20               ` [Qemu-devel] " Xiao Guangrong
2016-10-13 13:33               ` Igor Mammedov
2016-10-14  7:43                 ` Xiao Guangrong
2016-10-14 11:59                   ` Igor Mammedov
2016-08-12  6:54 ` [PATCH v2 4/8] nvdimm acpi: implement Read FIT function Xiao Guangrong
2016-08-12  6:54   ` [Qemu-devel] " Xiao Guangrong
2016-09-30 13:17   ` Igor Mammedov
2016-09-30 13:17     ` [Qemu-devel] " Igor Mammedov
2016-10-08  7:17     ` Xiao Guangrong
2016-10-08  7:17       ` [Qemu-devel] " Xiao Guangrong
2016-08-12  6:54 ` [PATCH v2 5/8] pc-dimm: introduce prepare_unplug() callback Xiao Guangrong
2016-08-12  6:54   ` [Qemu-devel] " Xiao Guangrong
2016-10-03  9:45   ` Igor Mammedov
2016-10-03  9:45     ` [Qemu-devel] " Igor Mammedov
2016-10-08  7:20     ` Xiao Guangrong
2016-10-08  7:20       ` [Qemu-devel] " Xiao Guangrong
2016-08-12  6:54 ` [PATCH v2 6/8] pc: memhp: do not export nvdimm's memory via _CRS Xiao Guangrong
2016-08-12  6:54   ` [Qemu-devel] " Xiao Guangrong
2016-10-03 13:21   ` Igor Mammedov
2016-10-03 13:21     ` [Qemu-devel] " Igor Mammedov
2016-10-08  7:42     ` Xiao Guangrong
2016-10-08  7:42       ` [Qemu-devel] " Xiao Guangrong
2016-10-10 12:47       ` Igor Mammedov
2016-10-10 12:47         ` [Qemu-devel] " Igor Mammedov
2016-10-10 13:10         ` Xiao Guangrong
2016-10-10 13:10           ` [Qemu-devel] " Xiao Guangrong
2016-08-12  6:54 ` Xiao Guangrong [this message]
2016-08-12  6:54   ` [Qemu-devel] [PATCH v2 7/8] pc: acpi: memhp: nvdimm hotplug support Xiao Guangrong
2016-08-12  6:54 ` [PATCH v2 8/8] nvdimm docs: add nvdimm Read FIT function Xiao Guangrong
2016-08-12  6:54   ` [Qemu-devel] " Xiao Guangrong
2016-09-30 14:03   ` Igor Mammedov
2016-09-30 14:03     ` [Qemu-devel] " Igor Mammedov
2016-10-08  7:18     ` Xiao Guangrong
2016-10-08  7:18       ` [Qemu-devel] " Xiao Guangrong
2016-08-12  8:35 ` [PATCH v2 0/8] nvdimm: hotplug support Stefan Hajnoczi
2016-08-12  8:35   ` [Qemu-devel] " Stefan Hajnoczi
2016-08-12 15:13   ` Igor Mammedov
2016-08-12 15:13     ` [Qemu-devel] " Igor Mammedov
2016-09-12  7:33     ` Xiao Guangrong
2016-09-12  7:33       ` [Qemu-devel] " Xiao Guangrong
2016-09-12 12:22       ` Igor Mammedov
2016-08-18 17:47 ` Dan Williams
2016-08-18 17:47   ` [Qemu-devel] " Dan Williams
2016-08-18 18:54   ` Vishal Verma
2016-08-18 18:54     ` [Qemu-devel] " Vishal Verma
2016-08-19  3:40     ` Xiao Guangrong
2016-08-19  3:40       ` [Qemu-devel] " Xiao Guangrong
2016-08-19  3:46       ` Xiao Guangrong
2016-08-19  3:46         ` [Qemu-devel] " Xiao Guangrong
2016-08-19  5:14         ` Dan Williams
2016-08-19  5:14           ` [Qemu-devel] " Dan Williams
2016-10-03 13:48 ` Igor Mammedov
2016-10-08  8:34   ` Xiao Guangrong
2016-10-10 12:59     ` Igor Mammedov
2016-10-10 13:57       ` Xiao Guangrong
2016-10-11 12:32         ` Igor Mammedov
2016-10-12 10:19           ` Xiao Guangrong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1470984850-66891-8-git-send-email-guangrong.xiao@linux.intel.com \
    --to=guangrong.xiao@linux.intel.com \
    --cc=dan.j.williams@intel.com \
    --cc=ehabkost@redhat.com \
    --cc=gleb@kernel.org \
    --cc=imammedo@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=mst@redhat.com \
    --cc=mtosatti@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.