Message ID | 20240708143420.16953-3-joao.m.martins@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | hw/vfio: IOMMUFD Dirty Tracking | expand |
>-----Original Message----- >From: Joao Martins <joao.m.martins@oracle.com> >Subject: [PATCH v3 02/10] backends/iommufd: Extend >iommufd_backend_get_device_info() to fetch HW capabilities > >The helper will be able to fetch vendor agnostic IOMMU capabilities >supported both by hardware and software. Right now it is only iommu dirty >tracking. > >Signed-off-by: Joao Martins <joao.m.martins@oracle.com> Reviewed-by: Zhenzhong Duan <zhenzhong.duan@intel.com> Thanks Zhenzhong >--- > include/sysemu/iommufd.h | 2 +- > backends/iommufd.c | 4 +++- > hw/vfio/iommufd.c | 4 +++- > 3 files changed, 7 insertions(+), 3 deletions(-) > >diff --git a/include/sysemu/iommufd.h b/include/sysemu/iommufd.h >index 9edfec604595..57d502a1c79a 100644 >--- a/include/sysemu/iommufd.h >+++ b/include/sysemu/iommufd.h >@@ -49,7 +49,7 @@ int >iommufd_backend_unmap_dma(IOMMUFDBackend *be, uint32_t ioas_id, > hwaddr iova, ram_addr_t size); > bool iommufd_backend_get_device_info(IOMMUFDBackend *be, uint32_t >devid, > uint32_t *type, void *data, uint32_t len, >- Error **errp); >+ uint64_t *caps, Error **errp); > > #define TYPE_HOST_IOMMU_DEVICE_IOMMUFD >TYPE_HOST_IOMMU_DEVICE "-iommufd" > #endif >diff --git a/backends/iommufd.c b/backends/iommufd.c >index 84fefbc9ee7a..2b3d51af26d2 100644 >--- a/backends/iommufd.c >+++ b/backends/iommufd.c >@@ -210,7 +210,7 @@ int >iommufd_backend_unmap_dma(IOMMUFDBackend *be, uint32_t ioas_id, > > bool iommufd_backend_get_device_info(IOMMUFDBackend *be, uint32_t >devid, > uint32_t *type, void *data, uint32_t len, >- Error **errp) >+ uint64_t *caps, Error **errp) > { > struct iommu_hw_info info = { > .size = sizeof(info), >@@ -226,6 +226,8 @@ bool >iommufd_backend_get_device_info(IOMMUFDBackend *be, uint32_t devid, > > g_assert(type); > *type = info.out_data_type; >+ g_assert(caps); >+ *caps = info.out_capabilities; > > return true; > } >diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c >index a4d23f488b01..9cee71659b1c 100644 >--- a/hw/vfio/iommufd.c >+++ b/hw/vfio/iommufd.c >@@ -628,11 +628,13 @@ static bool >hiod_iommufd_vfio_realize(HostIOMMUDevice *hiod, void *opaque, > union { > struct iommu_hw_info_vtd vtd; > } data; >+ uint64_t hw_caps; > > hiod->agent = opaque; > > if (iommufd_backend_get_device_info(vdev->iommufd, vdev->devid, >- &type, &data, sizeof(data), NULL)) { >+ &type, &data, sizeof(data), >+ &hw_caps, NULL)) { > hiod->name = g_strdup(vdev->name); > caps->type = type; > caps->aw_bits = vfio_device_get_aw_bits(vdev); >-- >2.17.2
diff --git a/include/sysemu/iommufd.h b/include/sysemu/iommufd.h index 9edfec604595..57d502a1c79a 100644 --- a/include/sysemu/iommufd.h +++ b/include/sysemu/iommufd.h @@ -49,7 +49,7 @@ int iommufd_backend_unmap_dma(IOMMUFDBackend *be, uint32_t ioas_id, hwaddr iova, ram_addr_t size); bool iommufd_backend_get_device_info(IOMMUFDBackend *be, uint32_t devid, uint32_t *type, void *data, uint32_t len, - Error **errp); + uint64_t *caps, Error **errp); #define TYPE_HOST_IOMMU_DEVICE_IOMMUFD TYPE_HOST_IOMMU_DEVICE "-iommufd" #endif diff --git a/backends/iommufd.c b/backends/iommufd.c index 84fefbc9ee7a..2b3d51af26d2 100644 --- a/backends/iommufd.c +++ b/backends/iommufd.c @@ -210,7 +210,7 @@ int iommufd_backend_unmap_dma(IOMMUFDBackend *be, uint32_t ioas_id, bool iommufd_backend_get_device_info(IOMMUFDBackend *be, uint32_t devid, uint32_t *type, void *data, uint32_t len, - Error **errp) + uint64_t *caps, Error **errp) { struct iommu_hw_info info = { .size = sizeof(info), @@ -226,6 +226,8 @@ bool iommufd_backend_get_device_info(IOMMUFDBackend *be, uint32_t devid, g_assert(type); *type = info.out_data_type; + g_assert(caps); + *caps = info.out_capabilities; return true; } diff --git a/hw/vfio/iommufd.c b/hw/vfio/iommufd.c index a4d23f488b01..9cee71659b1c 100644 --- a/hw/vfio/iommufd.c +++ b/hw/vfio/iommufd.c @@ -628,11 +628,13 @@ static bool hiod_iommufd_vfio_realize(HostIOMMUDevice *hiod, void *opaque, union { struct iommu_hw_info_vtd vtd; } data; + uint64_t hw_caps; hiod->agent = opaque; if (iommufd_backend_get_device_info(vdev->iommufd, vdev->devid, - &type, &data, sizeof(data), NULL)) { + &type, &data, sizeof(data), + &hw_caps, NULL)) { hiod->name = g_strdup(vdev->name); caps->type = type; caps->aw_bits = vfio_device_get_aw_bits(vdev);
The helper will be able to fetch vendor agnostic IOMMU capabilities supported both by hardware and software. Right now it is only iommu dirty tracking. Signed-off-by: Joao Martins <joao.m.martins@oracle.com> --- include/sysemu/iommufd.h | 2 +- backends/iommufd.c | 4 +++- hw/vfio/iommufd.c | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-)