06 Nov, 2015

1 commit

  • Pull intel iommu updates from David Woodhouse:
    "This adds "Shared Virtual Memory" (aka PASID support) for the Intel
    IOMMU. This allows devices to do DMA using process address space,
    translated through the normal CPU page tables for the relevant mm.

    With corresponding support added to the i915 driver, this has been
    tested with the graphics device on Skylake. We don't have the
    required TLP support in our PCIe root ports for supporting discrete
    devices yet, so it's only integrated devices that can do it so far"

    * git://git.infradead.org/intel-iommu: (23 commits)
    iommu/vt-d: Fix rwxp flags in SVM device fault callback
    iommu/vt-d: Expose struct svm_dev_ops without CONFIG_INTEL_IOMMU_SVM
    iommu/vt-d: Clean up pasid_enabled() and ecs_enabled() dependencies
    iommu/vt-d: Handle Caching Mode implementations of SVM
    iommu/vt-d: Fix SVM IOTLB flush handling
    iommu/vt-d: Use dev_err(..) in intel_svm_device_to_iommu(..)
    iommu/vt-d: fix a loop in prq_event_thread()
    iommu/vt-d: Fix IOTLB flushing for global pages
    iommu/vt-d: Fix address shifting in page request handler
    iommu/vt-d: shift wrapping bug in prq_event_thread()
    iommu/vt-d: Fix NULL pointer dereference in page request error case
    iommu/vt-d: Implement SVM_FLAG_SUPERVISOR_MODE for kernel access
    iommu/vt-d: Implement SVM_FLAG_PRIVATE_PASID to allocate unique PASIDs
    iommu/vt-d: Add callback to device driver on page faults
    iommu/vt-d: Implement page request handling
    iommu/vt-d: Generalise DMAR MSI setup to allow for page request events
    iommu/vt-d: Implement deferred invalidate for SVM
    iommu/vt-d: Add basic SVM PASID support
    iommu/vt-d: Always enable PASID/PRI PCI capabilities before ATS
    iommu/vt-d: Add initial support for PASID tables
    ...

    Linus Torvalds
     

05 Nov, 2015

1 commit

  • Pull driver core updates from Greg KH:
    "Here's the "big" driver core updates for 4.4-rc1. Primarily a bunch
    of debugfs updates, with a smattering of minor driver core fixes and
    updates as well.

    All have been in linux-next for a long time"

    * tag 'driver-core-4.4-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core:
    debugfs: Add debugfs_create_ulong()
    of: to support binding numa node to specified device in devicetree
    debugfs: Add read-only/write-only bool file ops
    debugfs: Add read-only/write-only size_t file ops
    debugfs: Add read-only/write-only x64 file ops
    debugfs: Consolidate file mode checks in debugfs_create_*()
    Revert "mm: Check if section present during memory block (un)registering"
    driver-core: platform: Provide helpers for multi-driver modules
    mm: Check if section present during memory block (un)registering
    devres: fix a for loop bounds check
    CMA: fix CONFIG_CMA_SIZE_MBYTES overflow in 64bit
    base/platform: assert that dev_pm_domain callbacks are called unconditionally
    sysfs: correctly handle short reads on PREALLOC attrs.
    base: soc: siplify ida usage
    kobject: move EXPORT_SYMBOL() macros next to corresponding definitions
    kobject: explain what kobject's sd field is
    debugfs: document that debugfs_remove*() accepts NULL and error values
    debugfs: Pass bool pointer to debugfs_create_bool()
    ACPI / EC: Fix broken 64bit big-endian users of 'global_lock'

    Linus Torvalds
     

28 Oct, 2015

1 commit


27 Oct, 2015

1 commit

  • Pull iommu fixes from Joerg Roedel:
    "Two late fixes for the AMD IOMMU driver:

    - add an additional check to the io page-fault handler to avoid a
    BUG_ON being hit in handle_mm_fault()

    - fix a problem with devices writing to the system management area
    and were blocked by the IOMMU because the driver wrongly cleared
    out the DTE flags allowing that access"

    * tag 'iommu-fixes-v4.3-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu:
    iommu/amd: Don't clear DTE flags when modifying it
    iommu/amd: Fix BUG when faulting a PROT_NONE VMA

    Linus Torvalds
     

25 Oct, 2015

