From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BDB852BEFFD for ; Mon, 27 Jul 2026 14:02:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785160977; cv=none; b=PLNITYkRncZR8cgiirKTDgdvOkfmrtHN1xI58sQLqLuSX2/eDZT+uxiux/9aB/mby6TgB/xK+aJ3M+e1MkzoYzhGsxA2cwIWcCo7XPr2b/iG0W9B/BhzhTkWLq9XYI062w4gmI06TqjkmDpZOmfG95FjQEDK4mvHW8OK0dc976A= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785160977; c=relaxed/simple; bh=pmgBYe7iAmRlY8SfY9eVYYwGRt5Bedpxrsv54GlOtJw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mWKjj05pa+YZY8q+7W/I//vJdv8dK8PITtb9PLAKeP6ruyT5KfTbqpOsWgQ5NY1xD4LJmrCKHqBcYafhe9nHzdDtgXB3AKoBWE2/h8dhR5JBXfybco7V1BGl01e4kjmf+RS107NNUKq3qFgy6iEh5Lrji2Cbbs2jV3aEBD84hFc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=Z+PnfzkO; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=khBEBd3A; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="Z+PnfzkO"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="khBEBd3A" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66RDlrW03787465 for ; Mon, 27 Jul 2026 14:02:54 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= PJcPUXVAP0E34FWnaNgRvf9bFB9m/k58e5dArp3RdUk=; b=Z+PnfzkOVsiMS/xU 0zlzRNyRasFp6++MKEFkHuBbWl/XIVdKG86jzvFmfv1PgRTSHTWqF5Xi7kkGJd2a SywbjyWQH475tijX2y2VXAVw4AACH5DsL7E9eVy8hknOWzY5QzKBDGjWOlht/QVz fF3IPcTm4OfeehHdsUr9IpgfVC+nRGsPbxGyWgVEWH8755YtX8DTT8LCpbjZQ+GA afFIOI41syAFDht9UBTF2GYoGsBEiloIo+DkkzJjthPjiuQb/w05l06BOhP2P9r6 l1qikCiIIQIwBmhp6tuNvz4ioJcHg7Gxq25u+nS44qGzeHxOeIBSyC79Sk4f4UF+ dUgoKw== Received: from mail-pg1-f197.google.com (mail-pg1-f197.google.com [209.85.215.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fp3v2h8je-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 27 Jul 2026 14:02:54 +0000 (GMT) Received: by mail-pg1-f197.google.com with SMTP id 41be03b00d2f7-cbb92868263so3458637a12.2 for ; Mon, 27 Jul 2026 07:02:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1785160973; x=1785765773; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=PJcPUXVAP0E34FWnaNgRvf9bFB9m/k58e5dArp3RdUk=; b=khBEBd3A6eJOTriAzpvwIkpsM9lOROahaZ+bnZg5TyC1aKCHrGfEUUiym9jM4fPkQs pmxB1ccX596ifR52jmiBYWkXkC6pmgBISwXX/UnQu3J0TaVlBWwefzxi2shYbl/p2A8+ 2HwZNZmGXQCGSIHruXry2nc3ufz8i++xVUHyOOCbzMRzetKOWMc7Fj7slY0Wr21K9Np0 +kuhck7VCXzFZEfxOmvCAXDX1Y3r0eBPJI9FeXgVLRoRnYUkn6V2oaXQutba3tQl7Rpk fWDfC5GUjlwzJSkCL535QrQ7bYxfZYngvtxD223I9P7I+I+7qFqruOeyimDa+MBBIp/l LcOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785160973; x=1785765773; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=PJcPUXVAP0E34FWnaNgRvf9bFB9m/k58e5dArp3RdUk=; b=aSV/k7TyUhrTO/agIpcWkN+wTmCNnIwkxfL8Zxa7YugzQQ1dkFnU/0V6nRLO9tKq1Y ioZG2U7xBfnc7Oqi+zLsITZDfhMak2+Vx3YS6na3jzz1DxI3nq/UzLxFDzVhS2t2eRUP cPlU8uW2WfRUt/y4U1dngLqdrmF5Rleey1/bUwIVd7zOZAOpcoTdX+R9CxztOfLvljqc sM8NLkNGkwA1Hp9B5RGv4zbZw4+ALG+usSUIsrE/MF0wUDKbzZDkc/PQ7Abwd28ImiRK Z5RWDDxPBoa7mJheB58MnKgi6j+rxZ7jR+x5TDLko6V3BYKQrn+ZF5gOsCL1Eq5hsrcs zFjg== X-Forwarded-Encrypted: i=1; AHgh+RqDc55QFGZ66ttg2jE2AjVdFG3VJMKhd195Or3fpVgkun25A+kZQNO1/ceXCX7w9pb0OFfmLiytVwZywEQ=@vger.kernel.org X-Gm-Message-State: AOJu0YyHQxdFYiTocUn8AJDMhE8Uwq05lOYX4oy1DWQiFUmnCyYbZ60N 5e9q43DAcmGK2rQeYVIkVIFgJ2p86v/L1YYnm78/SBUufvg4ovB4zGyCEp0aQhJWc+YzIUsunNS g8u62QI8Iggubatk/jHHTJQdT4ESYi0Bu2FUm9IFssdPB2CsT+ecOxXr4OS4NGxx51W6I2N6aI+ k= X-Gm-Gg: AR+sD138hkRpJrynuBXC21hBKInOsuzBL9zXVOMIbKYT/AtvMmyAYL06T1+ldQSl5AN f/2bpean2AvVo3AW/eQeXGK3M/f1OuO4BVhBKMEbzm4H8KNnPg/8a69qhlFHgN8X212VE4veHFA x639K+WbyOQebv1LrYlNvSAQWBPpPrLBEvy8UtrC/qUcT1Ri/Mqr3NunWp80E/H2hFidiRjvxoi qefnCWt6jey6pq0KKo4oQW4A4BeiCrylS+zN8QfctVOIE6WzbJITAHQkD8h2xf03vEUu49ZkpJN AD8Ym+ytZAClf0rygWK0rLusLJDF4vF6Tyt/xQ2yupUIhR2CexS13+cUqkM2quIem5HeUo1ovgM 0qU8pLXtKa9WlVFVFgtWYazvc0V1pZLjAgmE= X-Received: by 2002:a05:6a20:4323:b0:3bf:6011:53b with SMTP id adf61e73a8af0-3c67df1ffe9mr8232064637.38.1785160972843; Mon, 27 Jul 2026 07:02:52 -0700 (PDT) X-Received: by 2002:a05:6a20:4323:b0:3bf:6011:53b with SMTP id adf61e73a8af0-3c67df1ffe9mr8232008637.38.1785160972212; Mon, 27 Jul 2026 07:02:52 -0700 (PDT) Received: from hu-krichai-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-13e6054598asm13789423c88.1.2026.07.27.07.02.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Jul 2026 07:02:51 -0700 (PDT) From: Krishna Chaitanya Chundru Date: Mon, 27 Jul 2026 19:32:38 +0530 Subject: [PATCH v6 3/3] PCI/ASPM: Mask ASPM states based on Devicetree properties Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260727-aspm-v6-3-2ebb3ee7ef71@oss.qualcomm.com> References: <20260727-aspm-v6-0-2ebb3ee7ef71@oss.qualcomm.com> In-Reply-To: <20260727-aspm-v6-0-2ebb3ee7ef71@oss.qualcomm.com> To: Bjorn Helgaas Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, mani@kernel.org, Krishna Chaitanya Chundru X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1785160961; l=9875; i=krishna.chundru@oss.qualcomm.com; s=20230907; h=from:subject:message-id; bh=pmgBYe7iAmRlY8SfY9eVYYwGRt5Bedpxrsv54GlOtJw=; b=JlWvgrEDWjcZbODBa7jrcxnSWF0OcqGgGIdPz+zUZe+FPFnjtLHsRErBc9B+9RGVjf09fvoiZ jul2KLcaF5PD1INZaTJoVhRuM9B9Aq68Wb0615oa4KjLejchy1hotlD X-Developer-Key: i=krishna.chundru@oss.qualcomm.com; a=ed25519; pk=10CL2pdAKFyzyOHbfSWHCD0X0my7CXxj8gJScmn1FAg= X-Proofpoint-Spam-Info: AW1haW4tMjYwNzI3MDEzNCBTYWx0ZWRfXxl2MwmZzLU4G rAavGiXhqtyyBbnhnh6QPaDQS3U/Yj/ZuBYzMRmdoPNy7KYTedBTOXOG2KxHMQYGpaYMqxJu5lm Ns93gruM4uUkxd+QYJmpEIeLLPHoBeI= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzI3MDEzNCBTYWx0ZWRfX4Bmy4rN/f2Sr SkmtPjQXsUR5EszQMt/MQZ7FX2z1m06pGBISXi9Cr7EniGUz39iyUpDzIk0kwCngRZT9L2LizsK 26wl1BT6y6gJyklbMk1i7h5dfcgyEcN+s/Sr40aODDzxdazjzch8GuxY7fGNPzSMShjtgISyToS nSdUoMZRajFxXF+GpekOoxFEETo3Co5WF+jdTAoEWlzHHSREKqahKbYmizT/x9JKBzOP/E+YSrE gtPEZZdA41IOp/7Wq0sFuEv++7j/3ExPLiV0YDMGHbswNCCKanS3kVTe+NugTFadLYy6nX1xroG JYk5v+/MIYOft48ARD/xG5y2M1s1ibnwnxy1kHywUP/v5rJA8FZtAMDBuKhvZ30Pqhp810wRgJc h7BLAh8MNSJvg+A/B2JSbibv5c6zuG/sDkywWfZrR6agfAKQ9A+y/2EXUCeHaw0japOCd3weLrv gbXhWLT1AzqKG5YSdkw== X-Proofpoint-GUID: WcjaynJ-bIua7ouJgDXib7ShUAKLYYAt X-Authority-Analysis: v=2.4 cv=KJ9qylFo c=1 sm=1 tr=0 ts=6a67650e cx=c_pps a=rz3CxIlbcmazkYymdCej/Q==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yx91gb_oNiZeI1HMLzn7:22 a=NEAV23lmAAAA:8 a=EUspDBNiAAAA:8 a=yjenD30AEij0EbU3Ek8A:9 a=QEXdDO2ut3YA:10 a=bFCP_H2QrGi7Okbo017w:22 X-Proofpoint-ORIG-GUID: WcjaynJ-bIua7ouJgDXib7ShUAKLYYAt X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-27_04,2026-07-24_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 impostorscore=0 malwarescore=0 clxscore=1015 lowpriorityscore=0 phishscore=0 priorityscore=1501 suspectscore=0 bulkscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607270134 Some platforms require selectively disabling specific ASPM states on a given PCIe link to avoid link instability or functional failures caused by board-level connectivity constraints such as PCB routing, connectors, slots, or external cabling. Devicetree supports disabling ASPM L0s, L1, and L1 PM Substates via the 'aspm-no-l0s', 'aspm-no-l1' [1], and 'aspm-no-l1ss' [2] properties. However, the ASPM driver does not currently honor these properties when initializing the default link state. When firmware enables L1 PM Substates before the kernel takes over, masking aspm_support alone is insufficient to disable them in hardware. pcie_config_aspm_link() guards L1SS configuration behind a check on aspm_capable, which is derived from aspm_support. Once aspm_support is masked, pcie_config_aspm_l1ss() is never called, leaving firmware-enabled L1SS substates active in hardware. Fix this by introducing pcie_link_has_aspm_override() to check for DT override properties on either endpoint of the link. In pcie_aspm_override_default_link_state(), use it to: - Mask aspm_support, aspm_default, and aspm_enabled for any disabled state, so software's view of the link stays in sync with what is actually programmed in hardware. Leaving aspm_enabled stale would make pcie_aspm_enabled() and the aspm sysfs attributes report a state as active even after it has been masked, and could cause pcie_config_aspm_link()'s "already in requested state" check to skip reprogramming hardware to match. - Explicitly call pcie_config_aspm_l1ss(link, 0) before masking aspm_support when firmware has L1SS active and DT requests disabling L1 or L1SS, since pcie_config_aspm_link() will no longer do so once aspm_capable is derived from the masked aspm_support. Move the aspm_default initialization and pcie_aspm_override_default_link_state() call in pcie_aspm_cap_init() to before the "Restore L0s/L1" block. pcie_aspm_cap_init() disables L1 in hardware prior to aspm_l1ss_init() and re-enables it only in the restore block. Calling pcie_config_aspm_l1ss() while L1 is already disabled satisfies its precondition ("Caller must disable L1 first"), whereas the previous placement after the restore violated it. Since the restore block writes back the parent_lnkctl/child_lnkctl snapshot taken from hardware before the DT override ran, mask the L0s and L1 enable bits out of that snapshot for any state the override has just disabled in aspm_support. Otherwise the restore step would unconditionally reprogram the link back to firmware's original L0s/L1 configuration, defeating the Devicetree override it is meant to enforce. Move pcie_config_aspm_l1ss() earlier in the file so it can be called from pcie_aspm_override_default_link_state(). Link [1]: https://github.com/devicetree-org/dt-schema/pull/188 Link [2]: https://github.com/devicetree-org/dt-schema/pull/190 Signed-off-by: Krishna Chaitanya Chundru --- drivers/pci/pcie/aspm.c | 132 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 90 insertions(+), 42 deletions(-) diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index 544f35bb2555..0a671825fac8 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c @@ -839,6 +839,49 @@ static void aspm_l1ss_init(struct pcie_link_state *link) #define FLAG(x, y, d) (((x) & (PCIE_LINK_STATE_##y)) ? d : "") +/* Configure the ASPM L1 substates. Caller must disable L1 first. */ +static void pcie_config_aspm_l1ss(struct pcie_link_state *link, u32 state) +{ + u32 val = 0; + struct pci_dev *child = link->downstream, *parent = link->pdev; + + if (state & PCIE_LINK_STATE_L1_1) + val |= PCI_L1SS_CTL1_ASPM_L1_1; + if (state & PCIE_LINK_STATE_L1_2) + val |= PCI_L1SS_CTL1_ASPM_L1_2; + if (state & PCIE_LINK_STATE_L1_1_PCIPM) + val |= PCI_L1SS_CTL1_PCIPM_L1_1; + if (state & PCIE_LINK_STATE_L1_2_PCIPM) + val |= PCI_L1SS_CTL1_PCIPM_L1_2; + + /* + * PCIe r6.2, sec 5.5.4, rules for enabling L1 PM Substates: + * - Clear L1.x enable bits at child first, then at parent + * - Set L1.x enable bits at parent first, then at child + * - ASPM/PCIPM L1.2 must be disabled while programming timing + * parameters + */ + + /* Disable all L1 substates */ + pci_clear_and_set_config_dword(child, child->l1ss + PCI_L1SS_CTL1, + PCI_L1SS_CTL1_L1SS_MASK, 0); + pci_clear_and_set_config_dword(parent, parent->l1ss + PCI_L1SS_CTL1, + PCI_L1SS_CTL1_L1SS_MASK, 0); + + /* Enable what we need to enable */ + pci_clear_and_set_config_dword(parent, parent->l1ss + PCI_L1SS_CTL1, + PCI_L1SS_CTL1_L1SS_MASK, val); + pci_clear_and_set_config_dword(child, child->l1ss + PCI_L1SS_CTL1, + PCI_L1SS_CTL1_L1SS_MASK, val); +} + +static bool pcie_link_has_aspm_override(const struct pcie_link_state *link, + const char *aspm) +{ + return (device_property_present(&link->pdev->dev, aspm) || + device_property_present(&link->downstream->dev, aspm)); +} + static void pcie_aspm_override_default_link_state(struct pcie_link_state *link) { struct pci_dev *pdev = link->downstream; @@ -846,6 +889,36 @@ 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()) { + bool no_l0s = pcie_link_has_aspm_override(link, "aspm-no-l0s"); + bool no_l1 = pcie_link_has_aspm_override(link, "aspm-no-l1"); + bool no_l1ss = pcie_link_has_aspm_override(link, "aspm-no-l1ss"); + + if (no_l0s) { + link->aspm_support &= ~PCIE_LINK_STATE_L0S; + link->aspm_default &= ~PCIE_LINK_STATE_L0S; + link->aspm_enabled &= ~PCIE_LINK_STATE_L0S; + } + + /* + * 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. + * This applies equally when disabling L1 (which implies L1SS). + */ + if ((no_l1 || no_l1ss) && (link->aspm_enabled & PCIE_LINK_STATE_L1SS)) + pcie_config_aspm_l1ss(link, 0); + + if (no_l1) { + link->aspm_support &= ~(PCIE_LINK_STATE_L1 | PCIE_LINK_STATE_L1SS); + link->aspm_default &= ~(PCIE_LINK_STATE_L1 | PCIE_LINK_STATE_L1SS); + link->aspm_enabled &= ~(PCIE_LINK_STATE_L1 | PCIE_LINK_STATE_L1SS); + } else if (no_l1ss) { + link->aspm_support &= ~PCIE_LINK_STATE_L1SS; + link->aspm_default &= ~PCIE_LINK_STATE_L1SS; + link->aspm_enabled &= ~PCIE_LINK_STATE_L1SS; + } + if (link->aspm_support & PCIE_LINK_STATE_L0S) link->aspm_default |= PCIE_LINK_STATE_L0S; if (link->aspm_support & PCIE_LINK_STATE_L1) @@ -926,9 +999,25 @@ static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist) aspm_l1ss_init(link); - /* Restore L0s/L1 if they were enabled */ + /* Save default state */ + link->aspm_default = link->aspm_enabled; + + pcie_aspm_override_default_link_state(link); + + /* + * Restore L0s/L1 if they were enabled, but don't restore any + * state a Devicetree override just disabled in aspm_support above. + */ if (FIELD_GET(PCI_EXP_LNKCTL_ASPMC, child_lnkctl) || FIELD_GET(PCI_EXP_LNKCTL_ASPMC, parent_lnkctl)) { + if (!(link->aspm_support & PCIE_LINK_STATE_L0S)) { + child_lnkctl &= ~PCI_EXP_LNKCTL_ASPM_L0S; + parent_lnkctl &= ~PCI_EXP_LNKCTL_ASPM_L0S; + } + if (!(link->aspm_support & PCIE_LINK_STATE_L1)) { + child_lnkctl &= ~PCI_EXP_LNKCTL_ASPM_L1; + parent_lnkctl &= ~PCI_EXP_LNKCTL_ASPM_L1; + } pcie_capability_clear_and_set_word(parent, PCI_EXP_LNKCTL, PCI_EXP_LNKCTL_ASPMC, parent_lnkctl & PCI_EXP_LNKCTL_ASPMC); @@ -938,11 +1027,6 @@ static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist) child_lnkctl & PCI_EXP_LNKCTL_ASPMC); } - /* Save default state */ - link->aspm_default = link->aspm_enabled; - - pcie_aspm_override_default_link_state(link); - /* Setup initial capable state. Will be updated later */ link->aspm_capable = link->aspm_support; @@ -956,42 +1040,6 @@ static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist) } } -/* Configure the ASPM L1 substates. Caller must disable L1 first. */ -static void pcie_config_aspm_l1ss(struct pcie_link_state *link, u32 state) -{ - u32 val = 0; - struct pci_dev *child = link->downstream, *parent = link->pdev; - - if (state & PCIE_LINK_STATE_L1_1) - val |= PCI_L1SS_CTL1_ASPM_L1_1; - if (state & PCIE_LINK_STATE_L1_2) - val |= PCI_L1SS_CTL1_ASPM_L1_2; - if (state & PCIE_LINK_STATE_L1_1_PCIPM) - val |= PCI_L1SS_CTL1_PCIPM_L1_1; - if (state & PCIE_LINK_STATE_L1_2_PCIPM) - val |= PCI_L1SS_CTL1_PCIPM_L1_2; - - /* - * PCIe r6.2, sec 5.5.4, rules for enabling L1 PM Substates: - * - Clear L1.x enable bits at child first, then at parent - * - Set L1.x enable bits at parent first, then at child - * - ASPM/PCIPM L1.2 must be disabled while programming timing - * parameters - */ - - /* Disable all L1 substates */ - pci_clear_and_set_config_dword(child, child->l1ss + PCI_L1SS_CTL1, - PCI_L1SS_CTL1_L1SS_MASK, 0); - pci_clear_and_set_config_dword(parent, parent->l1ss + PCI_L1SS_CTL1, - PCI_L1SS_CTL1_L1SS_MASK, 0); - - /* Enable what we need to enable */ - pci_clear_and_set_config_dword(parent, parent->l1ss + PCI_L1SS_CTL1, - PCI_L1SS_CTL1_L1SS_MASK, val); - pci_clear_and_set_config_dword(child, child->l1ss + PCI_L1SS_CTL1, - PCI_L1SS_CTL1_L1SS_MASK, val); -} - static void pcie_config_aspm_dev(struct pci_dev *pdev, u32 val) { pcie_capability_clear_and_set_word(pdev, PCI_EXP_LNKCTL, -- 2.34.1