25 Sep, 2013

1 commit

  • Change iommu driver call io_page_fault trace event. This iommu_error class
    event can be enabled to trigger when an iommu error occurs. Trace information
    includes driver name, device name, iova, and flags.

    Testing:
    Added trace calls to iommu_prepare_identity_map() for testing some of the
    conditions that are hard to trigger. Here is the trace from the testing:

    swapper/0-1 [003] .... 2.003774: io_page_fault: IOMMU:pci 0000:00:02.0 iova=0x00000000cb800000 flags=0x0002
    swapper/0-1 [003] .... 2.004098: io_page_fault: IOMMU:pci 0000:00:1d.0 iova=0x00000000cadc6000 flags=0x0002
    swapper/0-1 [003] .... 2.004115: io_page_fault: IOMMU:pci 0000:00:1a.0 iova=0x00000000cadc6000 flags=0x0002
    swapper/0-1 [003] .... 2.004129: io_page_fault: IOMMU:pci 0000:00:1f.0 iova=0x0000000000000000 flags=0x0002

    Signed-off-by: Shuah Khan
    Signed-off-by: Joerg Roedel

    Shuah Khan
     

14 Aug, 2013

1 commit

  • Added the following domain attributes for the FSL PAMU driver:
    1. Added new iommu stash attribute, which allows setting of the
    LIODN specific stash id parameter through IOMMU API.
    2. Added an attribute for enabling/disabling DMA to a particular
    memory window.
    3. Added domain attribute to check for PAMUV1 specific constraints.

    Signed-off-by: Varun Sethi
    Signed-off-by: Joerg Roedel

    Varun Sethi
     

02 May, 2013

1 commit


25 Apr, 2013

1 commit

  • As IOMMU groups are exposed to the user space by their numbers,
    the user space can use them in various kernel APIs so the kernel
    might need an API to find a group by its ID.

    As an example, QEMU VFIO on PPC64 platform needs it to associate
    a logical bus number (LIOBN) with a specific IOMMU group in order
    to support in-kernel handling of DMA map/unmap requests.

    The patch adds the iommu_group_get_by_id(id) function which performs
    such search.

    v2: fixed reference counting.

    Signed-off-by: Alexey Kardashevskiy
    Acked-by: Alex Williamson
    Signed-off-by: Joerg Roedel

    Alexey Kardashevskiy
     

20 Apr, 2013

1 commit

  • The linux/iommu.h header uses ERR_PTR defined
    in linux/err.h but doesn't include it.

    Cc:joro@8bytes.org
    Reviewed-by: Alex Williamson
    Signed-off-by: Wang YanQing
    Signed-off-by: Joerg Roedel

    Wang YanQing
     

03 Apr, 2013

2 commits


06 Feb, 2013

4 commits


25 Sep, 2012

1 commit


03 Aug, 2012

2 commits


23 Jul, 2012

1 commit


11 Jul, 2012

2 commits


25 Jun, 2012