2 commits

  • When booted with intel_iommu=ecs_off we were still allocating the PASID
    tables even though we couldn't actually use them. We really want to make
    the pasid_enabled() macro depend on ecs_enabled().

    Which is unfortunate, because currently they're the other way round to
    cope with the Broadwell/Skylake problems with ECS.

    Instead of having ecs_enabled() depend on pasid_enabled(), which was never
    something that made me happy anyway, make it depend in the normal case
    on the "broken PASID" bit 28 *not* being set.

    Then pasid_enabled() can depend on ecs_enabled() as it should. And we also
    don't need to mess with it if we ever see an implementation that has some
    features requiring ECS (like PRI) but which *doesn't* have PASID support.

    Signed-off-by: David Woodhouse

    David Woodhouse
     
  • Not entirely clear why, but it seems we need to reserve PASID zero and
    flush it when we make a PASID entry present.

    Quite we we couldn't use the true PASID value, isn't clear.

    Signed-off-by: David Woodhouse

    David Woodhouse
     

22 Oct, 2015

1 commit

  • Pull intel-iommu bugfix from David Woodhouse:
    "This contains a single fix, for when the IOMMU API is used to overlay
    an existing mapping comprised of 4KiB pages, with a mapping that can
    use superpages.

    For the *first* superpage in the new mapping, we were correctly¹
    freeing the old bottom-level page table page and clearing the link to
    it, before installing the superpage. For subsequent superpages,
    however, we weren't. This causes a memory leak, and a warning about
    setting a PTE which is already set.

    ¹ Well, not *entirely* correctly. We just free the page table pages
    right there and then, which is wrong. In fact they should only be
    freed *after* the IOTLB is flushed so we know the hardware will no
    longer be looking at them.... and in fact I note that the IOTLB
    flush is completely missing from the intel_iommu_map() code path,
    although it needs to be there if it's permitted to overwrite
    existing mappings.

    Fixing those is somewhat more intrusive though, and will probably
    need to wait for 4.4 at this point"

    * tag 'for-linus-20151021' of git://git.infradead.org/intel-iommu:
    iommu/vt-d: fix range computation when making room for large pages

    Linus Torvalds
     

21 Oct, 2015

1 commit

  • During device assignment/deassignment the flags in the DTE
    get lost, which might cause spurious faults, for example
    when the device tries to access the system management range.
    Fix this by not clearing the flags with the rest of the DTE.

    Reported-by: G. Richard Bellamy
    Tested-by: G. Richard Bellamy
    Cc: stable@vger.kernel.org
    Signed-off-by: Joerg Roedel

    Joerg Roedel
     

20 Oct, 2015

1 commit

  • Change the 'pages' parameter to 'unsigned long' to avoid overflow.

    Fix the device-IOTLB flush parameter calculation — the size of the IOTLB
    flush is indicated by the position of the least significant zero bit in
    the address field. For example, a value of 0x12345f000 will flush from
    0x123440000 to 0x12347ffff (256KiB).

    Finally, the cap_pgsel_inv() is not relevant to SVM; the spec says that
    *all* implementations must support page-selective invaliation for
    "first-level" translations. So don't check for it.

    Signed-off-by: David Woodhouse

    David Woodhouse
     

19 Oct, 2015

1 commit


18 Oct, 2015

1 commit


17 Oct, 2015

2 commits


16 Oct, 2015

2 commits


15 Oct, 2015

12 commits


14 Oct, 2015

2 commits

  • In preparation for the installation of a large page, any small page
    tables that may still exist in the target IOV address range are
    removed. However, if a scatter/gather list entry is large enough to
    fit more than one large page, the address space for any subsequent
    large pages is not cleared of conflicting small page tables.

    This can cause legitimate mapping requests to fail with errors of the
    form below, potentially followed by a series of IOMMU faults:

    ERROR: DMA PTE for vPFN 0xfde00 already set (to 7f83a4003 not 7e9e00083)

    In this example, a 4MiB scatter/gather list entry resulted in the
    successful installation of a large page @ vPFN 0xfdc00, followed by
    a failed attempt to install another large page @ vPFN 0xfde00, due to
    the presence of a pointer to a small page table @ 0x7f83a4000.

    To address this problem, compute the number of large pages that fit
    into a given scatter/gather list entry, and use it to derive the
    last vPFN covered by the large page(s).

    Cc: stable@vger.kernel.org
    Signed-off-by: Christian Zander
    Signed-off-by: David Woodhouse

    Christian Zander
     
  • Pull IOMMU fixes from Joerg Roedel:
    "A few fixes piled up:

    - Fix for a suspend/resume issue where PCI probing code overwrote
    dev->irq for the MSI irq of the AMD IOMMU.

    - Fix for a kernel crash when a 32 bit PCI device was assigned to a
    KVM guest.

    - Fix for a possible memory leak in the VT-d driver

    - A couple of fixes for the ARM-SMMU driver"

    * tag 'iommu-fixes-v4.3-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu:
    iommu/amd: Fix NULL pointer deref on device detach
    iommu/amd: Prevent binding other PCI drivers to IOMMU PCI devices
    iommu/vt-d: Fix memory leak in dmar_insert_one_dev_info()
    iommu/arm-smmu: Use correct address mask for CMD_TLBI_S2_IPA
    iommu/arm-smmu: Ensure IAS is set correctly for AArch32-capable SMMUs
    iommu/io-pgtable-arm: Don't use dma_to_phys()

    Linus Torvalds
     

