This is a first prototype adding auxiliary domain support to Arm SMMUv3,
following Lu Baolu's latest proposal for IOMMU aware mediated devices
[1]. It works, but the attach() API still doesn't feel right. See (2)
below.

Patch 1 adapts iommu.c to the current proposal for auxiliary domains.
Patches 2-4 rework the PASID allocator to make it usable for SVA and
AUXD simultaneously. Patches 5-6 add AUXD support to SMMUv3.


When a device can have multiple address space, for instance with PCI
PASID, an auxiliary domain (AUXD) is the IOMMU representation of one
address space. I distinguish auxiliary from "main" domain, which
represents the non-PASID address space but also (at least for SMMUv3)
the whole device context, PASID tables etc.

Auxiliary domains will be used by VFIO for IOMMU-aware mdev, and by any
other device driver that wants to use PASID for private address spaces
(as opposed to SVA [2]). The following API is available to device
drivers:

(1) Enable AUXD for a device. Enable PASID if necessary and set an AUXD
    flag on the IOMMU data associated to a device.

    For my own convenience I've been using the SVA infrastructure since
    I already had the locking and IOMMU ops in place. The proposed
    interface is also missing min_pasid and max_pasid parameters, which
    could be needed by device drivers to enforce PASID limits.
    iommu_sva_init_device() without arguments already enables PASID, so
    I just added an AUXD flag to SVA features:

      iommu_sva_init_device(dev, IOMMU_SVA_FEAT_AUXD,
                            min_pasid, max_pasid, NULL)
      iommu_sva_shutdown_device(dev)

    Or as proposed in [1]:

      iommu_set_dev_attr(dev, IOMMU_DEV_ATTR_AUXD_ENABLE, NULL)
      iommu_set_dev_attr(dev, IOMMU_DEV_ATTR_AUXD_DISABLE, NULL)

    Finding a compromise for this interface should be easy.

(2) Allocate a domain and attach it to the device.

      dom = iommu_domain_alloc()
      iommu_attach_device(dom, dev)

    I still have concerns about this part, which are highlighted by the
    messy changes of patch 1. I think it would make more sense to
    introduce new attach/detach_dev_aux() functions instead of reusing
    attach/detach_dev()

    Can we reconsider this and avoid unnecessary complications in IOMMU
    core and drivers? Does the VFIO code greatly benefit from using the
    same attach() function? It could as well use a different one for
    devices in AUXD mode, which the mediating driver could tell by
    adding a flag in mdev_set_iommu_device(), for example.

    And I don't think other users of AUXD would benefit from using the
    same attach() function, since they will know whether they want to be
    using main or auxiliary domain when doing attach().

(3) Get the PASID, and program it in the device

      iommu_domain_get_attr(dom, DOMAIN_ATTR_AUXD_ID, &pasid)

(4) Create DMA mappings

      iommu_map(dom, ...)
      iommu_unmap(dom, ...)

    Ultimately it would be nice to add PASID support to the DMA API as
    well. For now drivers allocate IOVAs and pages themselves.


For vfio-mdev, a driver that wants to create mdevs only performs steps (1)
and (3):

* When initializing the parent device, enable AUXD (1)
* In mdev_parent_ops::create(), call mdev_set_iommu_device(mdev_dev(mdev),
  mdev_parent_dev(mdev)).
* In mdev_parent_ops::open(), get the PASID (3) and install it in the
  parent device.
* In mdev_parent_ops::close(), clear the PASID


This code and the many patches it depends on can be found on my
iommu/auxd branch:
        git://linux-arm.org/linux-jpb.git iommu/auxd

[1] [PATCH v3 0/8] vfio/mdev: IOMMU aware mediated device
    
https://lwn.net/ml/linux-kernel/20181012051632.26064-1-baolu...@linux.intel.com/
[2] [PATCH v3 00/10] Shared Virtual Addressing for the IOMMU
    https://www.spinics.net/lists/iommu/msg30076.html

Jean-Philippe Brucker (6):
  iommu: Adapt attach/detach_dev() for auxiliary domains
  drivers core: Add I/O ASID allocator
  iommu/sva: Use external PASID allocator
  iommu/sva: Support AUXD feature
  iommu/arm-smmu-v3: Implement detach_dev op
  iommu/arm-smmu-v3: Add support for auxiliary domains

 drivers/base/Kconfig        |   7 ++
 drivers/base/Makefile       |   1 +
 drivers/base/ioasid.c       | 140 ++++++++++++++++++++++++++++++
 drivers/iommu/Kconfig       |   1 +
 drivers/iommu/arm-smmu-v3.c | 164 ++++++++++++++++++++++++++++++++++--
 drivers/iommu/iommu-sva.c   | 113 +++++++++++++++++--------
 drivers/iommu/iommu.c       |  58 +++++++++----
 include/linux/ioasid.h      |  45 ++++++++++
 include/linux/iommu.h       |  12 +++
 9 files changed, 479 insertions(+), 62 deletions(-)
 create mode 100644 drivers/base/ioasid.c
 create mode 100644 include/linux/ioasid.h

-- 
2.19.1

_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to