Skip to content

Commit f9538e2

Browse files
committed
Merge branch 'pci/dpc'
- Work around a BIOS defect that makes some Intel Root Ports report an RP PIO log size of zero (Mika Westerberg) * pci/dpc: PCI/DPC: Quirk PIO log size for certain Intel Root Ports
2 parents c1c2d89 + 5459c0b commit f9538e2

File tree

2 files changed

+46
-5
lines changed

2 files changed

+46
-5
lines changed

drivers/pci/pcie/dpc.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -335,11 +335,16 @@ void pci_dpc_init(struct pci_dev *pdev)
335335
return;
336336

337337
pdev->dpc_rp_extensions = true;
338-
pdev->dpc_rp_log_size = (cap & PCI_EXP_DPC_RP_PIO_LOG_SIZE) >> 8;
339-
if (pdev->dpc_rp_log_size < 4 || pdev->dpc_rp_log_size > 9) {
340-
pci_err(pdev, "RP PIO log size %u is invalid\n",
341-
pdev->dpc_rp_log_size);
342-
pdev->dpc_rp_log_size = 0;
338+
339+
/* Quirks may set dpc_rp_log_size if device or firmware is buggy */
340+
if (!pdev->dpc_rp_log_size) {
341+
pdev->dpc_rp_log_size =
342+
(cap & PCI_EXP_DPC_RP_PIO_LOG_SIZE) >> 8;
343+
if (pdev->dpc_rp_log_size < 4 || pdev->dpc_rp_log_size > 9) {
344+
pci_err(pdev, "RP PIO log size %u is invalid\n",
345+
pdev->dpc_rp_log_size);
346+
pdev->dpc_rp_log_size = 0;
347+
}
343348
}
344349
}
345350

drivers/pci/quirks.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5956,3 +5956,39 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x56b1, aspm_l1_acceptable_latency
59565956
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x56c0, aspm_l1_acceptable_latency);
59575957
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x56c1, aspm_l1_acceptable_latency);
59585958
#endif
5959+
5960+
#ifdef CONFIG_PCIE_DPC
5961+
/*
5962+
* Intel Tiger Lake and Alder Lake BIOS has a bug that clears the DPC
5963+
* RP PIO Log Size of the integrated Thunderbolt PCIe Root Ports.
5964+
*/
5965+
static void dpc_log_size(struct pci_dev *dev)
5966+
{
5967+
u16 dpc, val;
5968+
5969+
dpc = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_DPC);
5970+
if (!dpc)
5971+
return;
5972+
5973+
pci_read_config_word(dev, dpc + PCI_EXP_DPC_CAP, &val);
5974+
if (!(val & PCI_EXP_DPC_CAP_RP_EXT))
5975+
return;
5976+
5977+
if (!((val & PCI_EXP_DPC_RP_PIO_LOG_SIZE) >> 8)) {
5978+
pci_info(dev, "Overriding RP PIO Log Size to 4\n");
5979+
dev->dpc_rp_log_size = 4;
5980+
}
5981+
}
5982+
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x461f, dpc_log_size);
5983+
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x462f, dpc_log_size);
5984+
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x463f, dpc_log_size);
5985+
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x466e, dpc_log_size);
5986+
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x9a23, dpc_log_size);
5987+
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x9a25, dpc_log_size);
5988+
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x9a27, dpc_log_size);
5989+
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x9a29, dpc_log_size);
5990+
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x9a2b, dpc_log_size);
5991+
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x9a2d, dpc_log_size);
5992+
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x9a2f, dpc_log_size);
5993+
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x9a31, dpc_log_size);
5994+
#endif

0 commit comments

Comments
 (0)