[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 07/16] nvdimm: reserve address range for NVDIMM
From: |
Xiao Guangrong |
Subject: |
[Qemu-devel] [PATCH 07/16] nvdimm: reserve address range for NVDIMM |
Date: |
Wed, 1 Jul 2015 22:50:23 +0800 |
NVDIMM reserves all the free range above 4G to do:
- Persistent Memory (PMEM) mapping
- implement NVDIMM ACPI device _DSM method
Signed-off-by: Xiao Guangrong <address@hidden>
---
hw/i386/pc.c | 11 +++++++++--
hw/mem/pc-nvdimm.c | 13 +++++++++++++
include/hw/mem/pc-nvdimm.h | 5 +++++
3 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 7072930..82e80a9 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -64,6 +64,7 @@
#include "hw/pci/pci_host.h"
#include "acpi-build.h"
#include "hw/mem/pc-dimm.h"
+#include "hw/mem/pc-nvdimm.h"
#include "trace.h"
#include "qapi/visitor.h"
#include "qapi-visit.h"
@@ -1241,6 +1242,7 @@ FWCfgState *pc_memory_init(MachineState *machine,
MemoryRegion *ram_below_4g, *ram_above_4g;
FWCfgState *fw_cfg;
PCMachineState *pcms = PC_MACHINE(machine);
+ ram_addr_t offset;
assert(machine->ram_size == below_4g_mem_size + above_4g_mem_size);
@@ -1278,6 +1280,8 @@ FWCfgState *pc_memory_init(MachineState *machine,
exit(EXIT_FAILURE);
}
+ offset = 0x100000000ULL + above_4g_mem_size;
+
/* initialize hotplug memory address space */
if (guest_info->has_reserved_memory &&
(machine->ram_size < machine->maxram_size)) {
@@ -1297,8 +1301,7 @@ FWCfgState *pc_memory_init(MachineState *machine,
exit(EXIT_FAILURE);
}
- pcms->hotplug_memory_base =
- ROUND_UP(0x100000000ULL + above_4g_mem_size, 1ULL << 30);
+ pcms->hotplug_memory_base = ROUND_UP(offset, 1ULL << 30);
if (pcms->enforce_aligned_dimm) {
/* size hotplug region assuming 1G page max alignment per slot */
@@ -1316,8 +1319,12 @@ FWCfgState *pc_memory_init(MachineState *machine,
"hotplug-memory", hotplug_mem_size);
memory_region_add_subregion(system_memory, pcms->hotplug_memory_base,
&pcms->hotplug_memory);
+ offset = pcms->hotplug_memory_base + hotplug_mem_size;
}
+ /* all the space left above 4G is reserved for NVDIMM. */
+ pc_nvdimm_reserve_range(offset);
+
/* Initialize PC system firmware */
pc_system_firmware_init(rom_memory, guest_info->isapc_ram_fw);
diff --git a/hw/mem/pc-nvdimm.c b/hw/mem/pc-nvdimm.c
index 0209ea9..b40d4e7 100644
--- a/hw/mem/pc-nvdimm.c
+++ b/hw/mem/pc-nvdimm.c
@@ -24,6 +24,19 @@
#include "hw/mem/pc-nvdimm.h"
+#define PAGE_SIZE (1UL << 12)
+
+static struct nvdimms_info {
+ ram_addr_t current_addr;
+} nvdimms_info;
+
+/* the address range [offset, ~0ULL) is reserved for NVDIMM. */
+void pc_nvdimm_reserve_range(ram_addr_t offset)
+{
+ offset = ROUND_UP(offset, PAGE_SIZE);
+ nvdimms_info.current_addr = offset;
+}
+
static char *get_file(Object *obj, Error **errp)
{
PCNVDIMMDevice *nvdimm = PC_NVDIMM(obj);
diff --git a/include/hw/mem/pc-nvdimm.h b/include/hw/mem/pc-nvdimm.h
index 7f37b46..2081e7c 100644
--- a/include/hw/mem/pc-nvdimm.h
+++ b/include/hw/mem/pc-nvdimm.h
@@ -27,6 +27,11 @@ typedef struct PCNVDIMMDevice {
#define PC_NVDIMM(obj) \
OBJECT_CHECK(PCNVDIMMDevice, (obj), TYPE_PC_NVDIMM)
+
+void pc_nvdimm_reserve_range(ram_addr_t offset);
#else /* !CONFIG_LINUX */
+static inline void pc_nvdimm_reserve_range(ram_addr_t offset)
+{
+}
#endif
#endif
--
2.1.0
- [Qemu-devel] [PATCH 00/16] implement vNVDIMM, Xiao Guangrong, 2015/07/01
- [Qemu-devel] [PATCH 02/16] i386/acpi-build: allow SSDT to operate on 64 bit, Xiao Guangrong, 2015/07/01
- [Qemu-devel] [PATCH 01/16] acpi: allow aml_operation_region() working on 64 bit offset, Xiao Guangrong, 2015/07/01
- [Qemu-devel] [PATCH 04/16] acpi: add aml_sizeof, Xiao Guangrong, 2015/07/01
- [Qemu-devel] [PATCH 03/16] acpi: add aml_derefof, Xiao Guangrong, 2015/07/01
- [Qemu-devel] [PATCH 05/16] acpi: add aml_create_field, Xiao Guangrong, 2015/07/01
- [Qemu-devel] [PATCH 06/16] pc: implement NVDIMM device abstract, Xiao Guangrong, 2015/07/01
- [Qemu-devel] [PATCH 07/16] nvdimm: reserve address range for NVDIMM,
Xiao Guangrong <=
- [Qemu-devel] [PATCH 08/16] nvdimm: init backend memory mapping and config data area, Xiao Guangrong, 2015/07/01
- [Qemu-devel] [PATCH 10/16] nvdimm: init the address region used by _DSM method, Xiao Guangrong, 2015/07/01
- [Qemu-devel] [PATCH 09/16] nvdimm: build ACPI NFIT table, Xiao Guangrong, 2015/07/01
- [Qemu-devel] [PATCH 11/16] nvdimm: build ACPI nvdimm devices, Xiao Guangrong, 2015/07/01
- [Qemu-devel] [PATCH 13/16] nvdimm: support NFIT_CMD_IMPLEMENTED function, Xiao Guangrong, 2015/07/01
- [Qemu-devel] [PATCH 12/16] nvdimm: save arg3 for NVDIMM device _DSM method, Xiao Guangrong, 2015/07/01
- [Qemu-devel] [PATCH 15/16] nvdimm: support NFIT_CMD_GET_CONFIG_DATA, Xiao Guangrong, 2015/07/01
- [Qemu-devel] [PATCH 14/16] nvdimm: support NFIT_CMD_GET_CONFIG_SIZE function, Xiao Guangrong, 2015/07/01