nvdimm: Add realize, unrealize callbacks to NVDIMMDevice class

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>
Message-Id: <164396253158.109112.1926755104259023743.stgit@ltczzess4.aus.stglabs.ibm.com>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
Shivaprasad G Bhat 2022-02-18 08:34:13 +01:00 committed by Cédric Le Goater
parent c13b8e9973
commit 3e35960bf1
4 changed files with 24 additions and 0 deletions

@ -181,10 +181,25 @@ static MemoryRegion *nvdimm_md_get_memory_region(MemoryDeviceState *md,
static void nvdimm_realize(PCDIMMDevice *dimm, Error **errp) static void nvdimm_realize(PCDIMMDevice *dimm, Error **errp)
{ {
NVDIMMDevice *nvdimm = NVDIMM(dimm); NVDIMMDevice *nvdimm = NVDIMM(dimm);
NVDIMMClass *ndc = NVDIMM_GET_CLASS(nvdimm);
if (!nvdimm->nvdimm_mr) { if (!nvdimm->nvdimm_mr) {
nvdimm_prepare_memory_region(nvdimm, errp); 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); DeviceClass *dc = DEVICE_CLASS(oc);
ddc->realize = nvdimm_realize; ddc->realize = nvdimm_realize;
ddc->unrealize = nvdimm_unrealize;
mdc->get_memory_region = nvdimm_md_get_memory_region; mdc->get_memory_region = nvdimm_md_get_memory_region;
device_class_set_props(dc, nvdimm_properties); device_class_set_props(dc, nvdimm_properties);

@ -216,6 +216,11 @@ static void pc_dimm_realize(DeviceState *dev, Error **errp)
static void pc_dimm_unrealize(DeviceState *dev) static void pc_dimm_unrealize(DeviceState *dev)
{ {
PCDIMMDevice *dimm = PC_DIMM(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); host_memory_backend_set_mapped(dimm->hostmem, false);
} }

@ -103,6 +103,8 @@ struct NVDIMMClass {
/* write @size bytes from @buf to NVDIMM label data at @offset. */ /* write @size bytes from @buf to NVDIMM label data at @offset. */
void (*write_label_data)(NVDIMMDevice *nvdimm, const void *buf, void (*write_label_data)(NVDIMMDevice *nvdimm, const void *buf,
uint64_t size, uint64_t offset); 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" #define NVDIMM_DSM_MEM_FILE "etc/acpi/nvdimm-mem"

@ -63,6 +63,7 @@ struct PCDIMMDeviceClass {
/* public */ /* public */
void (*realize)(PCDIMMDevice *dimm, Error **errp); void (*realize)(PCDIMMDevice *dimm, Error **errp);
void (*unrealize)(PCDIMMDevice *dimm);
}; };
void pc_dimm_pre_plug(PCDIMMDevice *dimm, MachineState *machine, void pc_dimm_pre_plug(PCDIMMDevice *dimm, MachineState *machine,