diff mbox series

[v6,1/3] nvdimm: Add realize, unrealize callbacks to NVDIMMDevice class

Message ID 164375265999.118489.14958665170590335290.stgit@82dbe1ffb256
State New
Headers show
Series spapr: nvdimm: Introduce spapr-nvdimm device | expand

Commit Message

Shivaprasad G Bhat Feb. 1, 2022, 9:57 p.m. UTC
A new subclass inheriting NVDIMMDevice is going to be introduced in
subsequent patches. The new subclass uses the realize and unrealize
callbacks. Add them on NVDIMMClass to appropriately call them as part
of plug-unplug.

Signed-off-by: Shivaprasad G Bhat <sbhat@linux.ibm.com>
---
 hw/mem/nvdimm.c          |   16 ++++++++++++++++
 hw/mem/pc-dimm.c         |    5 +++++
 include/hw/mem/nvdimm.h  |    2 ++
 include/hw/mem/pc-dimm.h |    1 +
 4 files changed, 24 insertions(+)

Comments

Daniel Henrique Barboza Feb. 2, 2022, 5:13 p.m. UTC | #1
On 2/1/22 18:57, Shivaprasad G Bhat wrote:
> A new subclass inheriting NVDIMMDevice is going to be introduced in
> subsequent patches. The new subclass uses the realize and unrealize
> callbacks. Add them on NVDIMMClass to appropriately call them as part
> of plug-unplug.
> 
> Signed-off-by: Shivaprasad G Bhat <sbhat@linux.ibm.com>
> ---

Acked-by: Daniel Henrique Barboza <danielhb413@gmail.com>

