diff options
author | Bjorn Helgaas <bhelgaas@google.com> | 2022-10-05 05:58:08 +0300 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2022-10-05 20:11:56 +0300 |
commit | cfc0028627cadfa271fab0290f18731193d63d87 (patch) | |
tree | 538fcbf073e7c0919c2c81898c2b8836ee6ebfa9 /drivers/pci | |
parent | 9e2a03173d1b4544c1113059e61e3caa7ce5e3a4 (diff) | |
download | linux-cfc0028627cadfa271fab0290f18731193d63d87.tar.xz |
PCI/ASPM: Ignore L1 PM Substates if device lacks capability
187f91db8237 ("PCI/ASPM: Remove struct aspm_register_info.l1ss_cap")
inadvertently removed a check for existence of the L1 PM Substates (L1SS)
Capability before reading it.
If there is no L1SS Capability, this means we mistakenly read PCI_COMMAND
and PCI_STATUS (config address 0x04) and interpret that as the PCI_L1SS_CAP
register, so we may incorrectly configure L1SS.
Make sure the L1SS Capability exists before trying to read it.
Fixes: 187f91db8237 ("PCI/ASPM: Remove struct aspm_register_info.l1ss_cap")
Link: https://lore.kernel.org/r/20221005025809.2247547-3-helgaas@kernel.org
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/pcie/aspm.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index 4535228e4a64..f12d117f44e0 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c @@ -560,6 +560,9 @@ static void aspm_l1ss_init(struct pcie_link_state *link) u32 parent_l1ss_cap, child_l1ss_cap; u32 parent_l1ss_ctl1 = 0, child_l1ss_ctl1 = 0; + if (!parent->l1ss || !child->l1ss) + return; + /* Setup L1 substate */ pci_read_config_dword(parent, parent->l1ss + PCI_L1SS_CAP, &parent_l1ss_cap); |