Skip to content

Commit 511c093

Browse files
georgeabpgregkh
authored andcommitted
PCI/TPH: Allow TPH enable for RCiEPs
[ Upstream commit d3e996a ] 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: f69767a ("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 Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent e14de2c commit 511c093

1 file changed

Lines changed: 6 additions & 3 deletions

File tree

drivers/pci/tph.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -397,10 +397,13 @@ int pcie_enable_tph(struct pci_dev *pdev, int mode)
397397
else
398398
pdev->tph_req_type = PCI_TPH_REQ_TPH_ONLY;
399399

400-
rp_req_type = get_rp_completer_type(pdev);
400+
/* Check if the device is behind a Root Port */
401+
if (pci_pcie_type(pdev) != PCI_EXP_TYPE_RC_END) {
402+
rp_req_type = get_rp_completer_type(pdev);
401403

402-
/* Final req_type is the smallest value of two */
403-
pdev->tph_req_type = min(pdev->tph_req_type, rp_req_type);
404+
/* Final req_type is the smallest value of two */
405+
pdev->tph_req_type = min(pdev->tph_req_type, rp_req_type);
406+
}
404407

405408
if (pdev->tph_req_type == PCI_TPH_REQ_DISABLE)
406409
return -EINVAL;

0 commit comments

Comments
 (0)