09 Oct, 2015

2 commits

  • When a device group is detached from its domain, the iommu
    core code calls into the iommu driver to detach each device
    individually.

    Before this functionality went into the iommu core code, it
    was implemented in the drivers, also in the AMD IOMMU
    driver as the device alias handling code.

    This code is still present, as there might be aliases that
    don't exist as real PCI devices (and are therefore invisible
    to the iommu core code).

    Unfortunatly it might happen now, that a device is unbound
    multiple times from its domain, first by the alias handling
    code and then by the iommu core code (or vice verca).

    This ends up in the do_detach function which dereferences
    the dev_data->domain pointer. When the device is already
    detached, this pointer is NULL and we get a kernel oops.

    Removing the alias code completly is not an option, as that
    would also remove the code which handles invisible aliases.
    The code could be simplified, but this is too big of a
    change outside the merge window.

    For now, just check the dev_data->domain pointer in
    do_detach and bail out if it is NULL.

    Reported-by: Andreas Hartmann
    Signed-off-by: Joerg Roedel

    Joerg Roedel
     
  • AMD IOMMU driver makes use of IOMMU PCI devices, so prevent binding other
    PCI drivers to IOMMU PCI devices.

    This fixes a bug reported by Boris that system suspend/resume gets broken
    on AMD platforms. For more information, please refer to:
    https://lkml.org/lkml/2015/9/26/89

    Fixes: 991de2e59090 ("PCI, x86: Implement pcibios_alloc_irq() and pcibios_free_irq()")
    Signed-off-by: Jiang Liu
    Cc: Borislav Petkov
    Signed-off-by: Joerg Roedel

    Jiang Liu
     

07 Oct, 2015

1 commit


04 Oct, 2015

1 commit

  • Its a bit odd that debugfs_create_bool() takes 'u32 *' as an argument,
    when all it needs is a boolean pointer.

    It would be better to update this API to make it accept 'bool *'
    instead, as that will make it more consistent and often more convenient.
    Over that bool takes just a byte.

    That required updates to all user sites as well, in the same commit
    updating the API. regmap core was also using
    debugfs_{read|write}_file_bool(), directly and variable types were
    updated for that to be bool as well.

    Signed-off-by: Viresh Kumar
    Acked-by: Mark Brown
    Acked-by: Charles Keepax
    Signed-off-by: Greg Kroah-Hartman

    Viresh Kumar
     

02 Oct, 2015

1 commit

  • Pull IOVA fixes from David Woodhouse:
    "The main fix here is the first one, fixing the over-allocation of
    size-aligned requests. The other patches simply make the existing
    IOVA code available to users other than the Intel VT-d driver, with no
    functional change.

    I concede the latter really *should* have been submitted during the
    merge window, but since it's basically risk-free and people are
    waiting to build on top of it and it's my fault I didn't get it in, I
    (and they) would be grateful if you'd take it"

    * git://git.infradead.org/intel-iommu:
    iommu: Make the iova library a module
    iommu: iova: Export symbols
    iommu: iova: Move iova cache management to the iova library
    iommu/iova: Avoid over-allocating when size-aligned

    Linus Torvalds
     

29 Sep, 2015

1 commit


23 Sep, 2015

