Message ID | 20250219082228.3303163-5-zhenzhong.duan@intel.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | intel_iommu: Enable stage-1 translation for passthrough device | expand |
On 2/19/25 9:22 AM, Zhenzhong Duan wrote: > There are three iommufd related elements iommufd handle, devid and There are three iommufd specific members in HostIOMMUDevice IOMMUFD that need to be initialized after attach on realize_late() ... > hwpt_id. hwpt_id is ready only after VFIO device attachment. Device > id and iommufd handle are ready before attachment, but they are all > iommufd related stuff, initialize them together with hwpt_id. > > Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> > --- > hw/vfio/iommufd.c | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) > > diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c > index df61edffc0..53639bf88b 100644 > --- a/hw/vfio/iommufd.c > +++ b/hw/vfio/iommufd.c > @@ -828,6 +828,19 @@ static bool hiod_iommufd_vfio_realize(HostIOMMUDevice *hiod, void *opaque, > return true; > } > > +static bool hiod_iommufd_vfio_realize_late(HostIOMMUDevice *hiod, void *opaque, > + Error **errp) > +{ > + VFIODevice *vdev = opaque; > + HostIOMMUDeviceIOMMUFD *idev = HOST_IOMMU_DEVICE_IOMMUFD(hiod); > + > + idev->iommufd = vdev->iommufd; > + idev->devid = vdev->devid; > + idev->hwpt_id = vdev->hwpt->hwpt_id; > + > + return true; > +} > + > static GList * > hiod_iommufd_vfio_get_iova_ranges(HostIOMMUDevice *hiod) > { > @@ -852,6 +865,7 @@ static void hiod_iommufd_vfio_class_init(ObjectClass *oc, void *data) > HostIOMMUDeviceClass *hiodc = HOST_IOMMU_DEVICE_CLASS(oc); > > hiodc->realize = hiod_iommufd_vfio_realize; > + hiodc->realize_late = hiod_iommufd_vfio_realize_late; > hiodc->get_iova_ranges = hiod_iommufd_vfio_get_iova_ranges; > hiodc->get_page_size_mask = hiod_iommufd_vfio_get_page_size_mask; > };
diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c index df61edffc0..53639bf88b 100644 --- a/hw/vfio/iommufd.c +++ b/hw/vfio/iommufd.c @@ -828,6 +828,19 @@ static bool hiod_iommufd_vfio_realize(HostIOMMUDevice *hiod, void *opaque, return true; } +static bool hiod_iommufd_vfio_realize_late(HostIOMMUDevice *hiod, void *opaque, + Error **errp) +{ + VFIODevice *vdev = opaque; + HostIOMMUDeviceIOMMUFD *idev = HOST_IOMMU_DEVICE_IOMMUFD(hiod); + + idev->iommufd = vdev->iommufd; + idev->devid = vdev->devid; + idev->hwpt_id = vdev->hwpt->hwpt_id; + + return true; +} + static GList * hiod_iommufd_vfio_get_iova_ranges(HostIOMMUDevice *hiod) { @@ -852,6 +865,7 @@ static void hiod_iommufd_vfio_class_init(ObjectClass *oc, void *data) HostIOMMUDeviceClass *hiodc = HOST_IOMMU_DEVICE_CLASS(oc); hiodc->realize = hiod_iommufd_vfio_realize; + hiodc->realize_late = hiod_iommufd_vfio_realize_late; hiodc->get_iova_ranges = hiod_iommufd_vfio_get_iova_ranges; hiodc->get_page_size_mask = hiod_iommufd_vfio_get_page_size_mask; };
There are three iommufd related elements iommufd handle, devid and hwpt_id. hwpt_id is ready only after VFIO device attachment. Device id and iommufd handle are ready before attachment, but they are all iommufd related stuff, initialize them together with hwpt_id. Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> --- hw/vfio/iommufd.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)