PCI: Enable PASID only if entire path supports End-End TLP prefixes
authorSinan Kaya <okaya@codeaurora.org>
Sat, 30 Jun 2018 15:24:24 +0000 (11:24 -0400)
committerBjorn Helgaas <bhelgaas@google.com>
Sat, 30 Jun 2018 19:10:03 +0000 (14:10 -0500)
commit7ce3f912ae0a79e5d738a3ae1f158b281973e849
tree69c2b3d22573fa0a3567e4c3e093fc1fb70d7965
parentce397d215ccd07b8ae3f71db689aedb85d56ab40
PCI: Enable PASID only if entire path supports End-End TLP prefixes

A PCIe endpoint carries the process address space identifier (PASID) in
the TLP prefix as part of the memory read/write transaction. The address
information in the TLP is relevant only for a given PASID context.

An IOMMU takes PASID value and the address information from the
TLP to look up the physical address in the system.

PASID is an End-End TLP Prefix (PCIe r4.0, sec 6.20).  Sec 2.2.10.2 says

  It is an error to receive a TLP with an End-End TLP Prefix by a
  Receiver that does not support End-End TLP Prefixes. A TLP in
  violation of this rule is handled as a Malformed TLP. This is a
  reported error associated with the Receiving Port (see Section 6.2).

Prevent error condition by proactively requiring End-End TLP prefix to be
supported on the entire data path between the endpoint and the root port
before enabling PASID.

Signed-off-by: Sinan Kaya <okaya@codeaurora.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/ats.c
drivers/pci/probe.c
include/linux/pci.h
include/uapi/linux/pci_regs.h