@@ -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);
@@ -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);
@@ -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
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 <guangrong.xiao@linux.intel.com> --- 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(-)