mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
PCI/ASPM: Use pcie_capability_clear_and_set_word() for ASPM disable/restore
pcie_aspm_cap_init() disables ASPM L0s/L1 on both ends of the Link
before touching L1SS config, then later restores the LNKCTL state
that was in effect beforehand. Both steps use raw
pcie_capability_write_word() calls: the disable step computes the
new value by hand from a snapshot taken earlier in the function, and
the restore step writes that same snapshot straight back.
Switch both steps to pcie_capability_clear_and_set_word(), masked to
PCI_EXP_LNKCTL_ASPMC, matching the accessor pcie_config_aspm_dev()
already uses elsewhere in this file for the exact same register. This
does a live read-modify-write of just the ASPM Control bits instead of
relying on a stale snapshot for the rest of the word, and is
consistent with how the rest of the file already touches this
register. No functional change.
Fixes: 7447990137 ("PCI/ASPM: Disable L1 before disabling L1 PM Substates")
Closes: https://lore.kernel.org/all/20260721143945.86E7D1F000E9@smtp.kernel.org/
Signed-off-by: Krishna Chaitanya Chundru <krishna.chundru@oss.qualcomm.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Manivannan Sadhasivam <mani@kernel.org>
Link: https://patch.msgid.link/20260727-aspm-v6-1-2ebb3ee7ef71@oss.qualcomm.com
This commit is contained in:
parent
ec3d987fca
commit
75a3b50ad9
|
|
@ -894,10 +894,10 @@ static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist)
|
|||
/* Disable L0s/L1 before updating L1SS config */
|
||||
if (FIELD_GET(PCI_EXP_LNKCTL_ASPMC, child_lnkctl) ||
|
||||
FIELD_GET(PCI_EXP_LNKCTL_ASPMC, parent_lnkctl)) {
|
||||
pcie_capability_write_word(child, PCI_EXP_LNKCTL,
|
||||
child_lnkctl & ~PCI_EXP_LNKCTL_ASPMC);
|
||||
pcie_capability_write_word(parent, PCI_EXP_LNKCTL,
|
||||
parent_lnkctl & ~PCI_EXP_LNKCTL_ASPMC);
|
||||
pcie_capability_clear_and_set_word(child, PCI_EXP_LNKCTL,
|
||||
PCI_EXP_LNKCTL_ASPMC, 0);
|
||||
pcie_capability_clear_and_set_word(parent, PCI_EXP_LNKCTL,
|
||||
PCI_EXP_LNKCTL_ASPMC, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -927,8 +927,12 @@ static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist)
|
|||
/* Restore L0s/L1 if they were enabled */
|
||||
if (FIELD_GET(PCI_EXP_LNKCTL_ASPMC, child_lnkctl) ||
|
||||
FIELD_GET(PCI_EXP_LNKCTL_ASPMC, parent_lnkctl)) {
|
||||
pcie_capability_write_word(parent, PCI_EXP_LNKCTL, parent_lnkctl);
|
||||
pcie_capability_write_word(child, PCI_EXP_LNKCTL, child_lnkctl);
|
||||
pcie_capability_clear_and_set_word(parent, PCI_EXP_LNKCTL,
|
||||
PCI_EXP_LNKCTL_ASPMC,
|
||||
parent_lnkctl & PCI_EXP_LNKCTL_ASPMC);
|
||||
pcie_capability_clear_and_set_word(child, PCI_EXP_LNKCTL,
|
||||
PCI_EXP_LNKCTL_ASPMC,
|
||||
child_lnkctl & PCI_EXP_LNKCTL_ASPMC);
|
||||
}
|
||||
|
||||
/* Save default state */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user