Re: [PATCH v7 27/35] nvdimm acpi: build ACPI nvdimm devices
On 11/04/2015 04:56 PM, Igor Mammedov wrote: On Tue, 3 Nov 2015 22:22:40 +0800 Xiao Guangrong wrote: On 11/03/2015 09:13 PM, Igor Mammedov wrote: On Mon, 2 Nov 2015 17:13:29 +0800 Xiao Guangrong wrote: NVDIMM devices is defined in ACPI 6.0 9.20 NVDIMM Devices There is a root device under \_SB and specified NVDIMM devices are under the root device. Each NVDIMM device has _ADR which returns its handle used to associate MEMDEV structure in NFIT We reserve handle 0 for root device. In this patch, we save handle, handle, arg1 and arg2 to dsm memory. Arg3 is conditionally saved in later patch Signed-off-by: Xiao Guangrong --- hw/acpi/nvdimm.c | 184 +++ 1 file changed, 184 insertions(+) diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c index dd84e5f..53ed675 100644 --- a/hw/acpi/nvdimm.c +++ b/hw/acpi/nvdimm.c @@ -368,6 +368,15 @@ static void nvdimm_build_nfit(GSList *device_list, GArray *table_offsets, g_array_free(structures, true); } +struct NvdimmDsmIn { +uint32_t handle; +uint32_t revision; +uint32_t function; + /* the remaining size in the page is used by arg3. */ +uint8_t arg3[0]; +} QEMU_PACKED; +typedef struct NvdimmDsmIn NvdimmDsmIn; + static uint64_t nvdimm_dsm_read(void *opaque, hwaddr addr, unsigned size) { @@ -377,6 +386,7 @@ nvdimm_dsm_read(void *opaque, hwaddr addr, unsigned size) static void nvdimm_dsm_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) { +fprintf(stderr, "BUG: we never write DSM notification IO Port.\n"); it doesn't seem like this hunk belongs here Er, we have changed the logic: - others: 1) the buffer length is directly got from IO read rather than got from dsm memory [ This has documented in v5's changelog. ] So, the IO write is replaced by IO read, nvdimm_dsm_write() should not be triggered. } static const MemoryRegionOps nvdimm_dsm_ops = { @@ -402,6 +412,179 @@ void nvdimm_init_acpi_state(MemoryRegion *memory, MemoryRegion *io, memory_region_add_subregion(io, NVDIMM_ACPI_IO_BASE, &state->io_mr); } +#define BUILD_STA_METHOD(_dev_, _method_) \ +do { \ +_method_ = aml_method("_STA", 0); \ +aml_append(_method_, aml_return(aml_int(0x0f))); \ +aml_append(_dev_, _method_); \ +} while (0) _STA doesn't have any logic here so drop macro and just replace its call sites with: Okay, I was just wanting to save some code lines. I will drop this macro. aml_append(foo_dev, aml_name_decl("_STA", aml_int(0xf)); _STA is required as a method with zero argument but this statement just define a object. It is okay? Spec doesn't say that it must be method, it says that it will evaluate _STA object and result must be a combination of defined flags. AML wise calling a method with 0 arguments and referencing named variable is the same thing, both end up being just a namestring. I just tested it, it works. Also note that _STA here return 0xF, and spec says that if _STA is missing OSPM shall assume its implicit value being 0xF, so you can just drop _STA object here altogether. Actually, it will be needed for NVDIMM hotplug, but it is okay to me to drop it at present. Let's introduce it when we implement hotplug. + +#define BUILD_DSM_METHOD(_dev_, _method_, _handle_, _uuid_)\ +do { \ +Aml *ifctx, *uuid; \ +_method_ = aml_method("_DSM", 4); \ +/* check UUID if it is we expect, return the errorcode if not.*/ \ +uuid = aml_touuid(_uuid_); \ +ifctx = aml_if(aml_lnot(aml_equal(aml_arg(0), uuid))); \ +aml_append(ifctx, aml_return(aml_int(1 /* Not Supported */))); \ +aml_append(method, ifctx); \ +aml_append(method, aml_return(aml_call4("NCAL", aml_int(_handle_), \ + aml_arg(1), aml_arg(2), aml_arg(3; \ +aml_append(_dev_, _method_); \ +} while (0) + +#define BUILD_FIELD_UNIT_SIZE(_field_, _byte_, _name_) \ +aml_append(_field_, aml_named_field(_name_, (_byte_) * BITS_PER_BYTE)) + +#define BUILD_FIELD_UNIT_STRUCT(_field_, _s_, _f_, _name_) \ +BUILD_FIELD_UNIT_SIZE(_field_, sizeof(typeof_field(_s_, _f_)), _name_) + +static void build_nvdimm_devices(GSList *device_list, Aml *root_dev) +{ +for (; device_list; device_list = device_list->next) { +NVDIMMDevice *nvdimm = device_list->data; +int slot = object_property_get_int(OBJECT(nv
Re: [PATCH v7 27/35] nvdimm acpi: build ACPI nvdimm devices
On Tue, 3 Nov 2015 22:22:40 +0800 Xiao Guangrong wrote: > > > On 11/03/2015 09:13 PM, Igor Mammedov wrote: > > On Mon, 2 Nov 2015 17:13:29 +0800 > > Xiao Guangrong wrote: > > > >> NVDIMM devices is defined in ACPI 6.0 9.20 NVDIMM Devices > >> > >> There is a root device under \_SB and specified NVDIMM devices are under > >> the > >> root device. Each NVDIMM device has _ADR which returns its handle used to > >> associate MEMDEV structure in NFIT > >> > >> We reserve handle 0 for root device. In this patch, we save handle, handle, > >> arg1 and arg2 to dsm memory. Arg3 is conditionally saved in later patch > >> > >> Signed-off-by: Xiao Guangrong > >> --- > >> hw/acpi/nvdimm.c | 184 > >> +++ > >> 1 file changed, 184 insertions(+) > >> > >> diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c > >> index dd84e5f..53ed675 100644 > >> --- a/hw/acpi/nvdimm.c > >> +++ b/hw/acpi/nvdimm.c > >> @@ -368,6 +368,15 @@ static void nvdimm_build_nfit(GSList *device_list, > >> GArray *table_offsets, > >> g_array_free(structures, true); > >> } > >> > >> +struct NvdimmDsmIn { > >> +uint32_t handle; > >> +uint32_t revision; > >> +uint32_t function; > >> + /* the remaining size in the page is used by arg3. */ > >> +uint8_t arg3[0]; > >> +} QEMU_PACKED; > >> +typedef struct NvdimmDsmIn NvdimmDsmIn; > >> + > >> static uint64_t > >> nvdimm_dsm_read(void *opaque, hwaddr addr, unsigned size) > >> { > >> @@ -377,6 +386,7 @@ nvdimm_dsm_read(void *opaque, hwaddr addr, unsigned > >> size) > >> static void > >> nvdimm_dsm_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) > >> { > >> +fprintf(stderr, "BUG: we never write DSM notification IO Port.\n"); > > it doesn't seem like this hunk belongs here > > Er, we have changed the logic: > - others: >1) the buffer length is directly got from IO read rather than got > from dsm memory > [ This has documented in v5's changelog. ] > > So, the IO write is replaced by IO read, nvdimm_dsm_write() should not be > triggered. > > > > >> } > >> > >> static const MemoryRegionOps nvdimm_dsm_ops = { > >> @@ -402,6 +412,179 @@ void nvdimm_init_acpi_state(MemoryRegion *memory, > >> MemoryRegion *io, > >> memory_region_add_subregion(io, NVDIMM_ACPI_IO_BASE, &state->io_mr); > >> } > >> > >> +#define BUILD_STA_METHOD(_dev_, _method_) > >> \ > >> +do { > >> \ > >> +_method_ = aml_method("_STA", 0); > >> \ > >> +aml_append(_method_, aml_return(aml_int(0x0f))); > >> \ > >> +aml_append(_dev_, _method_); > >> \ > >> +} while (0) > > _STA doesn't have any logic here so drop macro and just > > replace its call sites with: > > Okay, I was just wanting to save some code lines. I will drop this macro. > > > > > aml_append(foo_dev, aml_name_decl("_STA", aml_int(0xf)); > > _STA is required as a method with zero argument but this statement just > define a object. It is okay? Spec doesn't say that it must be method, it says that it will evaluate _STA object and result must be a combination of defined flags. AML wise calling a method with 0 arguments and referencing named variable is the same thing, both end up being just a namestring. Also note that _STA here return 0xF, and spec says that if _STA is missing OSPM shall assume its implicit value being 0xF, so you can just drop _STA object here altogether. > > > > > > >> + > >> +#define BUILD_DSM_METHOD(_dev_, _method_, _handle_, _uuid_) > >> \ > >> +do { > >> \ > >> +Aml *ifctx, *uuid; > >> \ > >> +_method_ = aml_method("_DSM", 4); > >> \ > >> +/* check UUID if it is we expect, return the errorcode if not.*/ > >> \ > >> +uuid = aml_touuid(_uuid_); > >> \ > >> +ifctx = aml_if(aml_lnot(aml_equal(aml_arg(0), uuid))); > >> \ > >> +aml_append(ifctx, aml_return(aml_int(1 /* Not Supported */))); > >> \ > >> +aml_append(method, ifctx); > >> \ > >> +aml_append(method, aml_return(aml_call4("NCAL", > >> aml_int(_handle_), \ > >> + aml_arg(1), aml_arg(2), aml_arg(3; > >> \ > >> +aml_append(_dev_, _method_); > >> \ > >> +} while (0) > >> + > >> +#define BUILD_FIELD_UNIT_SIZE(_field_, _byte_, _name_) > >> \ > >> +aml_append(_field_, aml_named_field(_name_, (_byte_) * BITS_PER_BYTE)) > >> + > >> +#define BUILD_FIELD_UNIT_STRUCT(_field_, _s_, _f_, _name_) > >> \ >
Re: [PATCH v7 27/35] nvdimm acpi: build ACPI nvdimm devices
On 11/03/2015 09:13 PM, Igor Mammedov wrote: On Mon, 2 Nov 2015 17:13:29 +0800 Xiao Guangrong wrote: NVDIMM devices is defined in ACPI 6.0 9.20 NVDIMM Devices There is a root device under \_SB and specified NVDIMM devices are under the root device. Each NVDIMM device has _ADR which returns its handle used to associate MEMDEV structure in NFIT We reserve handle 0 for root device. In this patch, we save handle, handle, arg1 and arg2 to dsm memory. Arg3 is conditionally saved in later patch Signed-off-by: Xiao Guangrong --- hw/acpi/nvdimm.c | 184 +++ 1 file changed, 184 insertions(+) diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c index dd84e5f..53ed675 100644 --- a/hw/acpi/nvdimm.c +++ b/hw/acpi/nvdimm.c @@ -368,6 +368,15 @@ static void nvdimm_build_nfit(GSList *device_list, GArray *table_offsets, g_array_free(structures, true); } +struct NvdimmDsmIn { +uint32_t handle; +uint32_t revision; +uint32_t function; + /* the remaining size in the page is used by arg3. */ +uint8_t arg3[0]; +} QEMU_PACKED; +typedef struct NvdimmDsmIn NvdimmDsmIn; + static uint64_t nvdimm_dsm_read(void *opaque, hwaddr addr, unsigned size) { @@ -377,6 +386,7 @@ nvdimm_dsm_read(void *opaque, hwaddr addr, unsigned size) static void nvdimm_dsm_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) { +fprintf(stderr, "BUG: we never write DSM notification IO Port.\n"); it doesn't seem like this hunk belongs here Er, we have changed the logic: - others: 1) the buffer length is directly got from IO read rather than got from dsm memory [ This has documented in v5's changelog. ] So, the IO write is replaced by IO read, nvdimm_dsm_write() should not be triggered. } static const MemoryRegionOps nvdimm_dsm_ops = { @@ -402,6 +412,179 @@ void nvdimm_init_acpi_state(MemoryRegion *memory, MemoryRegion *io, memory_region_add_subregion(io, NVDIMM_ACPI_IO_BASE, &state->io_mr); } +#define BUILD_STA_METHOD(_dev_, _method_) \ +do { \ +_method_ = aml_method("_STA", 0); \ +aml_append(_method_, aml_return(aml_int(0x0f))); \ +aml_append(_dev_, _method_); \ +} while (0) _STA doesn't have any logic here so drop macro and just replace its call sites with: Okay, I was just wanting to save some code lines. I will drop this macro. aml_append(foo_dev, aml_name_decl("_STA", aml_int(0xf)); _STA is required as a method with zero argument but this statement just define a object. It is okay? + +#define BUILD_DSM_METHOD(_dev_, _method_, _handle_, _uuid_)\ +do { \ +Aml *ifctx, *uuid; \ +_method_ = aml_method("_DSM", 4); \ +/* check UUID if it is we expect, return the errorcode if not.*/ \ +uuid = aml_touuid(_uuid_); \ +ifctx = aml_if(aml_lnot(aml_equal(aml_arg(0), uuid))); \ +aml_append(ifctx, aml_return(aml_int(1 /* Not Supported */))); \ +aml_append(method, ifctx); \ +aml_append(method, aml_return(aml_call4("NCAL", aml_int(_handle_), \ + aml_arg(1), aml_arg(2), aml_arg(3; \ +aml_append(_dev_, _method_); \ +} while (0) + +#define BUILD_FIELD_UNIT_SIZE(_field_, _byte_, _name_) \ +aml_append(_field_, aml_named_field(_name_, (_byte_) * BITS_PER_BYTE)) + +#define BUILD_FIELD_UNIT_STRUCT(_field_, _s_, _f_, _name_) \ +BUILD_FIELD_UNIT_SIZE(_field_, sizeof(typeof_field(_s_, _f_)), _name_) + +static void build_nvdimm_devices(GSList *device_list, Aml *root_dev) +{ +for (; device_list; device_list = device_list->next) { +NVDIMMDevice *nvdimm = device_list->data; +int slot = object_property_get_int(OBJECT(nvdimm), DIMM_SLOT_PROP, + NULL); +uint32_t handle = nvdimm_slot_to_handle(slot); +Aml *dev, *method; + +dev = aml_device("NV%02X", slot); +aml_append(dev, aml_name_decl("_ADR", aml_int(handle))); + +BUILD_STA_METHOD(dev, method); + +/* + * Chapter 4: _DSM Interface for NVDIMM Device (non-root) - Example + * in DSM Spec Rev1. + */ +BUILD_DSM_METHOD(dev, method, + handle /* NVDIMM Device Handle */, + "4309AC30-0D11-11E4-9191-0800200C9A66" + /* UUID for NVDIMM Devices. */); this will add N-bytes * #NVDIMMS in worst case. Please drop macro and ju
Re: [PATCH v7 27/35] nvdimm acpi: build ACPI nvdimm devices
On Mon, 2 Nov 2015 17:13:29 +0800 Xiao Guangrong wrote: > NVDIMM devices is defined in ACPI 6.0 9.20 NVDIMM Devices > > There is a root device under \_SB and specified NVDIMM devices are under the > root device. Each NVDIMM device has _ADR which returns its handle used to > associate MEMDEV structure in NFIT > > We reserve handle 0 for root device. In this patch, we save handle, handle, > arg1 and arg2 to dsm memory. Arg3 is conditionally saved in later patch > > Signed-off-by: Xiao Guangrong > --- > hw/acpi/nvdimm.c | 184 > +++ > 1 file changed, 184 insertions(+) > > diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c > index dd84e5f..53ed675 100644 > --- a/hw/acpi/nvdimm.c > +++ b/hw/acpi/nvdimm.c > @@ -368,6 +368,15 @@ static void nvdimm_build_nfit(GSList *device_list, > GArray *table_offsets, > g_array_free(structures, true); > } > > +struct NvdimmDsmIn { > +uint32_t handle; > +uint32_t revision; > +uint32_t function; > + /* the remaining size in the page is used by arg3. */ > +uint8_t arg3[0]; > +} QEMU_PACKED; > +typedef struct NvdimmDsmIn NvdimmDsmIn; > + > static uint64_t > nvdimm_dsm_read(void *opaque, hwaddr addr, unsigned size) > { > @@ -377,6 +386,7 @@ nvdimm_dsm_read(void *opaque, hwaddr addr, unsigned size) > static void > nvdimm_dsm_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) > { > +fprintf(stderr, "BUG: we never write DSM notification IO Port.\n"); it doesn't seem like this hunk belongs here > } > > static const MemoryRegionOps nvdimm_dsm_ops = { > @@ -402,6 +412,179 @@ void nvdimm_init_acpi_state(MemoryRegion *memory, > MemoryRegion *io, > memory_region_add_subregion(io, NVDIMM_ACPI_IO_BASE, &state->io_mr); > } > > +#define BUILD_STA_METHOD(_dev_, _method_) \ > +do { \ > +_method_ = aml_method("_STA", 0); \ > +aml_append(_method_, aml_return(aml_int(0x0f))); \ > +aml_append(_dev_, _method_); \ > +} while (0) _STA doesn't have any logic here so drop macro and just replace its call sites with: aml_append(foo_dev, aml_name_decl("_STA", aml_int(0xf)); > + > +#define BUILD_DSM_METHOD(_dev_, _method_, _handle_, _uuid_)\ > +do { \ > +Aml *ifctx, *uuid; \ > +_method_ = aml_method("_DSM", 4); \ > +/* check UUID if it is we expect, return the errorcode if not.*/ \ > +uuid = aml_touuid(_uuid_); \ > +ifctx = aml_if(aml_lnot(aml_equal(aml_arg(0), uuid))); \ > +aml_append(ifctx, aml_return(aml_int(1 /* Not Supported */))); \ > +aml_append(method, ifctx); \ > +aml_append(method, aml_return(aml_call4("NCAL", aml_int(_handle_), \ > + aml_arg(1), aml_arg(2), aml_arg(3; \ > +aml_append(_dev_, _method_); \ > +} while (0) > + > +#define BUILD_FIELD_UNIT_SIZE(_field_, _byte_, _name_) \ > +aml_append(_field_, aml_named_field(_name_, (_byte_) * BITS_PER_BYTE)) > + > +#define BUILD_FIELD_UNIT_STRUCT(_field_, _s_, _f_, _name_) \ > +BUILD_FIELD_UNIT_SIZE(_field_, sizeof(typeof_field(_s_, _f_)), _name_) > + > +static void build_nvdimm_devices(GSList *device_list, Aml *root_dev) > +{ > +for (; device_list; device_list = device_list->next) { > +NVDIMMDevice *nvdimm = device_list->data; > +int slot = object_property_get_int(OBJECT(nvdimm), DIMM_SLOT_PROP, > + NULL); > +uint32_t handle = nvdimm_slot_to_handle(slot); > +Aml *dev, *method; > + > +dev = aml_device("NV%02X", slot); > +aml_append(dev, aml_name_decl("_ADR", aml_int(handle))); > + > +BUILD_STA_METHOD(dev, method); > + > +/* > + * Chapter 4: _DSM Interface for NVDIMM Device (non-root) - Example > + * in DSM Spec Rev1. > + */ > +BUILD_DSM_METHOD(dev, method, > + handle /* NVDIMM Device Handle */, > + "4309AC30-0D11-11E4-9191-0800200C9A66" > + /* UUID for NVDIMM Devices. */); this will add N-bytes * #NVDIMMS in worst case. Please drop macro and just consolidate this method into _DSM method of parent scope and then call it from here like this: Method(_DSM, 4) Return(^_DSM(Arg[0-3])) > + > +aml_append(root_dev, dev); > +} > +} > + > +static void nvdimm_build_acpi_devices(GSList *device_list, Aml *sb_scope) > +{ > +Aml *dev, *metho
[PATCH v7 27/35] nvdimm acpi: build ACPI nvdimm devices
NVDIMM devices is defined in ACPI 6.0 9.20 NVDIMM Devices There is a root device under \_SB and specified NVDIMM devices are under the root device. Each NVDIMM device has _ADR which returns its handle used to associate MEMDEV structure in NFIT We reserve handle 0 for root device. In this patch, we save handle, handle, arg1 and arg2 to dsm memory. Arg3 is conditionally saved in later patch Signed-off-by: Xiao Guangrong --- hw/acpi/nvdimm.c | 184 +++ 1 file changed, 184 insertions(+) diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c index dd84e5f..53ed675 100644 --- a/hw/acpi/nvdimm.c +++ b/hw/acpi/nvdimm.c @@ -368,6 +368,15 @@ static void nvdimm_build_nfit(GSList *device_list, GArray *table_offsets, g_array_free(structures, true); } +struct NvdimmDsmIn { +uint32_t handle; +uint32_t revision; +uint32_t function; + /* the remaining size in the page is used by arg3. */ +uint8_t arg3[0]; +} QEMU_PACKED; +typedef struct NvdimmDsmIn NvdimmDsmIn; + static uint64_t nvdimm_dsm_read(void *opaque, hwaddr addr, unsigned size) { @@ -377,6 +386,7 @@ nvdimm_dsm_read(void *opaque, hwaddr addr, unsigned size) static void nvdimm_dsm_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) { +fprintf(stderr, "BUG: we never write DSM notification IO Port.\n"); } static const MemoryRegionOps nvdimm_dsm_ops = { @@ -402,6 +412,179 @@ void nvdimm_init_acpi_state(MemoryRegion *memory, MemoryRegion *io, memory_region_add_subregion(io, NVDIMM_ACPI_IO_BASE, &state->io_mr); } +#define BUILD_STA_METHOD(_dev_, _method_) \ +do { \ +_method_ = aml_method("_STA", 0); \ +aml_append(_method_, aml_return(aml_int(0x0f))); \ +aml_append(_dev_, _method_); \ +} while (0) + +#define BUILD_DSM_METHOD(_dev_, _method_, _handle_, _uuid_)\ +do { \ +Aml *ifctx, *uuid; \ +_method_ = aml_method("_DSM", 4); \ +/* check UUID if it is we expect, return the errorcode if not.*/ \ +uuid = aml_touuid(_uuid_); \ +ifctx = aml_if(aml_lnot(aml_equal(aml_arg(0), uuid))); \ +aml_append(ifctx, aml_return(aml_int(1 /* Not Supported */))); \ +aml_append(method, ifctx); \ +aml_append(method, aml_return(aml_call4("NCAL", aml_int(_handle_), \ + aml_arg(1), aml_arg(2), aml_arg(3; \ +aml_append(_dev_, _method_); \ +} while (0) + +#define BUILD_FIELD_UNIT_SIZE(_field_, _byte_, _name_) \ +aml_append(_field_, aml_named_field(_name_, (_byte_) * BITS_PER_BYTE)) + +#define BUILD_FIELD_UNIT_STRUCT(_field_, _s_, _f_, _name_) \ +BUILD_FIELD_UNIT_SIZE(_field_, sizeof(typeof_field(_s_, _f_)), _name_) + +static void build_nvdimm_devices(GSList *device_list, Aml *root_dev) +{ +for (; device_list; device_list = device_list->next) { +NVDIMMDevice *nvdimm = device_list->data; +int slot = object_property_get_int(OBJECT(nvdimm), DIMM_SLOT_PROP, + NULL); +uint32_t handle = nvdimm_slot_to_handle(slot); +Aml *dev, *method; + +dev = aml_device("NV%02X", slot); +aml_append(dev, aml_name_decl("_ADR", aml_int(handle))); + +BUILD_STA_METHOD(dev, method); + +/* + * Chapter 4: _DSM Interface for NVDIMM Device (non-root) - Example + * in DSM Spec Rev1. + */ +BUILD_DSM_METHOD(dev, method, + handle /* NVDIMM Device Handle */, + "4309AC30-0D11-11E4-9191-0800200C9A66" + /* UUID for NVDIMM Devices. */); + +aml_append(root_dev, dev); +} +} + +static void nvdimm_build_acpi_devices(GSList *device_list, Aml *sb_scope) +{ +Aml *dev, *method, *field; +uint64_t page_size = TARGET_PAGE_SIZE; + +dev = aml_device("NVDR"); +aml_append(dev, aml_name_decl("_HID", aml_string("ACPI0012"))); + +/* map DSM memory and IO into ACPI namespace. */ +aml_append(dev, aml_operation_region("NPIO", AML_SYSTEM_IO, + NVDIMM_ACPI_IO_BASE, NVDIMM_ACPI_IO_LEN)); +aml_append(dev, aml_operation_region("NRAM", AML_SYSTEM_MEMORY, + NVDIMM_ACPI_MEM_BASE, page_size)); + +/* + * DSM notifier: + * @NOTI: Read it will notify QEMU that _DSM method is being + *called and the parameters can be found in NvdimmDsmIn. + *The value read from it is the buffer size of