> -----Original Message-----
> From: Eric Auger <eric.au...@redhat.com>
> Sent: Tuesday, July 8, 2025 10:47 AM
> To: Shameerali Kolothum Thodi
> <shameerali.kolothum.th...@huawei.com>; qemu-...@nongnu.org;
> qemu-devel@nongnu.org
> Cc: peter.mayd...@linaro.org; j...@nvidia.com; nicol...@nvidia.com;
> ddut...@redhat.com; berra...@redhat.com; imamm...@redhat.com;
> nath...@nvidia.com; mo...@nvidia.com; smost...@google.com;
> gustavo.rom...@linaro.org; m...@redhat.com;
> marcel.apfelb...@gmail.com; Linuxarm <linux...@huawei.com>;
> Wangzhou (B) <wangzh...@hisilicon.com>; jiangkunkun
> <jiangkun...@huawei.com>; Jonathan Cameron
> <jonathan.came...@huawei.com>; zhangfei....@linaro.org
> Subject: Re: [PATCH v6 08/12] hw/arm/virt: Allow user-creatable SMMUv3
> dev instantiation
> 
> Hi Shameer,
> 
> On 7/8/25 10:54 AM, Shameerali Kolothum Thodi wrote:
> > Hi Eric,
> >
> >> -----Original Message-----
> >> From: Eric Auger <eric.au...@redhat.com>
> >> Sent: Tuesday, July 8, 2025 8:41 AM
> >> To: Shameerali Kolothum Thodi
> >> <shameerali.kolothum.th...@huawei.com>; qemu-...@nongnu.org;
> >> qemu-devel@nongnu.org
> >> Cc: peter.mayd...@linaro.org; j...@nvidia.com; nicol...@nvidia.com;
> >> ddut...@redhat.com; berra...@redhat.com; imamm...@redhat.com;
> >> nath...@nvidia.com; mo...@nvidia.com; smost...@google.com;
> >> gustavo.rom...@linaro.org; m...@redhat.com;
> >> marcel.apfelb...@gmail.com; Linuxarm <linux...@huawei.com>;
> >> Wangzhou (B) <wangzh...@hisilicon.com>; jiangkunkun
> >> <jiangkun...@huawei.com>; Jonathan Cameron
> >> <jonathan.came...@huawei.com>; zhangfei....@linaro.org
> >> Subject: Re: [PATCH v6 08/12] hw/arm/virt: Allow user-creatable
> SMMUv3
> >> dev instantiation
> >>
> >> Hi Shameer,
> >>
> >> On 7/3/25 10:46 AM, Shameer Kolothum wrote:
> >>> Allow cold-plugging of an SMMUv3 device on the virt machine when no
> >>> global (legacy) SMMUv3 is present or when a virtio-iommu is specified.
> >>>
> >>> This user-created SMMUv3 device is tied to a specific PCI bus provided
> >>> by the user, so ensure the IOMMU ops are configured accordingly.
> >>>
> >>> Due to current limitations in QEMU’s device tree support, specifically
> >>> its inability to properly present pxb-pcie based root complexes and
> >>> their devices, the device tree support for the new SMMUv3 device is
> >>> limited to cases where it is attached to the default pcie.0 root complex.
> >>>
> >>> Reviewed-by: Jonathan Cameron <jonathan.came...@huawei.com>
> >>> Reviewed-by: Eric Auger <eric.au...@redhat.com>
> >>> Tested-by: Nathan Chen <nath...@nvidia.com>
> >>> Signed-off-by: Shameer Kolothum
> >> <shameerali.kolothum.th...@huawei.com>
> >>> ---
> >>>  hw/arm/smmu-common.c         |  8 +++++-
> >>>  hw/arm/smmuv3.c              |  2 ++
> >>>  hw/arm/virt.c                | 50 ++++++++++++++++++++++++++++++++++++
> >>>  hw/core/sysbus-fdt.c         |  3 +++
> >>>  include/hw/arm/smmu-common.h |  1 +
> >>>  5 files changed, 63 insertions(+), 1 deletion(-)
> >>>
> >>> diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
> >>> index b15e7fd0e4..2ee4691299 100644
> >>> --- a/hw/arm/smmu-common.c
> >>> +++ b/hw/arm/smmu-common.c
> >>> @@ -959,7 +959,12 @@ static void smmu_base_realize(DeviceState
> *dev,
> >> Error **errp)
> >>>                  goto out_err;
> >>>              }
> >>>          }
> >>> -        pci_setup_iommu(pci_bus, &smmu_ops, s);
> >>> +
> >>> +        if (s->smmu_per_bus) {
> >>> +            pci_setup_iommu_per_bus(pci_bus, &smmu_ops, s);
> >>> +        } else {
> >>> +            pci_setup_iommu(pci_bus, &smmu_ops, s);
> >>> +        }
> >>>          return;
> >>>      }
> >>>  out_err:
> >>> @@ -984,6 +989,7 @@ static void smmu_base_reset_exit(Object *obj,
> >> ResetType type)
> >>>  static const Property smmu_dev_properties[] = {
> >>>      DEFINE_PROP_UINT8("bus_num", SMMUState, bus_num, 0),
> >>> +    DEFINE_PROP_BOOL("smmu_per_bus", SMMUState, smmu_per_bus,
> >> false),
> >>>      DEFINE_PROP_LINK("primary-bus", SMMUState, primary_bus,
> >>>                       TYPE_PCI_BUS, PCIBus *),
> >>>  };
> >>> diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
> >>> index ab67972353..bcf8af8dc7 100644
> >>> --- a/hw/arm/smmuv3.c
> >>> +++ b/hw/arm/smmuv3.c
> >>> @@ -1996,6 +1996,8 @@ static void smmuv3_class_init(ObjectClass
> >> *klass, const void *data)
> >>>      device_class_set_parent_realize(dc, smmu_realize,
> >>>                                      &c->parent_realize);
> >>>      device_class_set_props(dc, smmuv3_properties);
> >>> +    dc->hotpluggable = false;
> >>> +    dc->user_creatable = true;
> >>>  }
> >>>
> >>>  static int smmuv3_notify_flag_changed(IOMMUMemoryRegion
> *iommu,
> >>> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> >>> index 05a14881cf..8662173c43 100644
> >>> --- a/hw/arm/virt.c
> >>> +++ b/hw/arm/virt.c
> >>> @@ -56,6 +56,7 @@
> >>>  #include "qemu/cutils.h"
> >>>  #include "qemu/error-report.h"
> >>>  #include "qemu/module.h"
> >>> +#include "hw/pci/pci_bus.h"
> >>>  #include "hw/pci-host/gpex.h"
> >>>  #include "hw/virtio/virtio-pci.h"
> >>>  #include "hw/core/sysbus-fdt.h"
> >>> @@ -1440,6 +1441,28 @@ static void
> create_smmuv3_dt_bindings(const
> >> VirtMachineState *vms, hwaddr base,
> >>>      g_free(node);
> >>>  }
> >>>
> >>> +static void create_smmuv3_dev_dtb(VirtMachineState *vms,
> >>> +                                  DeviceState *dev, PCIBus *bus)
> >>> +{
> >>> +    PlatformBusDevice *pbus = PLATFORM_BUS_DEVICE(vms-
> >>> platform_bus_dev);
> >>> +    SysBusDevice *sbdev = SYS_BUS_DEVICE(dev);
> >>> +    int irq = platform_bus_get_irqn(pbus, sbdev, 0);
> >>> +    hwaddr base = platform_bus_get_mmio_addr(pbus, sbdev, 0);
> >>> +    MachineState *ms = MACHINE(vms);
> >>> +
> >>> +    if (strcmp("pcie.0", bus->qbus.name)) {
> >>> +        warn_report("SMMUv3 device only supported with pcie.0 for
> DT");
> >> while testing the series I hit the warning with a rhel guest which boots
> >> with ACPI.
> >> I think we shall make the check smarter to avoid that.
> >> maybe also check firmware_loaded and virt_is_acpi_enabled()?
> > Thanks for giving it a spin. Yes, just confirmed that the warning appears.
> > The above check will work, but can we make use of vms->acpi_dev for
> > this check instead? It is essentially the same and I think that will work.
> >
> >     if (!vms->acpi_dev && strcmp("pcie.0", bus->qbus.name))
> the logical dependency on acpi_dev is maybe not that straightforward.
> Also it has has_ged and aarch64 check
> I thing I would simply check !(firmware_loaded &&
> virt_is_acpi_enabled(vms)). about the aarch64 check I am not sure this
> is needed.

Right. I think has_ged is enable by default from 4.1 and on aarch64, isn't
SMMUV3 only enabled for ARM64 cases? At least on kernel it is, I think.

Anyway, agree, the firmware_loaded && virt_is_acpi_enabled(vms) is
more readable. I will fix it.

Thanks,
Shameer

Reply via email to