b190fee134
Since qemu-kvm tree is syncronized with 4.1.0 now, it's easier to handle this as 4.1.0 and not as rc4 - Resolves: bz#1740692
251 lines
9.8 KiB
Diff
251 lines
9.8 KiB
Diff
From cddb8f9ba14dba3bc5d37241924e84340a2b1f6a Mon Sep 17 00:00:00 2001
|
|
From: Miroslav Rezanina <mrezanin@redhat.com>
|
|
Date: Fri, 19 Oct 2018 12:53:31 +0200
|
|
Subject: Add aarch64 machine types
|
|
|
|
Adding changes to add RHEL machine types for aarch64 architecture.
|
|
|
|
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
|
Rebase changes (4.0.0):
|
|
- Use upstream compat handling
|
|
|
|
Rebase changes (4.1.0-rc0):
|
|
- Removed a15memmap (upstream)
|
|
- Use virt_flash_create in rhel800_virt_instance_init
|
|
|
|
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
|
|
|
|
Merged patches (4.1.0-rc0):
|
|
- c3e39ef aarch64: Add virt-rhel8.1.0 machine type for ARM
|
|
- 59a46d1 aarch64: Allow ARM VIRT iommu option in RHEL8.1 machine
|
|
|
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
|
---
|
|
hw/arm/virt.c | 144 +++++++++++++++++++++++++++++++++++++++++-
|
|
include/hw/arm/virt.h | 11 ++++
|
|
2 files changed, 154 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
|
index d9496c9363..51fb5f82b4 100644
|
|
--- a/hw/arm/virt.c
|
|
+++ b/hw/arm/virt.c
|
|
@@ -65,6 +65,7 @@
|
|
#include "hw/acpi/acpi.h"
|
|
#include "target/arm/internals.h"
|
|
|
|
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
|
#define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \
|
|
static void virt_##major##_##minor##_class_init(ObjectClass *oc, \
|
|
void *data) \
|
|
@@ -91,7 +92,49 @@
|
|
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);
|
|
|
|
/* Number of external interrupt lines to configure the GIC with */
|
|
#define NUM_IRQS 256
|
|
@@ -1722,6 +1765,7 @@ static void machvirt_init(MachineState *machine)
|
|
qemu_add_machine_init_done_notifier(&vms->machine_done);
|
|
}
|
|
|
|
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
|
static bool virt_get_secure(Object *obj, Error **errp)
|
|
{
|
|
VirtMachineState *vms = VIRT_MACHINE(obj);
|
|
@@ -1750,6 +1794,7 @@ static void virt_set_virt(Object *obj, bool value, Error **errp)
|
|
vms->virt = value;
|
|
}
|
|
|
|
+#endif /* disabled for RHEL */
|
|
static bool virt_get_highmem(Object *obj, Error **errp)
|
|
{
|
|
VirtMachineState *vms = VIRT_MACHINE(obj);
|
|
@@ -1871,6 +1916,7 @@ static const CPUArchIdList *virt_possible_cpu_arch_ids(MachineState *ms)
|
|
return ms->possible_cpus;
|
|
}
|
|
|
|
+#if 0 /* Disabled for Red Hat Enterprise Linux */
|
|
static void virt_machine_device_plug_cb(HotplugHandler *hotplug_dev,
|
|
DeviceState *dev, Error **errp)
|
|
{
|
|
@@ -2146,3 +2192,99 @@ static void virt_machine_2_6_options(MachineClass *mc)
|
|
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);
|
|
+
|
|
+ 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
|
|
+ * configuration of the particular instance.
|
|
+ */
|
|
+ mc->max_cpus = 512;
|
|
+ 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;
|
|
+}
|
|
+
|
|
+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,
|
|
+};
|
|
+
|
|
+static void rhel_machine_init(void)
|
|
+{
|
|
+ type_register_static(&rhel_machine_info);
|
|
+}
|
|
+type_init(rhel_machine_init);
|
|
+
|
|
+static void rhel810_virt_instance_init(Object *obj)
|
|
+{
|
|
+ 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, NULL);
|
|
+ object_property_set_description(obj, "highmem",
|
|
+ "Set on/off to enable/disable using "
|
|
+ "physical address space above 32 bits",
|
|
+ NULL);
|
|
+ /* Default GIC type is still v2, but became configurable for RHEL */
|
|
+ vms->gic_version = 2;
|
|
+ object_property_add_str(obj, "gic-version", virt_get_gic_version,
|
|
+ virt_set_gic_version, NULL);
|
|
+ object_property_set_description(obj, "gic-version",
|
|
+ "Set GIC version. "
|
|
+ "Valid values are 2, 3 and host", NULL);
|
|
+
|
|
+ vms->highmem_ecam = !vmc->no_highmem_ecam;
|
|
+
|
|
+ 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, NULL);
|
|
+ object_property_set_description(obj, "its",
|
|
+ "Set on/off to enable/disable "
|
|
+ "ITS instantiation",
|
|
+ NULL);
|
|
+ }
|
|
+
|
|
+ /* Default disallows iommu instantiation */
|
|
+ vms->iommu = VIRT_IOMMU_NONE;
|
|
+ object_property_add_str(obj, "iommu", virt_get_iommu, virt_set_iommu, NULL);
|
|
+ object_property_set_description(obj, "iommu",
|
|
+ "Set the IOMMU type. "
|
|
+ "Valid values are none and smmuv3",
|
|
+ NULL);
|
|
+
|
|
+ vms->irqmap=a15irqmap;
|
|
+ virt_flash_create(vms);
|
|
+}
|
|
+
|
|
+static void rhel810_virt_options(MachineClass *mc)
|
|
+{
|
|
+ compat_props_add(mc->compat_props, arm_rhel_compat, arm_rhel_compat_len);
|
|
+}
|
|
+DEFINE_RHEL_MACHINE_AS_LATEST(8, 1, 0)
|
|
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
|
|
index a72094204e..1baa48d46e 100644
|
|
--- a/include/hw/arm/virt.h
|
|
+++ b/include/hw/arm/virt.h
|
|
@@ -137,6 +137,7 @@ typedef struct {
|
|
|
|
#define VIRT_ECAM_ID(high) (high ? VIRT_HIGH_PCIE_ECAM : VIRT_PCIE_ECAM)
|
|
|
|
+#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)
|
|
@@ -145,6 +146,16 @@ typedef struct {
|
|
#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);
|
|
|
|
/* Return the number of used redistributor regions */
|
|
--
|
|
2.20.1
|
|
|