On 5/7/24 11:20, Zhenzhong Duan wrote:
> Introduce a helper function iommufd_backend_get_device_info() to get
> host IOMMU related information through iommufd uAPI.
>
> Signed-off-by: Yi Liu <yi.l.liu@intel.com>
> Signed-off-by: Yi Sun <yi.y.sun@linux.intel.com>
> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
> ---
> include/sysemu/iommufd.h | 4 ++++
> backends/iommufd.c | 23 ++++++++++++++++++++++-
> 2 files changed, 26 insertions(+), 1 deletion(-)
>
> diff --git a/include/sysemu/iommufd.h b/include/sysemu/iommufd.h
> index f6e6d6e1f9..ee1907c23a 100644
> --- a/include/sysemu/iommufd.h
> +++ b/include/sysemu/iommufd.h
> @@ -17,6 +17,7 @@
> #include "qom/object.h"
> #include "exec/hwaddr.h"
> #include "exec/cpu-common.h"
> +#include <linux/iommufd.h>
With this linux include, sysemu/iommufd.h is Linnux tainted. It could mean
trouble on windows.
Thanks,
C.
> #include "sysemu/host_iommu_device.h"
>
> #define TYPE_IOMMUFD_BACKEND "iommufd"
> @@ -47,6 +48,9 @@ int iommufd_backend_map_dma(IOMMUFDBackend *be, uint32_t ioas_id, hwaddr iova,
> ram_addr_t size, void *vaddr, bool readonly);
> 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,
> + enum iommu_hw_info_type *type,
> + void *data, uint32_t len, 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 012f18d8d8..06bf20fd05 100644
> --- a/backends/iommufd.c
> +++ b/backends/iommufd.c
> @@ -19,7 +19,6 @@
> #include "monitor/monitor.h"
> #include "trace.h"
> #include <sys/ioctl.h>
> -#include <linux/iommufd.h>
>
> static void iommufd_backend_init(Object *obj)
> {
> @@ -208,6 +207,28 @@ int iommufd_backend_unmap_dma(IOMMUFDBackend *be, uint32_t ioas_id,
> return ret;
> }
>
> +bool iommufd_backend_get_device_info(IOMMUFDBackend *be, uint32_t devid,
> + enum iommu_hw_info_type *type,
> + void *data, uint32_t len, Error **errp)
> +{
> + struct iommu_hw_info info = {
> + .size = sizeof(info),
> + .dev_id = devid,
> + .data_len = len,
> + .data_uptr = (uintptr_t)data,
> + };
> +
> + if (ioctl(be->fd, IOMMU_GET_HW_INFO, &info)) {
> + error_setg_errno(errp, errno, "Failed to get hardware info");
> + return false;
> + }
> +
> + g_assert(type);
> + *type = info.out_data_type;
> +
> + return true;
> +}
> +
> static const TypeInfo types[] = {
> {
> .name = TYPE_IOMMUFD_BACKEND,