1 commit

  • IOMMU device groups are currently a rather vague associative notion
    with assembly required by the user or user level driver provider to
    do anything useful. This patch intends to grow the IOMMU group concept
    into something a bit more consumable.

    To do this, we first create an object representing the group, struct
    iommu_group. This structure is allocated (iommu_group_alloc) and
    filled (iommu_group_add_device) by the iommu driver. The iommu driver
    is free to add devices to the group using it's own set of policies.
    This allows inclusion of devices based on physical hardware or topology
    limitations of the platform, as well as soft requirements, such as
    multi-function trust levels or peer-to-peer protection of the
    interconnects. Each device may only belong to a single iommu group,
    which is linked from struct device.iommu_group. IOMMU groups are
    maintained using kobject reference counting, allowing for automatic
    removal of empty, unreferenced groups. It is the responsibility of
    the iommu driver to remove devices from the group
    (iommu_group_remove_device).

    IOMMU groups also include a userspace representation in sysfs under
    /sys/kernel/iommu_groups. When allocated, each group is given a
    dynamically assign ID (int). The ID is managed by the core IOMMU group
    code to support multiple heterogeneous iommu drivers, which could
    potentially collide in group naming/numbering. This also keeps group
    IDs to small, easily managed values. A directory is created under
    /sys/kernel/iommu_groups for each group. A further subdirectory named
    "devices" contains links to each device within the group. The iommu_group
    file in the device's sysfs directory, which formerly contained a group
    number when read, is now a link to the iommu group. Example:

    $ ls -l /sys/kernel/iommu_groups/26/devices/
    total 0
    lrwxrwxrwx. 1 root root 0 Apr 17 12:57 0000:00:1e.0 ->
    ../../../../devices/pci0000:00/0000:00:1e.0
    lrwxrwxrwx. 1 root root 0 Apr 17 12:57 0000:06:0d.0 ->
    ../../../../devices/pci0000:00/0000:00:1e.0/0000:06:0d.0
    lrwxrwxrwx. 1 root root 0 Apr 17 12:57 0000:06:0d.1 ->
    ../../../../devices/pci0000:00/0000:00:1e.0/0000:06:0d.1

    $ ls -l /sys/kernel/iommu_groups/26/devices/*/iommu_group
    [truncating perms/owner/timestamp]
    /sys/kernel/iommu_groups/26/devices/0000:00:1e.0/iommu_group ->
    ../../../kernel/iommu_groups/26
    /sys/kernel/iommu_groups/26/devices/0000:06:0d.0/iommu_group ->
    ../../../../kernel/iommu_groups/26
    /sys/kernel/iommu_groups/26/devices/0000:06:0d.1/iommu_group ->
    ../../../../kernel/iommu_groups/26

    Groups also include several exported functions for use by user level
    driver providers, for example VFIO. These include:

    iommu_group_get(): Acquires a reference to a group from a device
    iommu_group_put(): Releases reference
    iommu_group_for_each_dev(): Iterates over group devices using callback
    iommu_group_[un]register_notifier(): Allows notification of device add
    and remove operations relevant to the group
    iommu_group_id(): Return the group number

    This patch also extends the IOMMU API to allow attaching groups to
    domains. This is currently a simple wrapper for iterating through
    devices within a group, but it's expected that the IOMMU API may
    eventually make groups a more integral part of domains.

    Groups intentionally do not try to manage group ownership. A user
    level driver provider must independently acquire ownership for each
    device within a group before making use of the group as a whole.
    This may change in the future if group usage becomes more pervasive
    across both DMA and IOMMU ops.

    Groups intentionally do not provide a mechanism for driver locking
    or otherwise manipulating driver matching/probing of devices within
    the group. Such interfaces are generic to devices and beyond the
    scope of IOMMU groups. If implemented, user level providers have
    ready access via iommu_group_for_each_dev and group notifiers.

    iommu_device_group() is removed here as it has no users. The
    replacement is:

    group = iommu_group_get(dev);
    id = iommu_group_id(group);
    iommu_group_put(group);

    AMD-Vi & Intel VT-d support re-added in following patches.

    Signed-off-by: Alex Williamson
    Acked-by: Benjamin Herrenschmidt
    Signed-off-by: Joerg Roedel

    Alex Williamson
     

23 May, 2012

1 commit

  • Sometimes a single IOMMU user may have to deal with several
    different IOMMU devices (e.g. remoteproc).

    When an IOMMU fault happens, such users have to regain their
    context in order to deal with the fault.

    Users can't use the private fields of neither the iommu_domain nor
    the IOMMU device, because those are already used by the IOMMU core
    and low level driver (respectively).

    This patch just simply allows users to pass a private token (most
    notably their own context pointer) to iommu_set_fault_handler(),
    and then makes sure it is provided back to the users whenever
    an IOMMU fault happens.

    The patch also adopts remoteproc to the new fault handling
    interface, but the real functionality using this (recovery of
    remote processors) will only be added later in a subsequent patch
    set.

    Cc: Fernando Guzman Lugo
    Signed-off-by: Ohad Ben-Cohen
    Signed-off-by: Joerg Roedel

    Ohad Ben-Cohen
     

09 Jan, 2012

1 commit


15 Nov, 2011

2 commits

  • Signed-off-by: Joerg Roedel

    Joerg Roedel
     
  • An IOMMU group is a set of devices for which the IOMMU cannot
    distinguish transactions. For PCI devices, a group often occurs
    when a PCI bridge is involved. Transactions from any device
    behind the bridge appear to be sourced from the bridge itself.
    We leave it to the IOMMU driver to define the grouping restraints
    for their platform.

    Using this new interface, the group for a device can be retrieved
    using the iommu_device_group() callback. Users will compare the
    value returned against the value returned for other devices to
    determine whether they are part of the same group. Devices with
    no group are not translated by the IOMMU. There should be no
    expectations about the group numbers as they may be arbitrarily
    assigned by the IOMMU driver and may not be persistent across boots.

    We also provide a sysfs interface to the group numbers here so
    that userspace can understand IOMMU dependencies between devices
    for managing safe, userspace drivers.

    [Some code changes by Joerg Roedel ]

    Signed-off-by: Alex Williamson
    Signed-off-by: Joerg Roedel

    Alex Williamson
     

10 Nov, 2011

2 commits

  • When mapping a memory region, split it to page sizes as supported
    by the iommu hardware. Always prefer bigger pages, when possible,
    in order to reduce the TLB pressure.

    The logic to do that is now added to the IOMMU core, so neither the iommu
    drivers themselves nor users of the IOMMU API have to duplicate it.

    This allows a more lenient granularity of mappings; traditionally the
    IOMMU API took 'order' (of a page) as a mapping size, and directly let
    the low level iommu drivers handle the mapping, but now that the IOMMU
    core can split arbitrary memory regions into pages, we can remove this
    limitation, so users don't have to split those regions by themselves.

    Currently the supported page sizes are advertised once and they then
    remain static. That works well for OMAP and MSM but it would probably
    not fly well with intel's hardware, where the page size capabilities
    seem to have the potential to be different between several DMA
    remapping devices.

    register_iommu() currently sets a default pgsize behavior, so we can convert
    the IOMMU drivers in subsequent patches. After all the drivers
    are converted, the temporary default settings will be removed.

    Mainline users of the IOMMU API (kvm and omap-iovmm) are adopted
    to deal with bytes instead of page order.

    Many thanks to Joerg Roedel for significant review!

    Signed-off-by: Ohad Ben-Cohen
    Cc: David Brown
    Cc: David Woodhouse
    Cc: Joerg Roedel
    Cc: Stepan Moskovchenko
    Cc: KyongHo Cho
    Cc: Hiroshi DOYU
    Cc: Laurent Pinchart
    Cc: kvm@vger.kernel.org
    Signed-off-by: Joerg Roedel

    Ohad Ben-Cohen
     
  • Express sizes in bytes rather than in page order, to eliminate the
    size->order->size conversions we have whenever the IOMMU API is calling
    the low level drivers' map/unmap methods.

    Adopt all existing drivers.

    Signed-off-by: Ohad Ben-Cohen
    Cc: David Brown
    Cc: David Woodhouse
    Cc: Joerg Roedel
    Cc: Stepan Moskovchenko
    Cc: KyongHo Cho
    Cc: Hiroshi DOYU
    Cc: Laurent Pinchart
    Signed-off-by: Joerg Roedel

    Ohad Ben-Cohen
     

21 Oct, 2011

6 commits


30 Sep, 2011

1 commit


14 Sep, 2011

1 commit

  • Add iommu fault report mechanism to the IOMMU API, so implementations
    could report about mmu faults (translation errors, hardware errors,
    etc..).

    Fault reports can be used in several ways:
    - mere logging
    - reset the device that accessed the faulting address (may be necessary
    in case the device is a remote processor for example)
    - implement dynamic PTE/TLB loading

    A dedicated iommu_set_fault_handler() API has been added to allow
    users, who are interested to receive such reports, to provide
    their handler.

    Signed-off-by: Ohad Ben-Cohen
    Signed-off-by: Joerg Roedel

    Ohad Ben-Cohen
     

14 Jun, 2011

1 commit


19 Jul, 2010

1 commit


08 Mar, 2010

4 commits


24 Mar, 2009

2 commits