Messages in this thread | | | Date | Thu, 19 Jan 2023 20:01:37 +0100 | Subject | Re: [PATCH V1] PCI/ASPM: Skip L1SS save/restore if not already enabled | From | "Wysocki, Rafael J" <> |
| |
On 1/19/2023 3:21 PM, Kai-Heng Feng wrote: > Hi Vidya, > > On Thu, Jan 19, 2023 at 5:49 PM Vidya Sagar <vidyas@nvidia.com> wrote: >> Skip save and restore of ASPM L1 Sub-States specific registers if they >> are not already enabled in the system. This is to avoid issues observed >> on certain platforms during restoration process, particularly when >> restoring the L1SS registers contents. >> >> BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=216782 >> Signed-off-by: Vidya Sagar <vidyas@nvidia.com> >> --- >> drivers/pci/pcie/aspm.c | 19 ++++++++++++++++++- >> 1 file changed, 18 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c >> index 53a1fa306e1e..5d3f09b0a6a9 100644 >> --- a/drivers/pci/pcie/aspm.c >> +++ b/drivers/pci/pcie/aspm.c >> @@ -757,15 +757,29 @@ static void pcie_config_aspm_l1ss(struct pcie_link_state *link, u32 state) >> PCI_L1SS_CTL1_L1SS_MASK, val); >> } >> >> +static bool skip_l1ss_restore; > Maybe move it inside "struct pci_dev"?
Yes, it can be different for different devices, so it cannot be static IMV.
>> + >> void pci_save_aspm_l1ss_state(struct pci_dev *dev) >> { >> struct pci_cap_saved_state *save_state; >> u16 l1ss = dev->l1ss; >> - u32 *cap; >> + u32 *cap, val; >> >> if (!l1ss) >> return; >> >> + /* >> + * Skip save and restore of L1 Sub-States registers if they are not >> + * already enabled in the system >> + */ >> + pci_read_config_dword(dev, l1ss + PCI_L1SS_CTL1, &val); >> + if (!(val & PCI_L1SS_CTL1_L1SS_MASK)) { >> + skip_l1ss_restore = 1; >> + return; >> + } >> + >> + skip_l1ss_restore = 0; >> + >> save_state = pci_find_saved_ext_cap(dev, PCI_EXT_CAP_ID_L1SS); >> if (!save_state) >> return; >> @@ -784,6 +798,9 @@ void pci_restore_aspm_l1ss_state(struct pci_dev *dev) >> if (!l1ss) >> return; >> >> + if (skip_l1ss_restore) >> + return; >> + >> save_state = pci_find_saved_ext_cap(dev, PCI_EXT_CAP_ID_L1SS); >> if (!save_state) >> return; >> -- >> 2.17.1 >>
| |