Message ID | 1494697399-352-5-git-send-email-eric.auger@redhat.com |
---|---|
State | New |
Headers | show |
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
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 >
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;
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(-)