]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commitdiff
PCI/TPH: Allow TPH enable for RCiEPs
authorGeorge Abraham P <george.abraham.p@intel.com>
Fri, 9 Jan 2026 05:29:23 +0000 (10:59 +0530)
committerBjorn Helgaas <bhelgaas@google.com>
Mon, 23 Feb 2026 15:01:03 +0000 (09:01 -0600)
Previously, pcie_enable_tph() only enabled TLP Processing Hints (TPH) if
both the Endpoint and its Root Port advertised TPH support.

Root Complex Integrated Endpoints (RCiEPs) are directly integrated into a
Root Complex and do not have an associated Root Port, so pcie_enable_tph()
never enabled TPH for RCiEPs.

PCIe r7.0 doesn't seem to include a way to learn whether a Root Complex
supports TPH, but sec 2.2.7.1.1 says Functions that lack TPH support should
ignore TPH, and maybe the same is true for Root Complexes:

  A Function that does not support the TPH Completer or Routing capability
  and receives a transaction with the TH bit [which indicates the presence
  of TPH in the TLP header] Set is required to ignore the TH bit and handle
  the Request in the same way as Requests of the same transaction type
  without the TH bit Set.

Allow drivers to enable TPH for any RCiEP with a TPH Requester Capability.

Fixes: f69767a1ada3 ("PCI: Add TLP Processing Hints (TPH) support")
Signed-off-by: George Abraham P <george.abraham.p@intel.com>
[bhelgaas: commit log]
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://patch.msgid.link/20260109052923.1170070-1-george.abraham.p@intel.com
drivers/pci/tph.c

index ca4f97be75389d8e2c52eeb511fab266e075a63b..e896b395828185556070f2bb1089ab1cf02d6b27 100644 (file)
@@ -407,10 +407,13 @@ int pcie_enable_tph(struct pci_dev *pdev, int mode)
        else
                pdev->tph_req_type = PCI_TPH_REQ_TPH_ONLY;
 
-       rp_req_type = get_rp_completer_type(pdev);
+       /* Check if the device is behind a Root Port */
+       if (pci_pcie_type(pdev) != PCI_EXP_TYPE_RC_END) {
+               rp_req_type = get_rp_completer_type(pdev);
 
-       /* Final req_type is the smallest value of two */
-       pdev->tph_req_type = min(pdev->tph_req_type, rp_req_type);
+               /* Final req_type is the smallest value of two */
+               pdev->tph_req_type = min(pdev->tph_req_type, rp_req_type);
+       }
 
        if (pdev->tph_req_type == PCI_TPH_REQ_DISABLE)
                return -EINVAL;