[RFC,v4,4/5] hw/arm/virt: Add 2.10 machine type
diff mbox

Message ID 1494697399-352-5-git-send-email-eric.auger@redhat.com
State New
Headers show

Commit Message

Auger Eric May 13, 2017, 5:43 p.m. UTC
The new machine type allows smmuv3 instantiation. A new option
is introduced to turn the feature on/off (off by default).

Signed-off-by: Eric Auger <eric.auger@redhat.com>

---

Another alternative would be to use the -device option as
done on x86. As the smmu is a sysbus device, we would need to
use the platform bus framework. This would work fine
for the dt generation. However the feasibility needs to be
studied for ACPI table generation.

a Veuillez saisir le message de validation pour vos modifications. Les lignes
---
 hw/arm/virt.c         | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
 include/hw/arm/virt.h |  1 +
 2 files changed, 50 insertions(+), 2 deletions(-)

Comments

Peter Maydell May 30, 2017, 4:04 p.m. UTC | #1
On 13 May 2017 at 18:43, Eric Auger <eric.auger@redhat.com> wrote:
> The new machine type allows smmuv3 instantiation. A new option
> is introduced to turn the feature on/off (off by default).

Should we go for default-on, or would that break guests?
For other things added to the virt board I think the
approach we've taken has been:
 * if this is just an extra device, simply provide it in the
   new virt-n.nn machine by default
 * if this is something that changes how the machine behaves
   even for code that doesn't care about that feature (eg
   EL2, EL3, since they change what mode you start in on boot)
   then default it to off
 * if the feature only works with TCG and not KVM then
   maybe default it to off

thanks
-- PMM
Auger Eric May 31, 2017, 7:15 a.m. UTC | #2
Hi Peter,

On 30/05/2017 18:04, Peter Maydell wrote:
> On 13 May 2017 at 18:43, Eric Auger <eric.auger@redhat.com> wrote:
>> The new machine type allows smmuv3 instantiation. A new option
>> is introduced to turn the feature on/off (off by default).
> 
> Should we go for default-on, or would that break guests?
> For other things added to the virt board I think the
> approach we've taken has been:
>  * if this is just an extra device, simply provide it in the
>    new virt-n.nn machine by default
>  * if this is something that changes how the machine behaves
>    even for code that doesn't care about that feature (eg
>    EL2, EL3, since they change what mode you start in on boot)
>    then default it to off
>  * if the feature only works with TCG and not KVM then
>    maybe default it to off

OK thanks for the guidelines. I put it off by default since it can
largely degrade the performance in some use cases. Also instantiating
the smmu can also induce some option changes at other levels: for
instance virtio-pci devices may be used along with iommu_platform option
for the guest to use dma ops.

Thanks

Eric
> 
> thanks
> -- PMM
>

Patch
diff mbox

diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index c00efb2..71ea707 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -1496,6 +1496,20 @@  static void machvirt_init(MachineState *machine)
     create_platform_bus(vms, pic);
 }
 
+static bool virt_get_smmu(Object *obj, Error **errp)
+{
+    VirtMachineState *vms = VIRT_MACHINE(obj);
+
+    return vms->smmu;
+}
+
+static void virt_set_smmu(Object *obj, bool value, Error **errp)
+{
+    VirtMachineState *vms = VIRT_MACHINE(obj);
+
+    vms->smmu = value;
+}
+
 static bool virt_get_secure(Object *obj, Error **errp)
 {
     VirtMachineState *vms = VIRT_MACHINE(obj);
@@ -1609,7 +1623,7 @@  static void machvirt_machine_init(void)
 }
 type_init(machvirt_machine_init);
 
-static void virt_2_9_instance_init(Object *obj)
+static void virt_2_10_instance_init(Object *obj)
 {
     VirtMachineState *vms = VIRT_MACHINE(obj);
     VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
@@ -1665,14 +1679,47 @@  static void virt_2_9_instance_init(Object *obj)
                                         NULL);
     }
 
+    if (vmc->no_smmu) {
+        vms->smmu = false;
+    } else {
+        /* Default disallows smmu instantiation */
+        vms->smmu = false;
+        object_property_add_bool(obj, "smmu", virt_get_smmu,
+                                 virt_set_smmu, NULL);
+        object_property_set_description(obj, "smmu",
+                                        "Set on/off to enable/disable "
+                                        "smmu instantiation (default off)",
+                                        NULL);
+    }
+
     vms->memmap = a15memmap;
     vms->irqmap = a15irqmap;
 }
 
+static void virt_machine_2_10_options(MachineClass *mc)
+{
+}
+DEFINE_VIRT_MACHINE_AS_LATEST(2, 10)
+
+#define VIRT_COMPAT_2_9 \
+    HW_COMPAT_2_9
+
+static void virt_2_9_instance_init(Object *obj)
+{
+    virt_2_10_instance_init(obj);
+}
+
 static void virt_machine_2_9_options(MachineClass *mc)
 {
+    VirtMachineClass *vmc = VIRT_MACHINE_CLASS(OBJECT_CLASS(mc));
+
+    virt_machine_2_10_options(mc);
+    SET_MACHINE_COMPAT(mc, VIRT_COMPAT_2_9);
+
+    vmc->no_smmu = true;
 }
-DEFINE_VIRT_MACHINE_AS_LATEST(2, 9)
+DEFINE_VIRT_MACHINE(2, 9)
+
 
 #define VIRT_COMPAT_2_8 \
     HW_COMPAT_2_8
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
index 164a531..cd2c82e 100644
--- a/include/hw/arm/virt.h
+++ b/include/hw/arm/virt.h
@@ -86,6 +86,7 @@  typedef struct {
     bool disallow_affinity_adjustment;
     bool no_its;
     bool no_pmu;
+    bool no_smmu;
     bool claim_edge_triggered_timers;
 } VirtMachineClass;