16 Jan, 2020

1 commit

  • The SMMUv3 driver, which may be built without CONFIG_PCI, will soon gain
    PASID support. Partially revert commit c6e9aefbf9db ("PCI/ATS: Remove
    unused PRI and PASID stubs") to re-introduce the PASID stubs, and avoid
    adding more #ifdefs to the SMMU driver.

    Acked-by: Bjorn Helgaas
    Reviewed-by: Eric Auger
    Reviewed-by: Jonathan Cameron
    Signed-off-by: Jean-Philippe Brucker
    Signed-off-by: Will Deacon

    Jean-Philippe Brucker
     

16 Oct, 2019

4 commits

  • These interfaces:

    void pci_restore_pri_state(struct pci_dev *pdev);
    void pci_restore_pasid_state(struct pci_dev *pdev);

    are only used in drivers/pci and do not need to be seen by the rest of the
    kernel. Most them to drivers/pci/pci.h so they're private to the PCI
    subsystem.

    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Joerg Roedel

    Bjorn Helgaas
     
  • The following functions are only used by amd_iommu.c and intel-iommu.c
    (when CONFIG_INTEL_IOMMU_SVM is enabled). CONFIG_PCI_PRI and
    CONFIG_PCI_PASID are always defined in those cases, so there's no need for
    the stubs.

    pci_enable_pri()
    pci_disable_pri()
    pci_reset_pri()
    pci_prg_resp_pasid_required()
    pci_enable_pasid()
    pci_disable_pasid()

    Remove the unused stubs.

    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Kuppuswamy Sathyanarayanan
    Reviewed-by: Joerg Roedel

    Bjorn Helgaas
     
  • Move ATS function prototypes from include/linux/pci.h to
    include/linux/pci-ats.h as the ATS, PRI, and PASID interfaces are related
    and are used only by the IOMMU drivers. This effectively reverts
    ff9bee895c4d ("PCI: Move ATS declarations to linux/pci.h so they're all
    together").

    Also, remove surplus forward declaration of struct pci_ats from
    include/linux/pci.h, as it is no longer needed, since struct pci_ats was
    embedded directly into struct pci_dev by d544d75ac96a ("PCI: Embed ATS info
    directly into struct pci_dev").

    No functional changes intended.

    Link: https://lore.kernel.org/r/20190914213032.22314-1-kw@linux.com
    Signed-off-by: Krzysztof Wilczynski
    Signed-off-by: Bjorn Helgaas

    Krzysztof Wilczynski
     
  • pci_prg_resp_pasid_required() returns the value of the "PRG Response PASID
    Required" bit from the PRI capability, but the interface was previously
    defined under #ifdef CONFIG_PCI_PASID.

    Move it from CONFIG_PCI_PASID to CONFIG_PCI_PRI so it's with the other
    PRI-related things.

    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Kuppuswamy Sathyanarayanan
    Reviewed-by: Joerg Roedel

    Bjorn Helgaas
     

28 Feb, 2019

1 commit


26 Feb, 2019

1 commit

  • Return the PRG Response PASID Required bit in the Page Request
    Status Register.

    As per PCIe spec r4.0, sec 10.5.2.3, if this bit is Set, the device
    expects a PASID TLP Prefix on PRG Response Messages when the
    corresponding Page Requests had a PASID TLP Prefix. If Clear, the device
    does not expect PASID TLP Prefixes on any PRG Response Message, and the
    device behavior is undefined if the device receives a PRG Response Message
    with a PASID TLP Prefix. Also the device behavior is undefined if this
    bit is Set and the device receives a PRG Response Message with no PASID TLP
    Prefix when the corresponding Page Requests had a PASID TLP Prefix.

    This function will be used by drivers like IOMMU, if it is required to
    check the status of the PRG Response PASID Required bit before enabling
    the PASID support of the device.

    Cc: Ashok Raj
    Cc: Jacob Pan
    Cc: Keith Busch
    Suggested-by: Ashok Raj
    Signed-off-by: Kuppuswamy Sathyanarayanan
    Acked-by: Bjorn Helgaas
    Signed-off-by: Joerg Roedel

    Kuppuswamy Sathyanarayanan
     

02 Nov, 2017

1 commit

  • Many source files in the tree are missing licensing information, which
    makes it harder for compliance tools to determine the correct license.

    By default all files without license information are under the default
    license of the kernel, which is GPL version 2.

    Update the files which contain no license information with the 'GPL-2.0'
    SPDX license identifier. The SPDX identifier is a legally binding
    shorthand, which can be used instead of the full boiler plate text.

    This patch is based on work done by Thomas Gleixner and Kate Stewart and
    Philippe Ombredanne.

    How this work was done:

    Patches were generated and checked against linux-4.14-rc6 for a subset of
    the use cases:
    - file had no licensing information it it.
    - file was a */uapi/* one with no licensing information in it,
    - file was a */uapi/* one with existing licensing information,

    Further patches will be generated in subsequent months to fix up cases
    where non-standard license headers were used, and references to license
    had to be inferred by heuristics based on keywords.

    The analysis to determine which SPDX License Identifier to be applied to
    a file was done in a spreadsheet of side by side results from of the
    output of two independent scanners (ScanCode & Windriver) producing SPDX
    tag:value files created by Philippe Ombredanne. Philippe prepared the
    base worksheet, and did an initial spot review of a few 1000 files.

    The 4.13 kernel was the starting point of the analysis with 60,537 files
    assessed. Kate Stewart did a file by file comparison of the scanner
    results in the spreadsheet to determine which SPDX license identifier(s)
    to be applied to the file. She confirmed any determination that was not
    immediately clear with lawyers working with the Linux Foundation.

    Criteria used to select files for SPDX license identifier tagging was:
    - Files considered eligible had to be source code files.
    - Make and config files were included as candidates if they contained >5
    lines of source
    - File already had some variant of a license header in it (even if
    Reviewed-by: Philippe Ombredanne
    Reviewed-by: Thomas Gleixner
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

31 May, 2017

1 commit

  • After a Function-Level Reset, PCI states need to be restored. Save PASID
    features and PRI reqs cached.

    [bhelgaas: search for capability only if PRI/PASID were enabled]
    Signed-off-by: CQ Tang
    Signed-off-by: Ashok Raj
    Signed-off-by: Bjorn Helgaas
    Cc: Joerg Roedel
    Cc: Jean-Phillipe Brucker
    Cc: David Woodhouse

    CQ Tang
     

14 Aug, 2015

3 commits

  • Move ATS declarations to linux/pci.h so they're all in one place.

    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Joerg Roedel

    Bjorn Helgaas
     
  • The pci_ats struct is small and will get smaller, so I don't think it's
    worth allocating it separately from the pci_dev struct.

    Embed the ATS fields directly into struct pci_dev.

    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Joerg Roedel

    Bjorn Helgaas
     
  • Previously, we allocated pci_ats structures when an IOMMU driver called
    pci_enable_ats(). An SR-IOV VF shares the STU setting with its PF, so when
    enabling ATS on the VF, we allocated a pci_ats struct for the PF if it
    didn't already have one. We held the sriov->lock to serialize threads
    concurrently enabling ATS on several VFS so only one would allocate the PF
    pci_ats.

    Gregor reported a deadlock here:

    pci_enable_sriov
    sriov_enable
    virtfn_add
    mutex_lock(dev->sriov->lock) # acquire sriov->lock
    pci_device_add
    device_add
    BUS_NOTIFY_ADD_DEVICE notifier chain
    iommu_bus_notifier
    amd_iommu_add_device # iommu_ops.add_device
    init_iommu_group
    iommu_group_get_for_dev
    iommu_group_add_device
    __iommu_attach_device
    amd_iommu_attach_device # iommu_ops.attach_device
    attach_device
    pci_enable_ats
    mutex_lock(dev->sriov->lock) # deadlock

    There's no reason to delay allocating the pci_ats struct, and if we
    allocate it for each device at enumeration-time, there's no need for
    locking in pci_enable_ats().

    Allocate pci_ats struct during enumeration, when we initialize other
    capabilities.

    Note that this implementation requires ATS to be enabled on the PF first,
    before on any of the VFs because the PF controls the STU for all the VFs.

    Link: http://permalink.gmane.org/gmane.linux.kernel.iommu/9433
    Reported-by: Gregor Dick
    Signed-off-by: Bjorn Helgaas
    Reviewed-by: Joerg Roedel

    Bjorn Helgaas
     

11 Jan, 2014

1 commit

  • My philosophy is unused code is dead code. And dead code is subject to bit
    rot and is a likely source of bugs. Use it or lose it.

    This reverts parts of c320b976d783 ("PCI: Add implementation for PRI
    capability"), removing these interfaces:

    pci_pri_enabled()
    pci_pri_stopped()
    pci_pri_status()

    [bhelgaas: split to separate patch]
    Signed-off-by: Stephen Hemminger
    Signed-off-by: Bjorn Helgaas
    CC: Joerg Roedel

    Stephen Hemminger
     

18 Apr, 2013

1 commit


01 Nov, 2011

1 commit

  • The ats and sroiv members of 'struct pci_dev' are required
    for the ATS code already, even without IOV support compiled
    in. So depend on ATS here. This is fine with PCI_IOV too
    because it selects PCI_ATS. Also the prototypes for ATS
    need to be available for PCI_ATS.

    Reported-by: Randy Dunlap
    Signed-off-by: Joerg Roedel
    Signed-off-by: Jesse Barnes

    Joerg Roedel
     

15 Oct, 2011

3 commits

  • Devices supporting Process Address Space Identifiers
    (PASIDs) can use an IOMMU to access multiple IO address
    spaces at the same time. A PCIe device indicates support for
    this feature by implementing the PASID capability. This
    patch adds support for the capability to the Linux kernel.

    Reviewed-by: Bjorn Helgaas
    Signed-off-by: Joerg Roedel
    Signed-off-by: Jesse Barnes

    Joerg Roedel
     
  • Implement the necessary functions to handle PRI capabilities
    on PCIe devices. With PRI devices behind an IOMMU can signal
    page fault conditions to software and recover from such
    faults.

    Reviewed-by: Bjorn Helgaas
    Signed-off-by: Joerg Roedel
    Signed-off-by: Jesse Barnes

    Joerg Roedel
     
  • ATS does not depend on IOV support, so move the code into
    its own file. This file will also include support for the
    PRI and PASID capabilities later.
    Also give ATS its own Kconfig variable to allow selecting it
    without IOV support.

    Reviewed-by: Bjorn Helgaas
    Signed-off-by: Joerg Roedel
    Signed-off-by: Jesse Barnes

    Joerg Roedel
     

11 Apr, 2011

1 commit

  • This patch moves the relevant declarations from the local
    header file in drivers/pci to a more accessible locations so
    that it can be used by the AMD IOMMU driver too.
    The file is named pci-ats.h because support for the PCI PRI
    capability will also be added there in a later patch-set.

    Signed-off-by: Joerg Roedel
    Acked-by: Jesse Barnes

    Joerg Roedel