Skip to content

Commit c0c1262

Browse files
committed
PCI: Add PCIe Device 3 Extended Capability enumeration
PCIe r7.0 Section 7.7.9 Device 3 Extended Capability Structure, defines the canonical location for determining the Flit Mode of a device. This status is a dependency for PCIe IDE enabling. Add a new fm_enabled flag to 'struct pci_dev'. Cc: Lukas Wunner <lukas@wunner.de> Cc: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Cc: Bjorn Helgaas <bhelgaas@google.com> Cc: Samuel Ortiz <sameo@rivosinc.com> Cc: Alexey Kardashevskiy <aik@amd.com> Cc: Xu Yilun <yilun.xu@linux.intel.com> Acked-by: Bjorn Helgaas <bhelgaas@google.com> Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com> Link: https://patch.msgid.link/20251031212902.2256310-6-dan.j.williams@intel.com Signed-off-by: Dan Williams <dan.j.williams@intel.com>
1 parent 3225f52 commit c0c1262

3 files changed

Lines changed: 20 additions & 0 deletions

File tree

drivers/pci/probe.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2283,6 +2283,17 @@ int pci_configure_extended_tags(struct pci_dev *dev, void *ign)
22832283
return 0;
22842284
}
22852285

2286+
static void pci_dev3_init(struct pci_dev *pdev)
2287+
{
2288+
u16 cap = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_DEV3);
2289+
u32 val = 0;
2290+
2291+
if (!cap)
2292+
return;
2293+
pci_read_config_dword(pdev, cap + PCI_DEV3_STA, &val);
2294+
pdev->fm_enabled = !!(val & PCI_DEV3_STA_SEGMENT);
2295+
}
2296+
22862297
/**
22872298
* pcie_relaxed_ordering_enabled - Probe for PCIe relaxed ordering enable
22882299
* @dev: PCI device to query
@@ -2667,6 +2678,7 @@ static void pci_init_capabilities(struct pci_dev *dev)
26672678
pci_doe_init(dev); /* Data Object Exchange */
26682679
pci_tph_init(dev); /* TLP Processing Hints */
26692680
pci_rebar_init(dev); /* Resizable BAR */
2681+
pci_dev3_init(dev); /* Device 3 capabilities */
26702682
pci_ide_init(dev); /* Link Integrity and Data Encryption */
26712683

26722684
pcie_report_downtraining(dev);

include/linux/pci.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,7 @@ struct pci_dev {
450450
unsigned int pasid_enabled:1; /* Process Address Space ID */
451451
unsigned int pri_enabled:1; /* Page Request Interface */
452452
unsigned int tph_enabled:1; /* TLP Processing Hints */
453+
unsigned int fm_enabled:1; /* Flit Mode (segment captured) */
453454
unsigned int is_managed:1; /* Managed via devres */
454455
unsigned int is_msi_managed:1; /* MSI release via devres installed */
455456
unsigned int needs_freset:1; /* Requires fundamental reset */

include/uapi/linux/pci_regs.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -755,6 +755,7 @@
755755
#define PCI_EXT_CAP_ID_NPEM 0x29 /* Native PCIe Enclosure Management */
756756
#define PCI_EXT_CAP_ID_PL_32GT 0x2A /* Physical Layer 32.0 GT/s */
757757
#define PCI_EXT_CAP_ID_DOE 0x2E /* Data Object Exchange */
758+
#define PCI_EXT_CAP_ID_DEV3 0x2F /* Device 3 Capability/Control/Status */
758759
#define PCI_EXT_CAP_ID_IDE 0x30 /* Integrity and Data Encryption */
759760
#define PCI_EXT_CAP_ID_PL_64GT 0x31 /* Physical Layer 64.0 GT/s */
760761
#define PCI_EXT_CAP_ID_MAX PCI_EXT_CAP_ID_PL_64GT
@@ -1246,6 +1247,12 @@
12461247
/* Deprecated old name, replaced with PCI_DOE_DATA_OBJECT_DISC_RSP_3_TYPE */
12471248
#define PCI_DOE_DATA_OBJECT_DISC_RSP_3_PROTOCOL PCI_DOE_DATA_OBJECT_DISC_RSP_3_TYPE
12481249

1250+
/* Device 3 Extended Capability */
1251+
#define PCI_DEV3_CAP 0x04 /* Device 3 Capabilities Register */
1252+
#define PCI_DEV3_CTL 0x08 /* Device 3 Control Register */
1253+
#define PCI_DEV3_STA 0x0c /* Device 3 Status Register */
1254+
#define PCI_DEV3_STA_SEGMENT 0x8 /* Segment Captured (end-to-end flit-mode detected) */
1255+
12491256
/* Compute Express Link (CXL r3.1, sec 8.1.5) */
12501257
#define PCI_DVSEC_CXL_PORT 3
12511258
#define PCI_DVSEC_CXL_PORT_CTL 0x0c

0 commit comments

Comments
 (0)