From patchwork Wed Jul 1 14:50:23 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xiao Guangrong X-Patchwork-Id: 6703981 Return-Path: X-Original-To: patchwork-kvm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 5CE169F380 for ; Wed, 1 Jul 2015 14:55:46 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 622F120657 for ; Wed, 1 Jul 2015 14:55:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7F13620651 for ; Wed, 1 Jul 2015 14:55:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754064AbbGAOzl (ORCPT ); Wed, 1 Jul 2015 10:55:41 -0400 Received: from mga03.intel.com ([134.134.136.65]:20064 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754339AbbGAOzf (ORCPT ); Wed, 1 Jul 2015 10:55:35 -0400 Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by orsmga103.jf.intel.com with ESMTP; 01 Jul 2015 07:55:35 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.15,386,1432623600"; d="scan'208";a="517239301" Received: from xiao.sh.intel.com ([10.239.159.86]) by FMSMGA003.fm.intel.com with ESMTP; 01 Jul 2015 07:55:33 -0700 From: Xiao Guangrong To: pbonzini@redhat.com, imammedo@redhat.com Cc: gleb@kernel.org, mtosatti@redhat.com, stefanha@redhat.com, mst@redhat.com, rth@twiddle.net, ehabkost@redhat.com, kvm@vger.kernel.org, qemu-devel@nongnu.org, Xiao Guangrong Subject: [PATCH 07/16] nvdimm: reserve address range for NVDIMM Date: Wed, 1 Jul 2015 22:50:23 +0800 Message-Id: <1435762232-15543-8-git-send-email-guangrong.xiao@linux.intel.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1435762232-15543-1-git-send-email-guangrong.xiao@linux.intel.com> References: <1435762232-15543-1-git-send-email-guangrong.xiao@linux.intel.com> Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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 --- 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