On 3/11/25 3:10 PM, Shameer Kolothum wrote:
> Subsequently smmuv3-accel will provide these callbacks
>
> Signed-off-by: Shameer Kolothum <shameerali.kolothum.th...@huawei.com>
> ---
> hw/arm/smmu-common.c | 27 +++++++++++++++++++++++++++
> include/hw/arm/smmu-common.h | 5 +++++
> 2 files changed, 32 insertions(+)
>
> diff --git a/hw/arm/smmu-common.c b/hw/arm/smmu-common.c
> index 83c0693f5a..9fd455baa0 100644
> --- a/hw/arm/smmu-common.c
> +++ b/hw/arm/smmu-common.c
> @@ -865,6 +865,10 @@ static AddressSpace *smmu_find_add_as(PCIBus *bus, void
> *opaque, int devfn)
> SMMUState *s = opaque;
> SMMUPciBus *sbus = smmu_get_sbus(s, bus);
>
> + if (s->accel && s->get_address_space) {
> + return s->get_address_space(bus, opaque, devfn);
> + }
> +
why do we require that new call site? This needs to be documented in the
commit msg esp. because we don't know what this cb will do.
> sdev = sbus->pbdev[devfn];
> if (!sdev) {
> sdev = sbus->pbdev[devfn] = g_new0(SMMUDevice, 1);
> @@ -874,8 +878,31 @@ static AddressSpace *smmu_find_add_as(PCIBus *bus, void
> *opaque, int devfn)
> return &sdev->as;
> }
>
> +static bool smmu_dev_set_iommu_device(PCIBus *bus, void *opaque, int devfn,
> + HostIOMMUDevice *hiod, Error **errp)
> +{
> + SMMUState *s = opaque;
> +
> + if (s->accel && s->set_iommu_device) {
> + return s->set_iommu_device(bus, opaque, devfn, hiod, errp);
> + }
> +
> + return false;
> +}
> +
> +static void smmu_dev_unset_iommu_device(PCIBus *bus, void *opaque, int devfn)
> +{
> + SMMUState *s = opaque;
> +
> + if (s->accel && s->unset_iommu_device) {
> + s->unset_iommu_device(bus, opaque, devfn);
> + }
> +}
> +
> static const PCIIOMMUOps smmu_ops = {
> .get_address_space = smmu_find_add_as,
> + .set_iommu_device = smmu_dev_set_iommu_device,
> + .unset_iommu_device = smmu_dev_unset_iommu_device,
> };
>
> SMMUDevice *smmu_find_sdev(SMMUState *s, uint32_t sid)
> diff --git a/include/hw/arm/smmu-common.h b/include/hw/arm/smmu-common.h
> index 80ff2ef6aa..7b05640167 100644
> --- a/include/hw/arm/smmu-common.h
> +++ b/include/hw/arm/smmu-common.h
> @@ -160,6 +160,11 @@ struct SMMUState {
>
> /* For smmuv3-accel */
> bool accel;
> +
> + AddressSpace * (*get_address_space)(PCIBus *bus, void *opaque, int
> devfn);
> + bool (*set_iommu_device)(PCIBus *bus, void *opaque, int devfn,
> + HostIOMMUDevice *dev, Error **errp);
> + void (*unset_iommu_device)(PCIBus *bus, void *opaque, int devfn);
I think this should be exposed by a class and only implemented in the
smmuv3 accel device. Adding those cbs directly in the State looks not
the std way.
Eric
> };
>
> struct SMMUBaseClass {