Message ID | 20240429065046.3688701-16-zhenzhong.duan@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add a host IOMMU device abstraction to check with vIOMMU | expand |
Hello Zhenzhong, On 4/29/24 08:50, Zhenzhong Duan wrote: > From: Yi Liu <yi.l.liu@intel.com> > > 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 <yi.l.liu@intel.com> > Signed-off-by: Yi Sun <yi.y.sun@linux.intel.com> > Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> > Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> > --- > 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. Thanks, C. > +void pci_device_unset_iommu_device(PCIDevice *dev); > > /** > * pci_setup_iommu: Initialize specific IOMMU handlers for a PCIBus > diff --git a/hw/pci/pci.c b/hw/pci/pci.c > index 02a4bb2af6..c3293e9357 100644 > --- a/hw/pci/pci.c > +++ b/hw/pci/pci.c > @@ -2742,6 +2742,33 @@ AddressSpace *pci_device_iommu_address_space(PCIDevice *dev) > return &address_space_memory; > } > > +int pci_device_set_iommu_device(PCIDevice *dev, HostIOMMUDevice *hiod, > + Error **errp) > +{ > + PCIBus *iommu_bus; > + > + /* set_iommu_device requires device's direct BDF instead of aliased BDF */ > + pci_device_get_iommu_bus_devfn(dev, &iommu_bus, NULL, NULL); > + if (iommu_bus && iommu_bus->iommu_ops->set_iommu_device) { > + return iommu_bus->iommu_ops->set_iommu_device(pci_get_bus(dev), > + iommu_bus->iommu_opaque, > + dev->devfn, hiod, errp); > + } > + return 0; > +} > + > +void pci_device_unset_iommu_device(PCIDevice *dev) > +{ > + PCIBus *iommu_bus; > + > + pci_device_get_iommu_bus_devfn(dev, &iommu_bus, NULL, NULL); > + if (iommu_bus && iommu_bus->iommu_ops->unset_iommu_device) { > + return iommu_bus->iommu_ops->unset_iommu_device(pci_get_bus(dev), > + iommu_bus->iommu_opaque, > + dev->devfn); > + } > +} > + > void pci_setup_iommu(PCIBus *bus, const PCIIOMMUOps *ops, void *opaque) > { > /*
Hi Cédric, >-----Original Message----- >From: Cédric Le Goater <clg@redhat.com> >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 <yi.l.liu@intel.com> >> >> 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 <yi.l.liu@intel.com> >> Signed-off-by: Yi Sun <yi.y.sun@linux.intel.com> >> Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> >> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> >> --- >> 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. Thanks Zhenzhong
On 5/7/24 09:48, Duan, Zhenzhong wrote: > Hi Cédric, > >> -----Original Message----- >> From: Cédric Le Goater <clg@redhat.com> >> 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 <yi.l.liu@intel.com> >>> >>> 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 <yi.l.liu@intel.com> >>> Signed-off-by: Yi Sun <yi.y.sun@linux.intel.com> >>> Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> >>> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> >>> --- >>> 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. Thanks, C. > > Thanks > Zhenzhong >
>-----Original Message----- >From: Cédric Le Goater <clg@redhat.com> >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 <clg@redhat.com> >>> 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 <yi.l.liu@intel.com> >>>> >>>> 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 <yi.l.liu@intel.com> >>>> Signed-off-by: Yi Sun <yi.y.sun@linux.intel.com> >>>> Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> >>>> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com> >>>> --- >>>> 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
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" /* 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); +void pci_device_unset_iommu_device(PCIDevice *dev); /** * pci_setup_iommu: Initialize specific IOMMU handlers for a PCIBus diff --git a/hw/pci/pci.c b/hw/pci/pci.c index 02a4bb2af6..c3293e9357 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -2742,6 +2742,33 @@ AddressSpace *pci_device_iommu_address_space(PCIDevice *dev) return &address_space_memory; } +int pci_device_set_iommu_device(PCIDevice *dev, HostIOMMUDevice *hiod, + Error **errp) +{ + PCIBus *iommu_bus; + + /* set_iommu_device requires device's direct BDF instead of aliased BDF */ + pci_device_get_iommu_bus_devfn(dev, &iommu_bus, NULL, NULL); + if (iommu_bus && iommu_bus->iommu_ops->set_iommu_device) { + return iommu_bus->iommu_ops->set_iommu_device(pci_get_bus(dev), + iommu_bus->iommu_opaque, + dev->devfn, hiod, errp); + } + return 0; +} + +void pci_device_unset_iommu_device(PCIDevice *dev) +{ + PCIBus *iommu_bus; + + pci_device_get_iommu_bus_devfn(dev, &iommu_bus, NULL, NULL); + if (iommu_bus && iommu_bus->iommu_ops->unset_iommu_device) { + return iommu_bus->iommu_ops->unset_iommu_device(pci_get_bus(dev), + iommu_bus->iommu_opaque, + dev->devfn); + } +} + void pci_setup_iommu(PCIBus *bus, const PCIIOMMUOps *ops, void *opaque) { /*