Hi Zhenzhong, On 6/3/24 08:10, Zhenzhong Duan wrote: > Utilize range_get_last_bit() to get host IOMMU address width and > package it in HostIOMMUDeviceCaps for query with .get_cap(). > > Signed-off-by: Zhenzhong Duan <zhenzhong.d...@intel.com> > --- > hw/vfio/container.c | 26 ++++++++++++++++++++++++++ > 1 file changed, 26 insertions(+) > > diff --git a/hw/vfio/container.c b/hw/vfio/container.c > index c4fca2dfca..48800fe92f 100644 > --- a/hw/vfio/container.c > +++ b/hw/vfio/container.c > @@ -1136,6 +1136,31 @@ static void vfio_iommu_legacy_class_init(ObjectClass > *klass, void *data) > vioc->pci_hot_reset = vfio_legacy_pci_hot_reset; > }; > > +static bool hiod_legacy_vfio_realize(HostIOMMUDevice *hiod, void *opaque, > + Error **errp) > +{ > + VFIODevice *vdev = opaque; > + /* iova_ranges is a sorted list */ > + GList *l = g_list_last(vdev->bcontainer->iova_ranges); > + > + /* Only support query HOST_IOMMU_DEVICE_CAP_AW_BITS with legacy backend > */ I don't get the comment as HOST_IOMMU_DEVICE_CAP_AW_BITS support seems to be introduced in [PATCH v6 11/19] backends/iommufd: Implement HostIOMMUDeviceClass::get_cap() handler > + if (l) { > + Range *range = l->data; > + hiod->caps.aw_bits = range_get_last_bit(range) + 1; > + } else { > + hiod->caps.aw_bits = 0xff; why this value? > + } > + > + return true; > +} > + > +static void hiod_legacy_vfio_class_init(ObjectClass *oc, void *data) > +{ > + HostIOMMUDeviceClass *hioc = HOST_IOMMU_DEVICE_CLASS(oc); > + > + hioc->realize = hiod_legacy_vfio_realize; > +}; > + > static const TypeInfo types[] = { > { > .name = TYPE_VFIO_IOMMU_LEGACY, > @@ -1144,6 +1169,7 @@ static const TypeInfo types[] = { > }, { > .name = TYPE_HOST_IOMMU_DEVICE_LEGACY_VFIO, > .parent = TYPE_HOST_IOMMU_DEVICE, > + .class_init = hiod_legacy_vfio_class_init, > } > }; >
Thanks Eric