>   hw/mem/nvdimm.c          |   16 ++++++++++++++++
>   hw/mem/pc-dimm.c         |    5 +++++
>   include/hw/mem/nvdimm.h  |    2 ++
>   include/hw/mem/pc-dimm.h |    1 +
>   4 files changed, 24 insertions(+)
> 
> diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
> index 7397b67156..59959d5563 100644
> --- a/hw/mem/nvdimm.c
> +++ b/hw/mem/nvdimm.c
> @@ -181,10 +181,25 @@ static MemoryRegion *nvdimm_md_get_memory_region(MemoryDeviceState *md,
>   static void nvdimm_realize(PCDIMMDevice *dimm, Error **errp)
>   {
>       NVDIMMDevice *nvdimm = NVDIMM(dimm);
> +    NVDIMMClass *ndc = NVDIMM_GET_CLASS(nvdimm);
>   
>       if (!nvdimm->nvdimm_mr) {
>           nvdimm_prepare_memory_region(nvdimm, errp);
>       }
> +
> +    if (ndc->realize) {
> +        ndc->realize(nvdimm, errp);
> +    }
> +}
> +
> +static void nvdimm_unrealize(PCDIMMDevice *dimm)
> +{
> +    NVDIMMDevice *nvdimm = NVDIMM(dimm);
> +    NVDIMMClass *ndc = NVDIMM_GET_CLASS(nvdimm);
> +
> +    if (ndc->unrealize) {
> +        ndc->unrealize(nvdimm);
> +    }
>   }
>   
>   /*
> @@ -240,6 +255,7 @@ static void nvdimm_class_init(ObjectClass *oc, void *data)
>       DeviceClass *dc = DEVICE_CLASS(oc);
>   
>       ddc->realize = nvdimm_realize;
> +    ddc->unrealize = nvdimm_unrealize;
>       mdc->get_memory_region = nvdimm_md_get_memory_region;
>       device_class_set_props(dc, nvdimm_properties);
>   
> diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
> index 48b913aba6..03bd0dd60e 100644
> --- a/hw/mem/pc-dimm.c
> +++ b/hw/mem/pc-dimm.c
> @@ -216,6 +216,11 @@ static void pc_dimm_realize(DeviceState *dev, Error **errp)
>   static void pc_dimm_unrealize(DeviceState *dev)
>   {
>       PCDIMMDevice *dimm = PC_DIMM(dev);
> +    PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
> +
> +    if (ddc->unrealize) {
> +        ddc->unrealize(dimm);
> +    }
>   
>       host_memory_backend_set_mapped(dimm->hostmem, false);
>   }
> diff --git a/include/hw/mem/nvdimm.h b/include/hw/mem/nvdimm.h
> index bcf62f825c..cf8f59be44 100644
> --- a/include/hw/mem/nvdimm.h
> +++ b/include/hw/mem/nvdimm.h
> @@ -103,6 +103,8 @@ struct NVDIMMClass {
>       /* write @size bytes from @buf to NVDIMM label data at @offset. */
>       void (*write_label_data)(NVDIMMDevice *nvdimm, const void *buf,
>                                uint64_t size, uint64_t offset);
> +    void (*realize)(NVDIMMDevice *nvdimm, Error **errp);
> +    void (*unrealize)(NVDIMMDevice *nvdimm);
>   };
>   
>   #define NVDIMM_DSM_MEM_FILE     "etc/acpi/nvdimm-mem"
> diff --git a/include/hw/mem/pc-dimm.h b/include/hw/mem/pc-dimm.h
> index 1473e6db62..322bebe555 100644
> --- a/include/hw/mem/pc-dimm.h
> +++ b/include/hw/mem/pc-dimm.h
> @@ -63,6 +63,7 @@ struct PCDIMMDeviceClass {
>   
>       /* public */
>       void (*realize)(PCDIMMDevice *dimm, Error **errp);
> +    void (*unrealize)(PCDIMMDevice *dimm);
>   };
>   
>   void pc_dimm_pre_plug(PCDIMMDevice *dimm, MachineState *machine,
> 
>
diff mbox series

Patch

diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
index 7397b67156..59959d5563 100644
--- a/hw/mem/nvdimm.c
+++ b/hw/mem/nvdimm.c
@@ -181,10 +181,25 @@  static MemoryRegion *nvdimm_md_get_memory_region(MemoryDeviceState *md,
 static void nvdimm_realize(PCDIMMDevice *dimm, Error **errp)
 {
     NVDIMMDevice *nvdimm = NVDIMM(dimm);
+    NVDIMMClass *ndc = NVDIMM_GET_CLASS(nvdimm);
 
     if (!nvdimm->nvdimm_mr) {
         nvdimm_prepare_memory_region(nvdimm, errp);
     }
+
+    if (ndc->realize) {
+        ndc->realize(nvdimm, errp);
+    }
+}
+
+static void nvdimm_unrealize(PCDIMMDevice *dimm)
+{
+    NVDIMMDevice *nvdimm = NVDIMM(dimm);
+    NVDIMMClass *ndc = NVDIMM_GET_CLASS(nvdimm);
+
+    if (ndc->unrealize) {
+        ndc->unrealize(nvdimm);
+    }
 }
 
 /*
@@ -240,6 +255,7 @@  static void nvdimm_class_init(ObjectClass *oc, void *data)
     DeviceClass *dc = DEVICE_CLASS(oc);
 
     ddc->realize = nvdimm_realize;
+    ddc->unrealize = nvdimm_unrealize;
     mdc->get_memory_region = nvdimm_md_get_memory_region;
     device_class_set_props(dc, nvdimm_properties);
 
diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
index 48b913aba6..03bd0dd60e 100644
--- a/hw/mem/pc-dimm.c
+++ b/hw/mem/pc-dimm.c
@@ -216,6 +216,11 @@  static void pc_dimm_realize(DeviceState *dev, Error **errp)
 static void pc_dimm_unrealize(DeviceState *dev)
 {
     PCDIMMDevice *dimm = PC_DIMM(dev);
+    PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(dimm);
+
+    if (ddc->unrealize) {
+        ddc->unrealize(dimm);
+    }
 
     host_memory_backend_set_mapped(dimm->hostmem, false);
 }
diff --git a/include/hw/mem/nvdimm.h b/include/hw/mem/nvdimm.h
index bcf62f825c..cf8f59be44 100644
--- a/include/hw/mem/nvdimm.h
+++ b/include/hw/mem/nvdimm.h
@@ -103,6 +103,8 @@  struct NVDIMMClass {
     /* write @size bytes from @buf to NVDIMM label data at @offset. */
     void (*write_label_data)(NVDIMMDevice *nvdimm, const void *buf,
                              uint64_t size, uint64_t offset);
+    void (*realize)(NVDIMMDevice *nvdimm, Error **errp);
+    void (*unrealize)(NVDIMMDevice *nvdimm);
 };
 
 #define NVDIMM_DSM_MEM_FILE     "etc/acpi/nvdimm-mem"
diff --git a/include/hw/mem/pc-dimm.h b/include/hw/mem/pc-dimm.h
index 1473e6db62..322bebe555 100644
--- a/include/hw/mem/pc-dimm.h
+++ b/include/hw/mem/pc-dimm.h
@@ -63,6 +63,7 @@  struct PCDIMMDeviceClass {
 
     /* public */
     void (*realize)(PCDIMMDevice *dimm, Error **errp);
+    void (*unrealize)(PCDIMMDevice *dimm);
 };
 
 void pc_dimm_pre_plug(PCDIMMDevice *dimm, MachineState *machine,