1. 16 9月, 2016 2 次提交
  2. 19 8月, 2016 1 次提交
    • W
      iommu/arm-smmu: Disable stalling faults for all endpoints · 3714ce1d
      Will Deacon 提交于
      Enabling stalling faults can result in hardware deadlock on poorly
      designed systems, particularly those with a PCI root complex upstream of
      the SMMU.
      
      Although it's not really Linux's job to save hardware integrators from
      their own misfortune, it *is* our job to stop userspace (e.g. VFIO
      clients) from hosing the system for everybody else, even if they might
      already be required to have elevated privileges.
      
      Given that the fault handling code currently executes entirely in IRQ
      context, there is nothing that can sensibly be done to recover from
      things like page faults anyway, so let's rip this code out for now and
      avoid the potential for deadlock.
      
      Cc: <stable@vger.kernel.org>
      Fixes: 48ec83bc ("iommu/arm-smmu: Add initial driver support for ARM SMMUv3 devices")
      Reported-by: NMatt Evans <matt.evans@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      3714ce1d
  3. 07 7月, 2016 1 次提交
  4. 01 7月, 2016 1 次提交
    • W
      iommu/arm-smmu: request pcie devices to enable ACS · 112c898b
      Wei Chen 提交于
      The PCIe ACS capability will affect the layout of iommu groups.
      Generally speaking, if the path from root port to the PCIe device
      is ACS enabled, the iommu will create a single iommu group for this
      PCIe device. If all PCIe devices on the path are ACS enabled then
      Linux can determine this path is ACS enabled.
      
      Linux use two PCIe configuration registers to determine the ACS
      status of PCIe devices:
      ACS Capability Register and ACS Control Register.
      
      The first register is used to check the implementation of ACS function
      of a PCIe device, the second register is used to check the enable status
      of ACS function. If one PCIe device has implemented and enabled the ACS
      function then Linux will determine this PCIe device enabled ACS.
      
      From the Chapter:6.12 of PCI Express Base Specification Revision 3.1a,
      we can find that when a PCIe device implements ACS function, the enable
      status is set to disabled by default and can be enabled by ACS-aware
      software.
      
      ACS will affect the iommu groups topology, so, the iommu driver is
      ACS-aware software. This patch adds a call to pci_request_acs() to the
      arm-smmu driver to enable the ACS function in PCIe devices that support
      it, when they get probed.
      Reviewed-by: NRobin Murphy <robin.murphy@arm.com>
      Reviewed-by: NEric Auger <eric.auger@redhat.com>
      Signed-off-by: NWei Chen <Wei.Chen@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      112c898b
  5. 28 5月, 2016 1 次提交
    • A
      remove lots of IS_ERR_VALUE abuses · 287980e4
      Arnd Bergmann 提交于
      Most users of IS_ERR_VALUE() in the kernel are wrong, as they
      pass an 'int' into a function that takes an 'unsigned long'
      argument. This happens to work because the type is sign-extended
      on 64-bit architectures before it gets converted into an
      unsigned type.
      
      However, anything that passes an 'unsigned short' or 'unsigned int'
      argument into IS_ERR_VALUE() is guaranteed to be broken, as are
      8-bit integers and types that are wider than 'unsigned long'.
      
      Andrzej Hajda has already fixed a lot of the worst abusers that
      were causing actual bugs, but it would be nice to prevent any
      users that are not passing 'unsigned long' arguments.
      
      This patch changes all users of IS_ERR_VALUE() that I could find
      on 32-bit ARM randconfig builds and x86 allmodconfig. For the
      moment, this doesn't change the definition of IS_ERR_VALUE()
      because there are probably still architecture specific users
      elsewhere.
      
      Almost all the warnings I got are for files that are better off
      using 'if (err)' or 'if (err < 0)'.
      The only legitimate user I could find that we get a warning for
      is the (32-bit only) freescale fman driver, so I did not remove
      the IS_ERR_VALUE() there but changed the type to 'unsigned long'.
      For 9pfs, I just worked around one user whose calling conventions
      are so obscure that I did not dare change the behavior.
      
      I was using this definition for testing:
      
       #define IS_ERR_VALUE(x) ((unsigned long*)NULL == (typeof (x)*)NULL && \
             unlikely((unsigned long long)(x) >= (unsigned long long)(typeof(x))-MAX_ERRNO))
      
      which ends up making all 16-bit or wider types work correctly with
      the most plausible interpretation of what IS_ERR_VALUE() was supposed
      to return according to its users, but also causes a compile-time
      warning for any users that do not pass an 'unsigned long' argument.
      
      I suggested this approach earlier this year, but back then we ended
      up deciding to just fix the users that are obviously broken. After
      the initial warning that caused me to get involved in the discussion
      (fs/gfs2/dir.c) showed up again in the mainline kernel, Linus
      asked me to send the whole thing again.
      
      [ Updated the 9p parts as per Al Viro  - Linus ]
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Cc: Andrzej Hajda <a.hajda@samsung.com>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Link: https://lkml.org/lkml/2016/1/7/363
      Link: https://lkml.org/lkml/2016/5/27/486
      Acked-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> # For nvmem part
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      287980e4
  6. 10 5月, 2016 1 次提交
  7. 04 5月, 2016 9 次提交
  8. 21 4月, 2016 2 次提交
  9. 20 4月, 2016 1 次提交
  10. 18 2月, 2016 5 次提交
    • W
      iommu/arm-smmu: Treat IOMMU_DOMAIN_DMA as bypass for now · cbf8277e
      Will Deacon 提交于
      Until all upstream devices have their DMA ops swizzled to point at the
      SMMU, we need to treat the IOMMU_DOMAIN_DMA domain as bypass to avoid
      putting devices into an empty address space when detaching from VFIO.
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      cbf8277e
    • W
      iommu/arm-smmu: Don't fail device attach if already attached to a domain · bc7f2ce0
      Will Deacon 提交于
      The ARM SMMU attach_dev implementations returns -EEXIST if the device
      being attached is already attached to a domain. This doesn't play nicely
      with the default domain, resulting in splats such as:
      
        WARNING: at drivers/iommu/iommu.c:1257
        Modules linked in:
      
        CPU: 3 PID: 1939 Comm: virtio-net-tx Tainted: G S              4.5.0-rc4+ #1
        Hardware name: FVP Base (DT)
        task: ffffffc87a9d0000 ti: ffffffc07a278000 task.ti: ffffffc07a278000
        PC is at __iommu_detach_group+0x68/0xe8
        LR is at __iommu_detach_group+0x48/0xe8
      
      This patch fixes the problem by forcefully detaching the device from
      its old domain, if present, when attaching to a new one. The unused
      ->detach_dev callback is also removed the iommu_ops structures.
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      bc7f2ce0
    • R
      iommu/arm-smmu: Allow disabling unmatched stream bypass · 25a1c96c
      Robin Murphy 提交于
      Borrow the disable_bypass parameter from the SMMUv3 driver as a handy
      debugging/security feature so that unmatched stream IDs (i.e. devices
      not attached to an IOMMU domain) may be configured to fault.
      
      Rather than introduce unsightly inconsistency, or repeat the existing
      unnecessary use of module_param_named(), fix that as well in passing.
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      25a1c96c
    • R
      iommu/arm-smmu: Support DMA-API domains · 9adb9594
      Robin Murphy 提交于
      With DMA mapping ops provided by the iommu-dma code, only a minimal
      contribution from the IOMMU driver is needed to create a suitable
      DMA-API domain for them to use. Implement this for the ARM SMMUs.
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      9adb9594
    • R
      iommu/arm-smmu: Treat all device transactions as unprivileged · d346180e
      Robin Murphy 提交于
      The IOMMU API has no concept of privilege so assumes all devices and
      mappings are equal, and indeed most non-CPU master devices on an AMBA
      interconnect make little use of the attribute bits on the bus thus by
      default perform unprivileged data accesses.
      
      Some devices, however, believe themselves more equal than others, such
      as programmable DMA controllers whose 'master' thread issues bus
      transactions marked as privileged instruction fetches, while the data
      accesses of its channel threads (under the control of Linux, at least)
      are marked as unprivileged. This poses a problem for implementing the
      DMA API on an IOMMU conforming to ARM VMSAv8, under which a page that is
      unprivileged-writeable is also implicitly privileged-execute-never.
      Given that, there is no one set of attributes with which iommu_map() can
      implement, say, dma_alloc_coherent() that will allow every possible type
      of access without something running into unexecepted permission faults.
      
      Fortunately the SMMU architecture provides a means to mitigate such
      issues by overriding the incoming attributes of a transaction; make use
      of that to strip the privileged/unprivileged status off incoming
      transactions, leaving just the instruction/data dichotomy which the
      IOMMU API does at least understand; Four states good, two states better.
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      d346180e
  11. 17 12月, 2015 4 次提交
    • R
      iommu/arm-smmu: Invalidate TLBs properly · 75df1386
      Robin Murphy 提交于
      When invalidating an IOVA range potentially spanning multiple pages,
      such as when removing an entire intermediate-level table, we currently
      only issue an invalidation for the first IOVA of that range. Since the
      architecture specifies that address-based TLB maintenance operations
      target a single entry, an SMMU could feasibly retain live entries for
      subsequent pages within that unmapped range, which is not good.
      
      Make sure we hit every possible entry by iterating over the whole range
      at the granularity provided by the pagetable implementation.
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      [will: added missing semicolons...]
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      75df1386
    • R
      iommu/io-pgtable: Indicate granule for TLB maintenance · 06c610e8
      Robin Murphy 提交于
      IOMMU hardware with range-based TLB maintenance commands can work
      happily with the iova and size arguments passed via the tlb_add_flush
      callback, but for IOMMUs which require separate commands per entry in
      the range, it is not straightforward to infer the necessary granularity
      when it comes to issuing the actual commands.
      
      Add an additional argument indicating the granularity for the benefit
      of drivers needing to know, and update the ARM LPAE code appropriately
      (for non-leaf invalidations we currently just assume the worst-case
      page granularity rather than walking the table to check).
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      06c610e8
    • P
      iommu/arm-smmu: Correct group reference count · 9a4a9d8c
      Peng Fan 提交于
      The basic flow for add a device:
       arm_smmu_add_device
              |->iommu_group_get_for_dev
                  |->iommu_group_get
                           return group;  (1)
                  |->ops->device_group : Init/increase reference count to/by 1.
                  |->iommu_group_add_device : Increase reference count by 1.
      		     return group   (2)
              |->return 0;
      
      Since we are adding one device, the flow is (2) and the group reference
      count will be increased by 2. So, we need to add iommu_group_put at the
      end of arm_smmu_add_device to decrease the count by 1.
      
      Also take the failure path into consideration when fail to add a device.
      Signed-off-by: NPeng Fan <van.freenix@gmail.com>
      Cc: Will Deacon <will.deacon@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      9a4a9d8c
    • M
      iommu/arm-smmu: Delete an unnecessary check before free_io_pgtable_ops() · 44830b0c
      Markus Elfring 提交于
      The free_io_pgtable_ops() function tests whether its argument is NULL
      and then returns immediately. Thus the test around the call is not needed.
      
      This issue was detected by using the Coccinelle software.
      Signed-off-by: NMarkus Elfring <elfring@users.sourceforge.net>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      44830b0c
  12. 22 10月, 2015 1 次提交
  13. 15 10月, 2015 1 次提交
  14. 14 10月, 2015 2 次提交
  15. 06 8月, 2015 2 次提交
  16. 31 7月, 2015 1 次提交
    • R
      iommu/arm-smmu: Sort out coherency · bae2c2d4
      Robin Murphy 提交于
      Currently, we detect whether the SMMU has coherent page table walk
      capability from the IDR0.CTTW field, and base our cache maintenance
      decisions on that. In preparation for fixing the bogus DMA API usage,
      however, we need to ensure that the DMA API agrees about this, which
      necessitates deferring to the dma-coherent property in the device tree
      for the final say.
      
      As an added bonus, since systems exist where an external CTTW signal
      has been tied off incorrectly at integration, allowing DT to override
      it offers a neat workaround for coherency issues with such SMMUs.
      Signed-off-by: NRobin Murphy <robin.murphy@arm.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      bae2c2d4
  17. 30 6月, 2015 1 次提交
  18. 29 5月, 2015 2 次提交
  19. 12 5月, 2015 1 次提交
    • W
      iommu/arm-smmu: Fix sign-extension of upstream bus addresses at stage 1 · 5dc5616e
      Will Deacon 提交于
      Stage 1 translation is controlled by two sets of page tables (TTBR0 and
      TTBR1) which grow up and down from zero respectively in the ARMv8
      translation regime. For the SMMU, we only care about TTBR0 and, in the
      case of a 48-bit virtual space, we expect to map virtual addresses 0x0
      through to 0xffff_ffff_ffff.
      
      Given that some masters may be incapable of emitting virtual addresses
      targetting TTBR1 (e.g. because they sit on a 48-bit bus), the SMMU
      architecture allows bit 47 to be sign-extended, halving the virtual
      range of TTBR0 but allowing TTBR1 to be used. This is controlled by the
      SEP field in TTBCR2.
      
      The SMMU driver incorrectly enables this sign-extension feature, which
      causes problems when userspace addresses are programmed into a master
      device with the SMMU expecting to map the incoming transactions via
      TTBR0; if the top bit of address is set, we will instead get a
      translation fault since TTBR1 walks are disabled in the TTBCR.
      
      This patch fixes the issue by disabling sign-extension of a fixed
      virtual address bit and instead basing the behaviour on the upstream bus
      size: the incoming address is zero extended unless the upstream bus is
      only 49 bits wide, in which case bit 48 is used as the sign bit and is
      replicated to the upper bits.
      
      Cc: <stable@vger.kernel.org> # v4.0+
      Reported-by: NVarun Sethi <varun.sethi@freescale.com>
      Signed-off-by: NWill Deacon <will.deacon@arm.com>
      Signed-off-by: NJoerg Roedel <jroedel@suse.de>
      5dc5616e
  20. 31 3月, 2015 1 次提交