Message ID | 1571920483-3382-8-git-send-email-yi.l.liu@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | intel_iommu: expose Shared Virtual Addressing to VM | expand |
On Thu, Oct 24, 2019 at 08:34:28AM -0400, Liu Yi L wrote: > This patch adds pci_device_iommu_context() to get an iommu_context > for a given device. A new callback is added in PCIIOMMUOps. Users > who wants to listen to events issued by vIOMMU could use this new > interface to get an iommu_context and register their own notifiers, > then wait for notifications from vIOMMU. e.g. VFIO is the first user > of it to listen to the PASID_ALLOC/PASID_BIND/CACHE_INV events and > propagate the events to host. > > Cc: Kevin Tian <kevin.tian@intel.com> > Cc: Jacob Pan <jacob.jun.pan@linux.intel.com> > Cc: Peter Xu <peterx@redhat.com> > Cc: Eric Auger <eric.auger@redhat.com> > Cc: Yi Sun <yi.y.sun@linux.intel.com> > Cc: David Gibson <david@gibson.dropbear.id.au> > Signed-off-by: Liu Yi L <yi.l.liu@intel.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> > --- > hw/pci/pci.c | 16 ++++++++++++++++ > include/hw/pci/pci.h | 5 +++++ > 2 files changed, 21 insertions(+) > > diff --git a/hw/pci/pci.c b/hw/pci/pci.c > index b5ce9ca..4e6af06 100644 > --- a/hw/pci/pci.c > +++ b/hw/pci/pci.c > @@ -2625,6 +2625,22 @@ AddressSpace *pci_device_iommu_address_space(PCIDevice *dev) > return &address_space_memory; > } > > +IOMMUContext *pci_device_iommu_context(PCIDevice *dev) > +{ > + PCIBus *bus = pci_get_bus(dev); > + PCIBus *iommu_bus = bus; > + > + while (iommu_bus && !iommu_bus->iommu_ops && iommu_bus->parent_dev) { > + iommu_bus = pci_get_bus(iommu_bus->parent_dev); > + } > + if (iommu_bus && iommu_bus->iommu_ops && > + iommu_bus->iommu_ops->get_iommu_context) { > + return iommu_bus->iommu_ops->get_iommu_context(bus, > + iommu_bus->iommu_opaque, dev->devfn); > + } > + return NULL; > +} > + > void pci_setup_iommu(PCIBus *bus, const PCIIOMMUOps *ops, void *opaque) > { > bus->iommu_ops = ops; > diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h > index d9fed8d..ccada47 100644 > --- a/include/hw/pci/pci.h > +++ b/include/hw/pci/pci.h > @@ -9,6 +9,8 @@ > > #include "hw/pci/pcie.h" > > +#include "hw/iommu/iommu.h" > + > extern bool pci_available; > > /* PCI bus */ > @@ -484,9 +486,12 @@ typedef struct PCIIOMMUOps PCIIOMMUOps; > struct PCIIOMMUOps { > AddressSpace * (*get_address_space)(PCIBus *bus, > void *opaque, int32_t devfn); > + IOMMUContext * (*get_iommu_context)(PCIBus *bus, > + void *opaque, int32_t devfn); > }; > > AddressSpace *pci_device_iommu_address_space(PCIDevice *dev); > +IOMMUContext *pci_device_iommu_context(PCIDevice *dev); > void pci_setup_iommu(PCIBus *bus, const PCIIOMMUOps *iommu_ops, void *opaque); > > static inline void
On Thu, Oct 24, 2019 at 08:34:28AM -0400, Liu Yi L wrote: > This patch adds pci_device_iommu_context() to get an iommu_context > for a given device. A new callback is added in PCIIOMMUOps. Users > who wants to listen to events issued by vIOMMU could use this new > interface to get an iommu_context and register their own notifiers, > then wait for notifications from vIOMMU. e.g. VFIO is the first user > of it to listen to the PASID_ALLOC/PASID_BIND/CACHE_INV events and > propagate the events to host. > > Cc: Kevin Tian <kevin.tian@intel.com> > Cc: Jacob Pan <jacob.jun.pan@linux.intel.com> > Cc: Peter Xu <peterx@redhat.com> > Cc: Eric Auger <eric.auger@redhat.com> > Cc: Yi Sun <yi.y.sun@linux.intel.com> > Cc: David Gibson <david@gibson.dropbear.id.au> > Signed-off-by: Liu Yi L <yi.l.liu@intel.com> Reviewed-by: Peter Xu <peterx@redhat.com>
> From: Peter Xu [mailto:peterx@redhat.com] > Sent: Saturday, November 2, 2019 2:10 AM > To: Liu, Yi L <yi.l.liu@intel.com> > Subject: Re: [RFC v2 07/22] hw/pci: introduce pci_device_iommu_context() > > On Thu, Oct 24, 2019 at 08:34:28AM -0400, Liu Yi L wrote: > > This patch adds pci_device_iommu_context() to get an iommu_context for > > a given device. A new callback is added in PCIIOMMUOps. Users who > > wants to listen to events issued by vIOMMU could use this new > > interface to get an iommu_context and register their own notifiers, > > then wait for notifications from vIOMMU. e.g. VFIO is the first user > > of it to listen to the PASID_ALLOC/PASID_BIND/CACHE_INV events and > > propagate the events to host. > > > > Cc: Kevin Tian <kevin.tian@intel.com> > > Cc: Jacob Pan <jacob.jun.pan@linux.intel.com> > > Cc: Peter Xu <peterx@redhat.com> > > Cc: Eric Auger <eric.auger@redhat.com> > > Cc: Yi Sun <yi.y.sun@linux.intel.com> > > Cc: David Gibson <david@gibson.dropbear.id.au> > > Signed-off-by: Liu Yi L <yi.l.liu@intel.com> > > Reviewed-by: Peter Xu <peterx@redhat.com> Thanks for the review. Regards, Yi Liu
> From: David Gibson > Sent: Tuesday, October 29, 2019 7:51 PM > To: Liu, Yi L <yi.l.liu@intel.com> > Subject: Re: [RFC v2 07/22] hw/pci: introduce pci_device_iommu_context() > > On Thu, Oct 24, 2019 at 08:34:28AM -0400, Liu Yi L wrote: > > This patch adds pci_device_iommu_context() to get an iommu_context for > > a given device. A new callback is added in PCIIOMMUOps. Users who > > wants to listen to events issued by vIOMMU could use this new > > interface to get an iommu_context and register their own notifiers, > > then wait for notifications from vIOMMU. e.g. VFIO is the first user > > of it to listen to the PASID_ALLOC/PASID_BIND/CACHE_INV events and > > propagate the events to host. > > > > Cc: Kevin Tian <kevin.tian@intel.com> > > Cc: Jacob Pan <jacob.jun.pan@linux.intel.com> > > Cc: Peter Xu <peterx@redhat.com> > > Cc: Eric Auger <eric.auger@redhat.com> > > Cc: Yi Sun <yi.y.sun@linux.intel.com> > > Cc: David Gibson <david@gibson.dropbear.id.au> > > Signed-off-by: Liu Yi L <yi.l.liu@intel.com> > > Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Thanks for the review. Regards, Yi Liu
diff --git a/hw/pci/pci.c b/hw/pci/pci.c index b5ce9ca..4e6af06 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -2625,6 +2625,22 @@ AddressSpace *pci_device_iommu_address_space(PCIDevice *dev) return &address_space_memory; } +IOMMUContext *pci_device_iommu_context(PCIDevice *dev) +{ + PCIBus *bus = pci_get_bus(dev); + PCIBus *iommu_bus = bus; + + while (iommu_bus && !iommu_bus->iommu_ops && iommu_bus->parent_dev) { + iommu_bus = pci_get_bus(iommu_bus->parent_dev); + } + if (iommu_bus && iommu_bus->iommu_ops && + iommu_bus->iommu_ops->get_iommu_context) { + return iommu_bus->iommu_ops->get_iommu_context(bus, + iommu_bus->iommu_opaque, dev->devfn); + } + return NULL; +} + void pci_setup_iommu(PCIBus *bus, const PCIIOMMUOps *ops, void *opaque) { bus->iommu_ops = ops; diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h index d9fed8d..ccada47 100644 --- a/include/hw/pci/pci.h +++ b/include/hw/pci/pci.h @@ -9,6 +9,8 @@ #include "hw/pci/pcie.h" +#include "hw/iommu/iommu.h" + extern bool pci_available; /* PCI bus */ @@ -484,9 +486,12 @@ typedef struct PCIIOMMUOps PCIIOMMUOps; struct PCIIOMMUOps { AddressSpace * (*get_address_space)(PCIBus *bus, void *opaque, int32_t devfn); + IOMMUContext * (*get_iommu_context)(PCIBus *bus, + void *opaque, int32_t devfn); }; AddressSpace *pci_device_iommu_address_space(PCIDevice *dev); +IOMMUContext *pci_device_iommu_context(PCIDevice *dev); void pci_setup_iommu(PCIBus *bus, const PCIIOMMUOps *iommu_ops, void *opaque); static inline void
This patch adds pci_device_iommu_context() to get an iommu_context for a given device. A new callback is added in PCIIOMMUOps. Users who wants to listen to events issued by vIOMMU could use this new interface to get an iommu_context and register their own notifiers, then wait for notifications from vIOMMU. e.g. VFIO is the first user of it to listen to the PASID_ALLOC/PASID_BIND/CACHE_INV events and propagate the events to host. Cc: Kevin Tian <kevin.tian@intel.com> Cc: Jacob Pan <jacob.jun.pan@linux.intel.com> Cc: Peter Xu <peterx@redhat.com> Cc: Eric Auger <eric.auger@redhat.com> Cc: Yi Sun <yi.y.sun@linux.intel.com> Cc: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Liu Yi L <yi.l.liu@intel.com> --- hw/pci/pci.c | 16 ++++++++++++++++ include/hw/pci/pci.h | 5 +++++ 2 files changed, 21 insertions(+)