Re: [PATCH] PCI/ASPM: Mask ASPM states based on Devicetree properties
Krishna Chaitanya Chundru <[email protected]> Mon, 1 Jun 2026 09:06:03 +0530
| Newsgroups | dev.linux.lists.sashiko,org.kernel.vger.linux-pci |
|---|---|
| Message-ID | <[email protected]> |
On 5/12/2026 3:56 PM, Krishna Chaitanya Chundru wrote: > > On 5/12/2026 6:16 AM, [email protected] wrote: >> Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider: >> - [High] Modifying `link->aspm_support` bypasses `pcie_config_aspm_l1ss()`, failing to disable ASPM L1 Substates in hardware if the bootloader previously enabled them. >> - [Medium] The `aspm-no-l1` override only masks `PCIE_LINK_STATE_L1` from `link->aspm_support`, failing to mask the functionally dependent L1 PM Substates (`PCIE_LINK_STATE_L1SS`), leading to sysfs inconsistency. >> -- >> >> commit 3739505256d4ced724de1faf6f3f111a9994fa59 >> Author: Krishna Chaitanya Chundru <[email protected]> >> >> PCI/ASPM: Mask ASPM states based on Devicetree properties >> >> This commit updates ASPM link initialization to check for aspm-no-l0s, >> aspm-no-l1, and aspm-no-l1ss Devicetree properties. It masks the >> corresponding ASPM states from link->aspm_support before applying the >> default ASPM policy. >> >> Link: https://github.com/devicetree-org/dt-schema/pull/188 >> Link: https://github.com/devicetree-org/dt-schema/pull/190 >> >>> diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c >>> index 925373b98dff0..3111ef7fd226e 100644 >>> --- a/drivers/pci/pcie/aspm.c >>> +++ b/drivers/pci/pcie/aspm.c >> [ ... ] >> >>> @@ -806,6 +813,15 @@ static void pcie_aspm_override_default_link_state(struct pcie_link_state *link) >>> >>> /* For devicetree platforms, enable L0s and L1 by default */ >>> if (of_have_populated_dt()) { >>> + if (pcie_link_has_aspm_override(link, "aspm-no-l0s")) >>> + link->aspm_support &= ~PCIE_LINK_STATE_L0S; >>> + >>> + if (pcie_link_has_aspm_override(link, "aspm-no-l1")) >>> + link->aspm_support &= ~PCIE_LINK_STATE_L1; >> Should this also clear PCIE_LINK_STATE_L1SS? >> >> If we clear only PCIE_LINK_STATE_L1, link->aspm_capable will retain the >> L1SS bits while dropping the L1 bit. The sysfs visibility check in >> aspm_ctrl_attrs_are_visible() relies on aspm_capable, which means the main >> L1 control attribute will be hidden, but the L1.1 and L1.2 substate >> attributes will be incorrectly exposed. >> >> Any userspace attempts to enable these exposed L1SS attributes via sysfs >> will silently fail, as pcie_config_aspm_link() enforces: >> >> if (!(state & PCIE_LINK_STATE_L1)) >> state &= ~PCIE_LINK_STATE_L1SS; > ack >>> + >>> + if (pcie_link_has_aspm_override(link, "aspm-no-l1ss")) >>> + link->aspm_support &= ~PCIE_LINK_STATE_L1SS; >> Will modifying link->aspm_support here bypass disabling ASPM L1 Substates >> in hardware if the bootloader previously enabled them? >> >> By clearing bits from link->aspm_support, the changes propagate to >> link->aspm_capable. Later, when the kernel applies the ASPM policy in >> pcie_config_aspm_link(), the hardware update for L1SS is guarded by: >> >> if (link->aspm_capable & PCIE_LINK_STATE_L1SS) >> >> Because the capability bit was cleared by the DT override, the kernel skips >> calling pcie_config_aspm_l1ss() entirely, leaving the hardware actively >> using L1SS if the firmware or bootloader had enabled it. >> >> Would setting bits in link->aspm_disable instead (similar to >> pci_disable_link_state()) correctly disable these states in hardware >> while keeping aspm_capable intact? > we can't keep aspm_capable intact as this can expose l1ss capability to sysfs > as pointed > by you in the above, I will do like below, > if (pcie_link_has_aspm_override(link, "aspm-no-l1ss")) { > /* > * Clear L1SS in hardware before updating aspm_support. Once > * aspm_capable is derived from aspm_support, pcie_config_aspm_link() > * skips pcie_config_aspm_l1ss() entirely via the aspm_capable guard, > * leaving firmware-enabled L1SS substates active in hardware. > */ > if (link->aspm_support & PCIE_LINK_STATE_L1SS) > pcie_config_aspm_l1ss(link, 0); > link->aspm_support &= ~PCIE_LINK_STATE_L1SS; > } > > Bjorn, > can you share your taught's on this. Hi Bjorn, Can you please share your opinion on this. - Krishna Chaitanya. > > - Krishna Chaitanya. >>> + >>> if (link->aspm_support & PCIE_LINK_STATE_L0S) >>> link->aspm_default |= PCIE_LINK_STATE_L0S; >>> if (link->aspm_support & PCIE_LINK_STATE_L1)