qemu-kvm/0008-Add-aarch64-machine-ty...

325 lines
12 KiB
Diff
Raw Normal View History

2020-08-12 15:53:34 +00:00
From 0ba70804c179d934e5be555abff3c4455ac137a0 Mon Sep 17 00:00:00 2001
2018-11-08 17:02:33 +00:00
From: Miroslav Rezanina <mrezanin@redhat.com>
2018-11-29 12:09:34 +00:00
Date: Fri, 19 Oct 2018 12:53:31 +0200
2018-11-08 17:02:33 +00:00
Subject: Add aarch64 machine types
Adding changes to add RHEL machine types for aarch64 architecture.
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
2020-05-13 01:03:43 +00:00
Rebase notes (4.0.0):
- Use upstream compat handling
2020-05-13 01:03:43 +00:00
Rebase notes (4.1.0-rc0):
- Removed a15memmap (upstream)
- Use virt_flash_create in rhel800_virt_instance_init
2020-05-13 01:03:43 +00:00
Rebase notes (4.2.0-rc0):
2019-11-15 14:35:04 +00:00
- Set numa_mem_supported
2019-12-09 20:39:05 +00:00
Rebase notes (4.2.0-rc3):
- aarch64: Add virt-rhel8.2.0 machine type for ARM (patch 92246)
- aarch64: virt: Allow more than 1TB of RAM (patch 92249)
- aarch64: virt: Allow PCDIMM instantiation (patch 92247)
- aarch64: virt: Enhance the comment related to gic-version (patch 92248)
2020-05-13 01:03:43 +00:00
Rebase notes (weekly-200226):
- Set default_ram_id in rhel_machine_class_init
Rebase notes (5.0.0-rc1):
- Added setting acpi properties
Rebase notes (weekly-200520):
- Added ras property
Rebase notes (weekly-200701):
- Added to virt_machine_device_unplug_cb to machine type (upstream)
2020-08-12 15:53:34 +00:00
Rebase notes (5.1.0-rc1):
- added mte property (upstream)
Merged patches (4.0.0):
- 7bfdb4c aarch64: Add virt-rhel8.0.0 machine type for ARM
- 3433e69 aarch64: Set virt-rhel8.0.0 max_cpus to 512
- 4d20863 aarch64: Use 256MB ECAM region by default
2019-11-15 14:35:04 +00:00
Merged patches (4.1.0):
- c3e39ef aarch64: Add virt-rhel8.1.0 machine type for ARM
- 59a46d1 aarch64: Allow ARM VIRT iommu option in RHEL8.1 machine
2020-07-15 20:28:51 +00:00
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
2018-11-08 17:02:33 +00:00
---
2020-08-12 15:53:34 +00:00
hw/arm/virt.c | 180 +++++++++++++++++++++++++++++++++++++++++-
2020-07-15 20:28:51 +00:00
include/hw/arm/virt.h | 11 +++
2020-08-12 15:53:34 +00:00
2 files changed, 188 insertions(+), 3 deletions(-)
2018-11-08 17:02:33 +00:00
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
2020-08-12 15:53:34 +00:00
index 43cf75333b..e1a17e7c87 100644
2018-11-08 17:02:33 +00:00
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -79,6 +79,7 @@
2020-05-13 01:03:43 +00:00
#include "hw/char/pl011.h"
#include "qemu/guest-random.h"
2018-11-08 17:02:33 +00:00
+#if 0 /* Disabled for Red Hat Enterprise Linux */
2018-11-08 17:02:33 +00:00
#define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \
static void virt_##major##_##minor##_class_init(ObjectClass *oc, \
void *data) \
@@ -105,7 +106,49 @@
2018-11-08 17:02:33 +00:00
DEFINE_VIRT_MACHINE_LATEST(major, minor, true)
#define DEFINE_VIRT_MACHINE(major, minor) \
DEFINE_VIRT_MACHINE_LATEST(major, minor, false)
-
+#endif /* disabled for RHEL */
+
+#define DEFINE_RHEL_MACHINE_LATEST(m, n, s, latest) \
+ static void rhel##m##n##s##_virt_class_init(ObjectClass *oc, \
+ void *data) \
+ { \
+ MachineClass *mc = MACHINE_CLASS(oc); \
+ rhel##m##n##s##_virt_options(mc); \
+ mc->desc = "RHEL " # m "." # n "." # s " ARM Virtual Machine"; \
+ if (latest) { \
+ mc->alias = "virt"; \
+ mc->is_default = 1; \
+ } \
+ } \
+ static const TypeInfo rhel##m##n##s##_machvirt_info = { \
+ .name = MACHINE_TYPE_NAME("virt-rhel" # m "." # n "." # s), \
+ .parent = TYPE_RHEL_MACHINE, \
+ .instance_init = rhel##m##n##s##_virt_instance_init, \
+ .class_init = rhel##m##n##s##_virt_class_init, \
+ }; \
+ static void rhel##m##n##s##_machvirt_init(void) \
+ { \
+ type_register_static(&rhel##m##n##s##_machvirt_info); \
+ } \
+ type_init(rhel##m##n##s##_machvirt_init);
+
+#define DEFINE_RHEL_MACHINE_AS_LATEST(major, minor, subminor) \
+ DEFINE_RHEL_MACHINE_LATEST(major, minor, subminor, true)
+#define DEFINE_RHEL_MACHINE(major, minor, subminor) \
+ DEFINE_RHEL_MACHINE_LATEST(major, minor, subminor, false)
+
+/* This variable is for changes to properties that are RHEL specific,
+ * different to the current upstream and to be applied to the latest
+ * machine type.
+ */
+GlobalProperty arm_rhel_compat[] = {
+ {
+ .driver = "virtio-net-pci",
+ .property = "romfile",
+ .value = "",
+ },
+};
+const size_t arm_rhel_compat_len = G_N_ELEMENTS(arm_rhel_compat);
2018-11-08 17:02:33 +00:00
/* Number of external interrupt lines to configure the GIC with */
#define NUM_IRQS 256
2020-08-12 15:53:34 +00:00
@@ -1979,6 +2022,7 @@ static void machvirt_init(MachineState *machine)
2018-11-08 17:02:33 +00:00
qemu_add_machine_init_done_notifier(&vms->machine_done);
}
+#if 0 /* Disabled for Red Hat Enterprise Linux */
2018-11-08 17:02:33 +00:00
static bool virt_get_secure(Object *obj, Error **errp)
{
VirtMachineState *vms = VIRT_MACHINE(obj);
2020-08-12 15:53:34 +00:00
@@ -2007,6 +2051,7 @@ static void virt_set_virt(Object *obj, bool value, Error **errp)
2018-11-08 17:02:33 +00:00
vms->virt = value;
}
+#endif /* disabled for RHEL */
static bool virt_get_highmem(Object *obj, Error **errp)
{
VirtMachineState *vms = VIRT_MACHINE(obj);
2020-08-12 15:53:34 +00:00
@@ -2073,7 +2118,7 @@ static void virt_set_ras(Object *obj, bool value, Error **errp)
vms->ras = value;
}
-
+#if 0 /* Disabled for Red Hat Enterprise Linux */
static bool virt_get_mte(Object *obj, Error **errp)
{
VirtMachineState *vms = VIRT_MACHINE(obj);
@@ -2087,7 +2132,7 @@ static void virt_set_mte(Object *obj, bool value, Error **errp)
vms->mte = value;
}
-
+#endif
static char *virt_get_gic_version(Object *obj, Error **errp)
{
VirtMachineState *vms = VIRT_MACHINE(obj);
@@ -2401,6 +2446,7 @@ static int virt_kvm_type(MachineState *ms, const char *type_str)
2019-12-09 20:39:05 +00:00
return requested_pa_size > 40 ? requested_pa_size : 0;
2018-11-08 17:02:33 +00:00
}
+#if 0 /* Disabled for Red Hat Enterprise Linux */
2019-12-09 20:39:05 +00:00
static void virt_machine_class_init(ObjectClass *oc, void *data)
2018-11-08 17:02:33 +00:00
{
2019-12-09 20:39:05 +00:00
MachineClass *mc = MACHINE_CLASS(oc);
2020-08-12 15:53:34 +00:00
@@ -2679,3 +2725,131 @@ static void virt_machine_2_6_options(MachineClass *mc)
2018-11-08 17:02:33 +00:00
vmc->no_pmu = true;
}
DEFINE_VIRT_MACHINE(2, 6)
+#endif /* disabled for RHEL */
+
+static void rhel_machine_class_init(ObjectClass *oc, void *data)
+{
+ MachineClass *mc = MACHINE_CLASS(oc);
2019-12-09 20:39:05 +00:00
+ HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
2018-11-08 17:02:33 +00:00
+
+ mc->family = "virt-rhel-Z";
+ mc->init = machvirt_init;
+ /* Start with max_cpus set to 512, which is the maximum supported by KVM.
+ * The value may be reduced later when we have more information about the
2018-11-08 17:02:33 +00:00
+ * configuration of the particular instance.
+ */
+ mc->max_cpus = 512;
2018-11-08 17:02:33 +00:00
+ mc->block_default_type = IF_VIRTIO;
+ mc->no_cdrom = 1;
+ mc->pci_allow_0_address = true;
+ /* We know we will never create a pre-ARMv7 CPU which needs 1K pages */
+ mc->minimum_page_bits = 12;
+ mc->possible_cpu_arch_ids = virt_possible_cpu_arch_ids;
+ mc->cpu_index_to_instance_props = virt_cpu_index_to_props;
+ mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a57");
+ mc->get_default_cpu_node_id = virt_get_default_cpu_node_id;
2019-12-09 20:39:05 +00:00
+ mc->kvm_type = virt_kvm_type;
+ assert(!mc->get_hotplug_handler);
+ mc->get_hotplug_handler = virt_machine_get_hotplug_handler;
+ hc->pre_plug = virt_machine_device_pre_plug_cb;
+ hc->plug = virt_machine_device_plug_cb;
+ hc->unplug_request = virt_machine_device_unplug_request_cb;
+ hc->unplug = virt_machine_device_unplug_cb;
2019-11-15 14:35:04 +00:00
+ mc->numa_mem_supported = true;
+ mc->nvdimm_supported = true;
2019-12-09 20:39:05 +00:00
+ mc->auto_enable_numa_with_memhp = true;
2020-05-13 01:03:43 +00:00
+ mc->default_ram_id = "mach-virt.ram";
+
+ object_class_property_add(oc, "acpi", "OnOffAuto",
+ virt_get_acpi, virt_set_acpi,
+ NULL, NULL);
2020-05-13 01:03:43 +00:00
+ object_class_property_set_description(oc, "acpi",
+ "Enable ACPI");
2018-11-08 17:02:33 +00:00
+}
+
+static const TypeInfo rhel_machine_info = {
+ .name = TYPE_RHEL_MACHINE,
+ .parent = TYPE_MACHINE,
+ .abstract = true,
+ .instance_size = sizeof(VirtMachineState),
+ .class_size = sizeof(VirtMachineClass),
+ .class_init = rhel_machine_class_init,
2019-12-09 20:39:05 +00:00
+ .interfaces = (InterfaceInfo[]) {
+ { TYPE_HOTPLUG_HANDLER },
+ { }
+ },
2018-11-08 17:02:33 +00:00
+};
+
+static void rhel_machine_init(void)
+{
+ type_register_static(&rhel_machine_info);
+}
+type_init(rhel_machine_init);
+
2019-12-09 20:39:05 +00:00
+static void rhel820_virt_instance_init(Object *obj)
2018-11-08 17:02:33 +00:00
+{
+ VirtMachineState *vms = VIRT_MACHINE(obj);
+ VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
+
+ /* EL3 is disabled by default and non-configurable for RHEL */
+ vms->secure = false;
+ /* EL2 is disabled by default and non-configurable for RHEL */
+ vms->virt = false;
+ /* High memory is enabled by default for RHEL */
+ vms->highmem = true;
+ object_property_add_bool(obj, "highmem", virt_get_highmem,
+ virt_set_highmem);
2018-11-08 17:02:33 +00:00
+ object_property_set_description(obj, "highmem",
+ "Set on/off to enable/disable using "
+ "physical address space above 32 bits");
2019-12-09 20:39:05 +00:00
+ /*
+ * Default GIC type is still v2, but became configurable for RHEL. We
+ * keep v2 instead of max as TCG CI test cases require an MSI controller
+ * and there is no userspace ITS MSI emulation available.
+ */
2018-11-08 17:02:33 +00:00
+ vms->gic_version = 2;
+ object_property_add_str(obj, "gic-version", virt_get_gic_version,
+ virt_set_gic_version);
2018-11-08 17:02:33 +00:00
+ object_property_set_description(obj, "gic-version",
+ "Set GIC version. "
+ "Valid values are 2, 3 and host");
2018-11-08 17:02:33 +00:00
+
+ vms->highmem_ecam = !vmc->no_highmem_ecam;
+
2018-11-08 17:02:33 +00:00
+ if (vmc->no_its) {
+ vms->its = false;
+ } else {
+ /* Default allows ITS instantiation */
+ vms->its = true;
+ object_property_add_bool(obj, "its", virt_get_its,
+ virt_set_its);
2018-11-08 17:02:33 +00:00
+ object_property_set_description(obj, "its",
+ "Set on/off to enable/disable "
+ "ITS instantiation");
2018-11-08 17:02:33 +00:00
+ }
+
+ /* Default disallows iommu instantiation */
+ vms->iommu = VIRT_IOMMU_NONE;
+ object_property_add_str(obj, "iommu", virt_get_iommu, virt_set_iommu);
+ object_property_set_description(obj, "iommu",
+ "Set the IOMMU type. "
+ "Valid values are none and smmuv3");
+ vms->ras = false;
+ object_property_add_bool(obj, "ras", virt_get_ras,
+ virt_set_ras);
+ object_property_set_description(obj, "ras",
+ "Set on/off to enable/disable reporting host memory errors "
+ "to a KVM guest using ACPI and guest external abort exceptions");
2020-08-12 15:53:34 +00:00
+
+ /* MTE is disabled by default. */
+ vms->mte = false;
+
2018-11-08 17:02:33 +00:00
+ vms->irqmap=a15irqmap;
+ virt_flash_create(vms);
2018-11-08 17:02:33 +00:00
+}
+
2019-12-09 20:39:05 +00:00
+static void rhel820_virt_options(MachineClass *mc)
2018-11-08 17:02:33 +00:00
+{
+ compat_props_add(mc->compat_props, arm_rhel_compat, arm_rhel_compat_len);
2018-11-08 17:02:33 +00:00
+}
2019-12-09 20:39:05 +00:00
+DEFINE_RHEL_MACHINE_AS_LATEST(8, 2, 0)
2018-11-08 17:02:33 +00:00
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
2020-08-12 15:53:34 +00:00
index dff67e1bef..7c1e085749 100644
2018-11-08 17:02:33 +00:00
--- a/include/hw/arm/virt.h
+++ b/include/hw/arm/virt.h
2020-08-12 15:53:34 +00:00
@@ -166,6 +166,7 @@ typedef struct {
2018-11-08 17:02:33 +00:00
#define VIRT_ECAM_ID(high) (high ? VIRT_HIGH_PCIE_ECAM : VIRT_PCIE_ECAM)
2018-11-08 17:02:33 +00:00
+#if 0 /* disabled for Red Hat Enterprise Linux */
#define TYPE_VIRT_MACHINE MACHINE_TYPE_NAME("virt")
#define VIRT_MACHINE(obj) \
OBJECT_CHECK(VirtMachineState, (obj), TYPE_VIRT_MACHINE)
2020-08-12 15:53:34 +00:00
@@ -174,6 +175,16 @@ typedef struct {
2018-11-08 17:02:33 +00:00
#define VIRT_MACHINE_CLASS(klass) \
OBJECT_CLASS_CHECK(VirtMachineClass, klass, TYPE_VIRT_MACHINE)
+#else
+#define TYPE_RHEL_MACHINE MACHINE_TYPE_NAME("virt-rhel")
+#define VIRT_MACHINE(obj) \
+ OBJECT_CHECK(VirtMachineState, (obj), TYPE_RHEL_MACHINE)
+#define VIRT_MACHINE_GET_CLASS(obj) \
+ OBJECT_GET_CLASS(VirtMachineClass, obj, TYPE_RHEL_MACHINE)
+#define VIRT_MACHINE_CLASS(klass) \
+ OBJECT_CLASS_CHECK(VirtMachineClass, klass, TYPE_RHEL_MACHINE)
+#endif
+
void virt_acpi_setup(VirtMachineState *vms);
2020-05-13 01:03:43 +00:00
bool virt_is_acpi_enabled(VirtMachineState *vms);
2018-11-08 17:02:33 +00:00
--
2020-07-15 20:28:51 +00:00
2.27.0
2018-11-08 17:02:33 +00:00