From: Eric Auger <eric.auger@redhat.com>
To: eric.auger.pro@gmail.com, eric.auger@redhat.com,
qemu-devel@nongnu.org, qemu-arm@nongnu.org,
peter.maydell@linaro.org, shameerali.kolothum.thodi@huawei.com,
imammedo@redhat.com, david@redhat.com
Cc: dgilbert@redhat.com, david@gibson.dropbear.id.au, drjones@redhat.com
Subject: [Qemu-devel] [PATCH v5 09/18] hw/arm/virt: Implement kvm_type function for 4.0 machine
Date: Wed, 23 Jan 2019 11:14:49 +0100 [thread overview]
Message-ID: <20190123101458.12478-10-eric.auger@redhat.com> (raw)
In-Reply-To: <20190123101458.12478-1-eric.auger@redhat.com>
This patch implements the machine class kvm_type() callback.
It returns the max IPA shift needed to implement the whole GPA
range including the RAM and IO regions located beyond.
The returned value in passed though the KVM_CREATE_VM ioctl and
this allows KVM to set the stage2 tables dynamically.
At this stage the RAM limit still is 255GB.
Setting all the existing highmem IO regions beyond the RAM
allows to have a single contiguous RAM region (initial RAM and
possible hotpluggable device memory). That way we do not need
to do invasive changes in the EDK2 FW to support a dynamic
RAM base.
Signed-off-by: Eric Auger <eric.auger@redhat.com>
---
hw/arm/virt.c | 30 ++++++++++++++++++++++++++++++
include/hw/arm/virt.h | 1 +
2 files changed, 31 insertions(+)
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index ea1fb3ddfd..a89ffbf4d7 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -1771,6 +1771,32 @@ static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine,
return NULL;
}
+/*
+ * for arm64 kvm_type [7-0] encodes the IPA size shift
+ */
+static int virt_kvm_type(MachineState *ms, const char *type_str)
+{
+ VirtMachineState *vms = VIRT_MACHINE(ms);
+ int max_vm_phys_shift = kvm_arm_get_max_vm_phys_shift(ms);
+ int max_pa_shift;
+
+ vms->extended_memmap = true;
+ /* device memory start/size aligned on 1GiB */
+ vms->high_io_base = ROUND_UP(GiB + ms->ram_size, GiB) +
+ ROUND_UP(ms->maxram_size - ms->ram_size, GiB);
+
+ max_pa_shift = 64 - clz64(vms->high_io_base + TiB);
+
+ if (max_pa_shift > max_vm_phys_shift) {
+ error_report("-m and ,maxmem option values "
+ "require an IPA range (%d bits) larger than "
+ "the one supported by the host (%d bits)",
+ max_pa_shift, max_vm_phys_shift);
+ exit(1);
+ }
+ return max_pa_shift;
+}
+
static void virt_machine_class_init(ObjectClass *oc, void *data)
{
MachineClass *mc = MACHINE_CLASS(oc);
@@ -1795,6 +1821,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
mc->cpu_index_to_instance_props = virt_cpu_index_to_props;
mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a15");
mc->get_default_cpu_node_id = virt_get_default_cpu_node_id;
+ mc->kvm_type = virt_kvm_type;
assert(!mc->get_hotplug_handler);
mc->get_hotplug_handler = virt_machine_get_hotplug_handler;
hc->plug = virt_machine_device_plug_cb;
@@ -1899,6 +1926,9 @@ static void virt_machine_3_1_options(MachineClass *mc)
{
virt_machine_4_0_options(mc);
compat_props_add(mc->compat_props, hw_compat_3_1, hw_compat_3_1_len);
+
+ /* extended memory map is enabled from 4.0 onwards */
+ mc->kvm_type = NULL;
}
DEFINE_VIRT_MACHINE(3, 1)
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
index 3dc7a6c5d5..86d4c93120 100644
--- a/include/hw/arm/virt.h
+++ b/include/hw/arm/virt.h
@@ -132,6 +132,7 @@ typedef struct {
uint32_t iommu_phandle;
int psci_conduit;
hwaddr high_io_base;
+ bool extended_memmap;
} VirtMachineState;
#define VIRT_ECAM_ID(high) (high ? VIRT_HIGH_PCIE_ECAM : VIRT_PCIE_ECAM)
--
2.20.1
next prev parent reply other threads:[~2019-01-23 10:16 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-23 10:14 [Qemu-devel] [PATCH v5 00/18] ARM virt: Initial RAM expansion and PCDIMM/NVDIMM support Eric Auger
2019-01-23 10:14 ` [Qemu-devel] [PATCH v5 01/18] update-linux-headers.sh: Copy new headers Eric Auger
2019-01-23 10:14 ` [Qemu-devel] [PATCH v5 02/18] linux-headers: Update to v5.0-rc2 Eric Auger
2019-01-23 10:14 ` [Qemu-devel] [PATCH v5 03/18] hw/arm/boot: introduce fdt_add_memory_node helper Eric Auger
2019-01-23 10:14 ` [Qemu-devel] [PATCH v5 04/18] hw/arm/virt: Split the memory map description Eric Auger
2019-01-23 10:14 ` [Qemu-devel] [PATCH v5 05/18] hw/arm/virt: Move memory map initialization into machvirt_init Eric Auger
2019-01-23 10:14 ` [Qemu-devel] [PATCH v5 06/18] hw/boards: Add a MachineState parameter to kvm_type callback Eric Auger
2019-01-23 10:14 ` [Qemu-devel] [PATCH v5 07/18] kvm: add kvm_arm_get_max_vm_phys_shift Eric Auger
2019-01-29 14:25 ` Jia He
2019-02-01 10:30 ` Auger Eric
2019-01-23 10:14 ` [Qemu-devel] [PATCH v5 08/18] vl: Set machine ram_size, maxram_size and ram_slots earlier Eric Auger
2019-01-23 10:14 ` Eric Auger [this message]
2019-01-23 10:14 ` [Qemu-devel] [PATCH v5 10/18] hw/arm/virt: Bump the 255GB initial RAM limit Eric Auger
2019-01-23 10:14 ` [Qemu-devel] [PATCH v5 11/18] hw/arm/virt: Add memory hotplug framework Eric Auger
2019-01-23 10:14 ` [Qemu-devel] [PATCH v5 12/18] hw/arm/boot: Expose the PC-DIMM nodes in the DT Eric Auger
2019-01-23 10:14 ` [Qemu-devel] [PATCH v5 13/18] hw/arm/virt-acpi-build: Add PC-DIMM in SRAT Eric Auger
2019-01-23 10:14 ` [Qemu-devel] [PATCH v5 14/18] hw/arm/virt: Allocate device_memory Eric Auger
2019-01-23 10:14 ` [Qemu-devel] [PATCH v5 15/18] nvdimm: use configurable ACPI IO base and size Eric Auger
2019-01-23 10:14 ` [Qemu-devel] [PATCH v5 16/18] hw/arm/virt: Add nvdimm hot-plug infrastructure Eric Auger
2019-01-23 10:14 ` [Qemu-devel] [PATCH v5 17/18] hw/arm/boot: Expose the pmem nodes in the DT Eric Auger
2019-01-23 10:14 ` [Qemu-devel] [PATCH v5 18/18] hw/arm/virt: Add nvdimm and nvdimm-persistence options Eric Auger
2019-02-01 11:44 ` [Qemu-devel] [PATCH v5 00/18] ARM virt: Initial RAM expansion and PCDIMM/NVDIMM support no-reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190123101458.12478-10-eric.auger@redhat.com \
--to=eric.auger@redhat.com \
--cc=david@gibson.dropbear.id.au \
--cc=david@redhat.com \
--cc=dgilbert@redhat.com \
--cc=drjones@redhat.com \
--cc=eric.auger.pro@gmail.com \
--cc=imammedo@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=shameerali.kolothum.thodi@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).