3 commits

  • Stage-2 TLBI by IPA takes a 48-bit address field, as opposed to the
    64-bit field used by the VA-based invalidation commands.

    This patch re-jigs the SMMUv3 command construction code so that the
    address field is correctly masked.

    Signed-off-by: Will Deacon

    Will Deacon
     
  • AArch32-capable SMMU implementations have a minimum IAS of 40 bits, so
    ensure that is reflected in the stage-2 page table configuration.

    Signed-off-by: Will Deacon

    Will Deacon
     
  • In checking whether DMA addresses differ from physical addresses, using
    dma_to_phys() is actually the wrong thing to do, since it may hide any
    DMA offset, which is precisely one of the things we are checking for.
    Simply casting between the two address types, whilst ugly, is in fact
    the appropriate course of action. Further care (and ugliness) is also
    necessary in the comparison to avoid truncation if phys_addr_t and
    dma_addr_t differ in size.

    We can also reject any device with a fixed DMA offset up-front at page
    table creation, leaving the allocation-time check for the more subtle
    cases like bounce buffering due to an incorrect DMA mask.

    Furthermore, we can then fix the hackish KConfig dependency so that
    architectures without a dma_to_phys() implementation may still
    COMPILE_TEST (or even use!) the code. The true dependency is on the
    DMA API, so use the appropriate symbol for that.

    Signed-off-by: Robin Murphy
    [will: folded in selftest fix from Yong Wu]
    Signed-off-by: Will Deacon

    Robin Murphy
     

12 Sep, 2015

1 commit

  • The seq_ function return values were frequently misused.

    See: commit 1f33c41c03da ("seq_file: Rename seq_overflow() to
    seq_has_overflowed() and make public")

    All uses of these return values have been removed, so convert the
    return types to void.

    Miscellanea:

    o Move seq_put_decimal_ and seq_escape prototypes closer the
    other seq_vprintf prototypes
    o Reorder seq_putc and seq_puts to return early on overflow
    o Add argument names to seq_vprintf and seq_printf
    o Update the seq_escape kernel-doc
    o Convert a couple of leading spaces to tabs in seq_escape

    Signed-off-by: Joe Perches
    Cc: Al Viro
    Cc: Steven Rostedt
    Cc: Mark Brown
    Cc: Stephen Rothwell
    Cc: Joerg Roedel
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Joe Perches
     

09 Sep, 2015

1 commit

  • Pull iommu updates for from Joerg Roedel:
    "This time the IOMMU updates are mostly cleanups or fixes. No big new
    features or drivers this time. In particular the changes include:

    - Bigger cleanup of the DomainIOMMU data structures and the code
    that manages them in the Intel VT-d driver. This makes the code
    easier to understand and maintain, and also easier to keep the data
    structures in sync. It is also a preparation step to make use of
    default domains from the IOMMU core in the Intel VT-d driver.

    - Fixes for a couple of DMA-API misuses in ARM IOMMU drivers, namely
    in the ARM and Tegra SMMU drivers.

    - Fix for a potential buffer overflow in the OMAP iommu driver's
    debug code

    - A couple of smaller fixes and cleanups in various drivers

    - One small new feature: Report domain-id usage in the Intel VT-d
    driver to easier detect bugs where these are leaked"

    * tag 'iommu-updates-v4.3' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu: (83 commits)
    iommu/vt-d: Really use upper context table when necessary
    x86/vt-d: Fix documentation of DRHD
    iommu/fsl: Really fix init section(s) content
    iommu/io-pgtable-arm: Unmap and free table when overwriting with block
    iommu/io-pgtable-arm: Move init-fn declarations to io-pgtable.h
    iommu/msm: Use BUG_ON instead of if () BUG()
    iommu/vt-d: Access iomem correctly
    iommu/vt-d: Make two functions static
    iommu/vt-d: Use BUG_ON instead of if () BUG()
    iommu/vt-d: Return false instead of 0 in irq_remapping_cap()
    iommu/amd: Use BUG_ON instead of if () BUG()
    iommu/amd: Make a symbol static
    iommu/amd: Simplify allocation in irq_remapping_alloc()
    iommu/tegra-smmu: Parameterize number of TLB lines
    iommu/tegra-smmu: Factor out tegra_smmu_set_pde()
    iommu/tegra-smmu: Extract tegra_smmu_pte_get_use()
    iommu/tegra-smmu: Use __GFP_ZERO to allocate zeroed pages
    iommu/tegra-smmu: Remove PageReserved manipulation
    iommu/tegra-smmu: Convert to use DMA API
    iommu/tegra-smmu: smmu_flush_ptc() wants device addresses
    ...

    Linus Torvalds