>-----Original Message-----
>From: Cédric Le Goater <[email protected]>
>Subject: Re: [PATCH v3 15/19] hw/pci: Introduce
>pci_device_[set|unset]_iommu_device()
>
>On 5/7/24 09:48, Duan, Zhenzhong wrote:
>> Hi Cédric,
>>
>>> -----Original Message-----
>>> From: Cédric Le Goater <[email protected]>
>>> Subject: Re: [PATCH v3 15/19] hw/pci: Introduce
>>> pci_device_[set|unset]_iommu_device()
>>>
>>> Hello Zhenzhong,
>>>
>>> On 4/29/24 08:50, Zhenzhong Duan wrote:
>>>> From: Yi Liu <[email protected]>
>>>>
>>>> pci_device_[set|unset]_iommu_device() call
>>> pci_device_get_iommu_bus_devfn()
>>>> to get iommu_bus->iommu_ops and call [set|unset]_iommu_device
>>> callback to
>>>> set/unset HostIOMMUDevice for a given PCI device.
>>>>
>>>> Signed-off-by: Yi Liu <[email protected]>
>>>> Signed-off-by: Yi Sun <[email protected]>
>>>> Signed-off-by: Nicolin Chen <[email protected]>
>>>> Signed-off-by: Zhenzhong Duan <[email protected]>
>>>> ---
>>>> include/hw/pci/pci.h | 38
>>> +++++++++++++++++++++++++++++++++++++-
>>>> hw/pci/pci.c | 27 +++++++++++++++++++++++++++
>>>> 2 files changed, 64 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
>>>> index eaa3fc99d8..849e391813 100644
>>>> --- a/include/hw/pci/pci.h
>>>> +++ b/include/hw/pci/pci.h
>>>> @@ -3,6 +3,7 @@
>>>>
>>>> #include "exec/memory.h"
>>>> #include "sysemu/dma.h"
>>>> +#include "sysemu/host_iommu_device.h"
>>>
>>> This include directive pulls a Linux header file <linux/iommufd.h>
>>> which doesn't exist on all platforms, such as windows and it breaks
>>> compile. So,
>>>
>>>>
>>>> /* PCI includes legacy ISA access. */
>>>> #include "hw/isa/isa.h"
>>>> @@ -383,10 +384,45 @@ typedef struct PCIIOMMUOps {
>>>> *
>>>> * @devfn: device and function number
>>>> */
>>>> - AddressSpace * (*get_address_space)(PCIBus *bus, void *opaque, int
>>> devfn);
>>>> + AddressSpace * (*get_address_space)(PCIBus *bus, void *opaque,
>int
>>> devfn);
>>>> + /**
>>>> + * @set_iommu_device: attach a HostIOMMUDevice to a vIOMMU
>>>> + *
>>>> + * Optional callback, if not implemented in vIOMMU, then vIOMMU
>>> can't
>>>> + * retrieve host information from the associated HostIOMMUDevice.
>>>> + *
>>>> + * @bus: the #PCIBus of the PCI device.
>>>> + *
>>>> + * @opaque: the data passed to pci_setup_iommu().
>>>> + *
>>>> + * @devfn: device and function number of the PCI device.
>>>> + *
>>>> + * @dev: the data structure representing host IOMMU device.
>>>> + *
>>>> + * @errp: pass an Error out only when return false
>>>> + *
>>>> + * Returns: 0 if HostIOMMUDevice is attached, or else <0 with errp
>set.
>>>> + */
>>>> + int (*set_iommu_device)(PCIBus *bus, void *opaque, int devfn,
>>>> + HostIOMMUDevice *dev, Error **errp);
>>>> + /**
>>>> + * @unset_iommu_device: detach a HostIOMMUDevice from a
>>> vIOMMU
>>>> + *
>>>> + * Optional callback.
>>>> + *
>>>> + * @bus: the #PCIBus of the PCI device.
>>>> + *
>>>> + * @opaque: the data passed to pci_setup_iommu().
>>>> + *
>>>> + * @devfn: device and function number of the PCI device.
>>>> + */
>>>> + void (*unset_iommu_device)(PCIBus *bus, void *opaque, int devfn);
>>>> } PCIIOMMUOps;
>>>>
>>>> AddressSpace *pci_device_iommu_address_space(PCIDevice *dev);
>>>> +int pci_device_set_iommu_device(PCIDevice *dev, HostIOMMUDevice
>>> *hiod,
>>>> + Error **errp);
>>>
>>> please include a forward declaration for HostIOMMUDevice instead.
>>
>> Got it, will do.
>> Maybe using iommu_hw_info_type in
>include/sysemu/host_iommu_device.h
>> isn't a good idea from start.
>
>It is not indeed since some included files are used on the Windows build.
Windows build pass after below change to drop iommu_hw_info.
I'll do more build test, then send v5, sorry for the trouble.
diff --git a/backends/iommufd.c b/backends/iommufd.c
index 7c332bd167..fc3e498bc6 100644
--- a/backends/iommufd.c
+++ b/backends/iommufd.c
@@ -208,7 +208,7 @@ int iommufd_backend_unmap_dma(IOMMUFDBackend *be, uint32_t
ioas_id,
}
bool iommufd_backend_get_device_info(IOMMUFDBackend *be, uint32_t devid,
- enum iommu_hw_info_type *type,
+ unit32_t *type,
void *data, uint32_t len, Error **errp)
{
struct iommu_hw_info info = {
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
index 29fbe61454..ddef667c0d 100644
--- a/hw/i386/intel_iommu.c
+++ b/hw/i386/intel_iommu.c
@@ -20,6 +20,7 @@
*/
#include "qemu/osdep.h"
+#include CONFIG_DEVICES /* CONFIG_HOST_IOMMU_DEVICE */
#include "qemu/error-report.h"
#include "qemu/main-loop.h"
#include "qapi/error.h"
@@ -4203,6 +4204,8 @@ VTDAddressSpace *vtd_find_add_as(IntelIOMMUState *s,
PCIBus *bus,
static bool vtd_check_hdev(IntelIOMMUState *s, VTDHostIOMMUDevice *vtd_hdev,
Error **errp)
{
+#ifdef CONFIG_HOST_IOMMU_DEVICE
+
HostIOMMUDevice *hiod = vtd_hdev->dev;
int ret;
@@ -4223,6 +4226,9 @@ static bool vtd_check_hdev(IntelIOMMUState *s,
VTDHostIOMMUDevice *vtd_hdev,
error_setg(errp, "host device is unsupported in scalable modern mode yet");
return false;
+#else
+ return true;
+#endif
}
static bool vtd_dev_set_iommu_device(PCIBus *bus, void *opaque, int devfn,
diff --git a/include/sysemu/host_iommu_device.h
b/include/sysemu/host_iommu_device.h
index 680c2a311a..ed4cbc967a 100644
--- a/include/sysemu/host_iommu_device.h
+++ b/include/sysemu/host_iommu_device.h
@@ -14,7 +14,6 @@
#include "qom/object.h"
#include "qapi/error.h"
-#include <linux/iommufd.h>
/**
* struct HostIOMMUDeviceCaps - Define host IOMMU device capabilities.
@@ -24,7 +23,7 @@
* @aw_bits: host IOMMU address width. 0xff if no limitation.
*/
typedef struct HostIOMMUDeviceCaps {
- enum iommu_hw_info_type type;
+ uint32_t type;
uint8_t aw_bits;
} HostIOMMUDeviceCaps;
diff --git a/include/sysemu/iommufd.h b/include/sysemu/iommufd.h
index ee1907c23a..6503a51d79 100644
--- a/include/sysemu/iommufd.h
+++ b/include/sysemu/iommufd.h
@@ -17,7 +17,6 @@
#include "qom/object.h"
#include "exec/hwaddr.h"
#include "exec/cpu-common.h"
-#include <linux/iommufd.h>
#include "sysemu/host_iommu_device.h"
#define TYPE_IOMMUFD_BACKEND "iommufd"
@@ -49,7 +48,7 @@ int iommufd_backend_map_dma(IOMMUFDBackend *be, uint32_t
ioas_id, hwaddr iova,
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,
+ uint32_t *type,
void *data, uint32_t len, Error **errp);
#define TYPE_HOST_IOMMU_DEVICE_IOMMUFD TYPE_HOST_IOMMU_DEVICE "-iommufd"
Thanks
Zhenzhong