From c9c681521fb05dbcd592c532e957c4164c1b3585 Mon Sep 17 00:00:00 2001 From: Gavin Shan Date: Mon, 19 Jun 2017 16:46:49 +1000 Subject: [PATCH] core/pci: Check PCIe cap version in pci_disable_completion_timeout() When the PCIe capability version is less than 2, the completion timeout isn't supported and no need to disable it at all. Signed-off-by: Gavin Shan Signed-off-by: Oliver O'Halloran --- core/pci.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/core/pci.c b/core/pci.c index 66828313a83d..f74d7163ff99 100644 --- a/core/pci.c +++ b/core/pci.c @@ -927,15 +927,21 @@ static int pci_configure_mps(struct phb *phb, static void pci_disable_completion_timeout(struct phb *phb, struct pci_device *pd) { - uint32_t ecap; - uint32_t val; + uint32_t ecap, val; + uint16_t pcie_cap; /* PCIE capability required */ if (!pci_has_cap(pd, PCI_CFG_CAP_ID_EXP, false)) return; - /* Check if it has capability to disable completion timeout */ + /* Check PCIe capability version */ ecap = pci_cap(pd, PCI_CFG_CAP_ID_EXP, false); + pci_cfg_read16(phb, pd->bdfn, + ecap + PCICAP_EXP_CAPABILITY_REG, &pcie_cap); + if ((pcie_cap & PCICAP_EXP_CAP_VERSION) <= 1) + return; + + /* Check if it has capability to disable completion timeout */ pci_cfg_read32(phb, pd->bdfn, ecap + PCIECAP_EXP_DCAP2, &val); if (!(val & PCICAP_EXP_DCAP2_CMPTOUT_DIS)) return;