From patchwork Sat Apr 13 09:11:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heiner Kallweit X-Patchwork-Id: 1085078 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pci-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="G6pw8Dkj"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44h8Dt06x1z9s71 for ; Sat, 13 Apr 2019 19:13:01 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726749AbfDMJNA (ORCPT ); Sat, 13 Apr 2019 05:13:00 -0400 Received: from mail-wm1-f66.google.com ([209.85.128.66]:50208 "EHLO mail-wm1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726201AbfDMJNA (ORCPT ); Sat, 13 Apr 2019 05:13:00 -0400 Received: by mail-wm1-f66.google.com with SMTP id z11so14145463wmi.0 for ; Sat, 13 Apr 2019 02:12:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:from:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=Kzu+IErrOKTjkX/at7kkRf5eNsPGEAisB7hOvORvAyU=; b=G6pw8DkjdCPtUSYACZ74gGF+IEf8PhO+QbcUyc21rqTY0sKlEze106w3phMYiXO9hb rPvLLgFsT89heUTD/CfZqoqtHJnMe9Q/CpN41bsMIyOnRNLL44e8MvPbEJUgzTfX8aGf DP+P4Kb5TZDNusl/xHMvEfPdsoyKnjWHpjNo4HBPeYmH0FNH9lbMb+r4CpiU+2KK4srE TS12VgrCj806ZwCZ0UD7sSdAvYZOHj8mDApyPEt8tiLcXv1/BxXKxdvnadsvfKAKJRYZ +x1yJzF6R6qyEcVt7Vk7XIvHFyaQsXYgnzjezWHdjMegzQIjDBAwxWrYG1m0EPiaaTej ULyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=Kzu+IErrOKTjkX/at7kkRf5eNsPGEAisB7hOvORvAyU=; b=G5BeXcCagnyKJgUTROIIcJyrEEE8iYdTsthcVeh6RBOM5HFPOU/v7o1H/knjhueVVq f+PJh181IMGC/bhiJ7P2wCNo12sqPERh5gkKVD9ep0IOYsas5kqLHQIrYQnSN01flV8X gqzF9UKpyjMgWZG5MWEvZzfeCBGZbXGZ73cG8zjLRcNi2M9KkUan79kftvHa1YQLlaAR VZHjznaIKSoIkrmnTODVnCbf2bQwthK+fTjOU9dNXO3z+2RkPQmrpEaAOQPn8mFQXA/f h9SAaVAKhzdFLLpPqsqCkWHdwFoNCfrIX5JAdfR6RZQQLG6ZQ8zMs+dZBqle+VmqFNlS UjEg== X-Gm-Message-State: APjAAAWPVkkV2bIjow0j/catrsLSYkiK8S7OAcuIWmYwG0loPu62O3Rn QgF17vcBrWippuTUriVZr2i8qGcW X-Google-Smtp-Source: APXvYqx5v3Li4tbnSipjN2K5bUquaUi5Q7AwCZdCfOBPFynul/TXpDNCGs7rp+YeQtyKAiBGxozlQA== X-Received: by 2002:a1c:480b:: with SMTP id v11mr14098202wma.25.1555146777621; Sat, 13 Apr 2019 02:12:57 -0700 (PDT) Received: from ?IPv6:2003:ea:8bd4:5700:6509:80dd:f4f:5628? (p200300EA8BD45700650980DD0F4F5628.dip0.t-ipconnect.de. [2003:ea:8bd4:5700:6509:80dd:f4f:5628]) by smtp.googlemail.com with ESMTPSA id t17sm37173665wrr.26.2019.04.13.02.12.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 13 Apr 2019 02:12:56 -0700 (PDT) Subject: [PATCH RFC 1/3] PCI/ASPM: add L1 sub-state support to pci_disable_link_state From: Heiner Kallweit To: Frederick Lawler , Bjorn Helgaas Cc: "linux-pci@vger.kernel.org" References: Message-ID: Date: Sat, 13 Apr 2019 11:11:24 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 MIME-Version: 1.0 In-Reply-To: Content-Language: en-US Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org Add support for disabling states L1.1 and L1.2 to pci_disable_link_state. Signed-off-by: Heiner Kallweit --- drivers/pci/pcie/aspm.c | 13 ++++++++++--- include/linux/pci-aspm.h | 8 +++++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index fd4cb7508..511f3e018 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c @@ -35,9 +35,9 @@ #define ASPM_STATE_L1_1_PCIPM (0x20) /* PCI PM L1.1 state */ #define ASPM_STATE_L1_2_PCIPM (0x40) /* PCI PM L1.2 state */ #define ASPM_STATE_L1_SS_PCIPM (ASPM_STATE_L1_1_PCIPM | ASPM_STATE_L1_2_PCIPM) +#define ASPM_STATE_L1_1_MASK (ASPM_STATE_L1_1 | ASPM_STATE_L1_1_PCIPM) #define ASPM_STATE_L1_2_MASK (ASPM_STATE_L1_2 | ASPM_STATE_L1_2_PCIPM) -#define ASPM_STATE_L1SS (ASPM_STATE_L1_1 | ASPM_STATE_L1_1_PCIPM |\ - ASPM_STATE_L1_2_MASK) +#define ASPM_STATE_L1SS (ASPM_STATE_L1_1_MASK | ASPM_STATE_L1_2_MASK) #define ASPM_STATE_L0S (ASPM_STATE_L0S_UP | ASPM_STATE_L0S_DW) #define ASPM_STATE_ALL (ASPM_STATE_L0S | ASPM_STATE_L1 | \ ASPM_STATE_L1SS) @@ -1094,8 +1094,15 @@ static void __pci_disable_link_state(struct pci_dev *pdev, int state, bool sem) link = parent->link_state; if (state & PCIE_LINK_STATE_L0S) link->aspm_disable |= ASPM_STATE_L0S; - if (state & PCIE_LINK_STATE_L1) + if (state & PCIE_LINK_STATE_L1) { link->aspm_disable |= ASPM_STATE_L1; + /* sub-states require L1 */ + link->aspm_disable |= ASPM_STATE_L1SS; + } + if (state & PCIE_LINK_STATE_L1_1) + link->aspm_disable |= ASPM_STATE_L1_1_MASK; + if (state & PCIE_LINK_STATE_L1_2) + link->aspm_disable |= ASPM_STATE_L1_2_MASK; pcie_config_aspm_link(link, policy_to_aspm_state(link)); if (state & PCIE_LINK_STATE_CLKPM) { diff --git a/include/linux/pci-aspm.h b/include/linux/pci-aspm.h index df28af5ce..e66c3e3d8 100644 --- a/include/linux/pci-aspm.h +++ b/include/linux/pci-aspm.h @@ -19,9 +19,11 @@ #include -#define PCIE_LINK_STATE_L0S 1 -#define PCIE_LINK_STATE_L1 2 -#define PCIE_LINK_STATE_CLKPM 4 +#define PCIE_LINK_STATE_L0S BIT(0) +#define PCIE_LINK_STATE_L1 BIT(1) +#define PCIE_LINK_STATE_CLKPM BIT(2) +#define PCIE_LINK_STATE_L1_1 BIT(3) +#define PCIE_LINK_STATE_L1_2 BIT(4) #ifdef CONFIG_PCIEASPM void pci_disable_link_state(struct pci_dev *pdev, int state); From patchwork Sat Apr 13 09:11:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heiner Kallweit X-Patchwork-Id: 1085079 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pci-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="THH7bnU4"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44h8Dt33yGz9s7T for ; Sat, 13 Apr 2019 19:13:02 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726201AbfDMJNB (ORCPT ); Sat, 13 Apr 2019 05:13:01 -0400 Received: from mail-wm1-f65.google.com ([209.85.128.65]:34344 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726377AbfDMJNB (ORCPT ); Sat, 13 Apr 2019 05:13:01 -0400 Received: by mail-wm1-f65.google.com with SMTP id r186so2130670wmf.1 for ; Sat, 13 Apr 2019 02:12:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:from:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=kgoy6MzCDFZksLCgPm3ckOOZ7Ci44vWIX+S6sDXfwtE=; b=THH7bnU4SYdsW+nlDC3l2IWUKe+799vy8ZhAWGWkuE4NdWGELhW1hGZGnH2h+zKli9 RDt3ROucCSVPGU+vcHRk816hgSlv4QKSLPfXpuG7QLmzaZPK3409czBuPQEnr90jiFTq eYJ758DidU8+CzsIr7Y2LAG+LW1zpks8HoVH+b5ILPNgkTQ+VbBy/TIUIvK9h0Jvp68j 2Dit2BjqNI+xL2+1l0ZM0btxQmjpzouU4BLRV2usxsLtLPrWR83bYcrwDMhWe4J7I/ip h0NjFb7PTTqu5qI/tC3y4d46sqCwNUFef6EdXgYazlCHTi6qXO4StILE23FiGnhVEOC/ UvLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=kgoy6MzCDFZksLCgPm3ckOOZ7Ci44vWIX+S6sDXfwtE=; b=V21REP8tjiXB6CCe3lFZ8hhZJOWhFnWqMSuWLfLjYzQBHn5YJBVaRdCKRE4DvZhjQX 6SQmbWjuO+1qUh9tfLRyR1jUQYkHQ/vDHDjraZEXuqGLJrPU5nzjdK0OCtP1I1yHSN35 8POwvqLhUrKe4TOFc8UArpEIBptLfN5BbLD0GHxUnjjct3+PdYwm8jJVymcOZfEiedfb GfienobGIswvFFpATArumPzG4nkUstJWASuTot5CLi+YnUhCXGl8r9EtOI/s+75V7kET 6XTp5qDEyiSZpc6JYPeIO+K8mzXlL4PrZiKjMB4ynudzY/ofUILm9WgCzXpIMYrF81pL N06A== X-Gm-Message-State: APjAAAV1ZO9ZlfRY/Q9xGKbT97JtFTUgZy7y/OCRc+XZbYRa1vgnhSU6 pHQz9oHwt9oIazHuq7vokO+AuG/u X-Google-Smtp-Source: APXvYqxlqqqr1XS0e8qAaAKwmJlJeu5IV+hLvUOqM9X8PZWdfH9ZYY8tJaWjS3Z25TBXdkthLcQ4vQ== X-Received: by 2002:a1c:544f:: with SMTP id p15mr13847192wmi.65.1555146778999; Sat, 13 Apr 2019 02:12:58 -0700 (PDT) Received: from ?IPv6:2003:ea:8bd4:5700:6509:80dd:f4f:5628? (p200300EA8BD45700650980DD0F4F5628.dip0.t-ipconnect.de. [2003:ea:8bd4:5700:6509:80dd:f4f:5628]) by smtp.googlemail.com with ESMTPSA id v190sm16259208wme.18.2019.04.13.02.12.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 13 Apr 2019 02:12:58 -0700 (PDT) Subject: [PATCH RFC 2/3] PCI/ASPM: allow to re-enable Clock PM From: Heiner Kallweit To: Frederick Lawler , Bjorn Helgaas Cc: "linux-pci@vger.kernel.org" References: Message-ID: <41cc300f-0bb8-4b25-5b58-37ad335ed4af@gmail.com> Date: Sat, 13 Apr 2019 11:11:53 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 MIME-Version: 1.0 In-Reply-To: Content-Language: en-US Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org So far Clock PM can't be re-enabled once it has been disabled with a call to pci_disable_link_state(). Reason is that clkpm_capable is reset. Change this by adding a clkpm_disable field similar to aspm_disable. Signed-off-by: Heiner Kallweit --- drivers/pci/pcie/aspm.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index 511f3e018..7847be38e 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c @@ -65,6 +65,7 @@ struct pcie_link_state { u32 clkpm_capable:1; /* Clock PM capable? */ u32 clkpm_enabled:1; /* Current Clock PM state */ u32 clkpm_default:1; /* Default Clock PM state by BIOS */ + u32 clkpm_disable:1; /* Clock PM disabled */ /* Exit latencies */ struct aspm_latency latency_up; /* Upstream direction exit latency */ @@ -162,8 +163,11 @@ static void pcie_set_clkpm_nocheck(struct pcie_link_state *link, int enable) static void pcie_set_clkpm(struct pcie_link_state *link, int enable) { - /* Don't enable Clock PM if the link is not Clock PM capable */ - if (!link->clkpm_capable) + /* + * Don't enable Clock PM if the link is not Clock PM capable + * or Clock PM is disabled + */ + if (!link->clkpm_capable || link->clkpm_disable) enable = 0; /* Need nothing if the specified equals to current state */ if (link->clkpm_enabled == enable) @@ -193,7 +197,8 @@ static void pcie_clkpm_cap_init(struct pcie_link_state *link, int blacklist) } link->clkpm_enabled = enabled; link->clkpm_default = enabled; - link->clkpm_capable = (blacklist) ? 0 : capable; + link->clkpm_capable = capable; + link->clkpm_disable = blacklist ? 1 : 0; } static bool pcie_retrain_link(struct pcie_link_state *link) @@ -1105,10 +1110,9 @@ static void __pci_disable_link_state(struct pci_dev *pdev, int state, bool sem) link->aspm_disable |= ASPM_STATE_L1_2_MASK; pcie_config_aspm_link(link, policy_to_aspm_state(link)); - if (state & PCIE_LINK_STATE_CLKPM) { - link->clkpm_capable = 0; - pcie_set_clkpm(link, 0); - } + if (state & PCIE_LINK_STATE_CLKPM) + link->clkpm_disable = 1; + pcie_set_clkpm(link, policy_to_clkpm_state(link)); mutex_unlock(&aspm_lock); if (sem) up_read(&pci_bus_sem); From patchwork Sat Apr 13 09:12:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heiner Kallweit X-Patchwork-Id: 1085080 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-pci-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="W00Wf8yC"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 44h8Dv5czwz9s71 for ; Sat, 13 Apr 2019 19:13:03 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726833AbfDMJND (ORCPT ); Sat, 13 Apr 2019 05:13:03 -0400 Received: from mail-wm1-f68.google.com ([209.85.128.68]:50212 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726377AbfDMJND (ORCPT ); Sat, 13 Apr 2019 05:13:03 -0400 Received: by mail-wm1-f68.google.com with SMTP id z11so14145526wmi.0 for ; Sat, 13 Apr 2019 02:13:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:from:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=6j2+oAhD+dZrLXexKNZ1uylOYS7hAH/o/Lb0V4eYN5E=; b=W00Wf8yC1rBTZoBV4F1S9JocEDvSfEmtfMsoeCUrIgmQd1IxU3k4lSBARY1f/YFWtc GX/M7C6rJbHayMcTEgn25A+5V7bYUWuL+qcGtZQlCiugo1N6Yo0BIjfBIBFhWUCixSUH uieFBDdPzcoJDUyjz8QjJoQ2KoqxU6Nlmokpobo9VmrGAqzmvd4YbNn064SEYzcSu7YV CR1y5Me2/Yl/sjK/0y+6zLDOFqdN1Bf3AVD0rpxV4295PvciKuAGe1eo5kRvobU7rU6R yrr+f/5xzYkR0eYPovtPWHebaSuMLjHv9QhJRb1GG5oq9vb6zwsyE1Du63fiA4/vgZKr BMVA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=6j2+oAhD+dZrLXexKNZ1uylOYS7hAH/o/Lb0V4eYN5E=; b=bMfBqNrLT47iCn87NRY+520MTuTLKCyG/8xN4N8ji3QjJHY3OUgzE2ZpqjHvvDbfpg hRxpQmXsoQah0lF10k0SpK+dhlwWF1oBvgSOJGzdgzGACaSdwpR95MXrJ7ri4PQPHvbH oCiSHFjMk6Ua3NtV1AQeH9UekY92Ze91rJZtECf2pz+o6CeCBD0iHZxDLg5Moe0bFrll j/ED7/1CCuqoCATtGF5/vlmzPX+GoA7DAPAhrJZuUVgUguMKngn4ZfDn6sGY3zzMrTa/ jxgmXyOKeE124TPpOnksFzQkJanVsTwR2Wk1pQeaVUqRwH0df1xuZaaAFXhAHjMdTkHs 7buA== X-Gm-Message-State: APjAAAVAq+U8aKCknpVEEyinz7BF8wmMy/foa7494kT+XjqrrETjsFnU jzJOWCgB2CHJZfTOeZrXtXtKTeVZ X-Google-Smtp-Source: APXvYqzCCnFkAVs+thC4M8B0E5ySmGL8byrmbq6zo87gxExN0L3yCJ2L//CxKKc6xEt9IFSFOls7hg== X-Received: by 2002:a1c:6342:: with SMTP id x63mr14854757wmb.58.1555146780322; Sat, 13 Apr 2019 02:13:00 -0700 (PDT) Received: from ?IPv6:2003:ea:8bd4:5700:6509:80dd:f4f:5628? (p200300EA8BD45700650980DD0F4F5628.dip0.t-ipconnect.de. [2003:ea:8bd4:5700:6509:80dd:f4f:5628]) by smtp.googlemail.com with ESMTPSA id 11sm10710460wmk.17.2019.04.13.02.12.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 13 Apr 2019 02:12:59 -0700 (PDT) Subject: [PATCH RFC 3/3] PCI/ASPM: add sysfs attribute for controlling ASPM From: Heiner Kallweit To: Frederick Lawler , Bjorn Helgaas Cc: "linux-pci@vger.kernel.org" References: Message-ID: Date: Sat, 13 Apr 2019 11:12:41 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.6.1 MIME-Version: 1.0 In-Reply-To: Content-Language: en-US Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org Background of this extension is a problem with the r8169 network driver. Several combinations of board chipsets and network chip versions have problems if ASPM is enabled, therefore we have to disable ASPM per default. However especially on notebooks ASPM can provide significant power-saving, therefore we want to give users the option to enable ASPM. With the new sysfs attribute users can control which ASPM link-states are disabled. This is a first RFC version, therefore documentation of attribute is still missing. The attribute handling was inspired by the protocol attribute handling in drivers/media/rc/rc-main.c. Attribute syntax in a few words: none: allow all supported ASPM states all: disable all ASPM states +: add state to list of disabled ASPM states -: re-enable ASPM state if supported Signed-off-by: Heiner Kallweit --- drivers/pci/pci.h | 8 +- drivers/pci/pcie/aspm.c | 173 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 173 insertions(+), 8 deletions(-) diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index d994839a3..6d4e5fc24 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -499,17 +499,13 @@ void pcie_aspm_init_link_state(struct pci_dev *pdev); void pcie_aspm_exit_link_state(struct pci_dev *pdev); void pcie_aspm_pm_state_change(struct pci_dev *pdev); void pcie_aspm_powersave_config_link(struct pci_dev *pdev); +void pcie_aspm_create_sysfs_dev_files(struct pci_dev *pdev); +void pcie_aspm_remove_sysfs_dev_files(struct pci_dev *pdev); #else static inline void pcie_aspm_init_link_state(struct pci_dev *pdev) { } static inline void pcie_aspm_exit_link_state(struct pci_dev *pdev) { } static inline void pcie_aspm_pm_state_change(struct pci_dev *pdev) { } static inline void pcie_aspm_powersave_config_link(struct pci_dev *pdev) { } -#endif - -#ifdef CONFIG_PCIEASPM_DEBUG -void pcie_aspm_create_sysfs_dev_files(struct pci_dev *pdev); -void pcie_aspm_remove_sysfs_dev_files(struct pci_dev *pdev); -#else static inline void pcie_aspm_create_sysfs_dev_files(struct pci_dev *pdev) { } static inline void pcie_aspm_remove_sysfs_dev_files(struct pci_dev *pdev) { } #endif diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index 7847be38e..bfbfd9134 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c @@ -42,6 +42,8 @@ #define ASPM_STATE_ALL (ASPM_STATE_L0S | ASPM_STATE_L1 | \ ASPM_STATE_L1SS) +static const char power_group[] = "power"; + struct aspm_latency { u32 l0s; /* L0s latency (nsec) */ u32 l1; /* L1 latency (nsec) */ @@ -1251,8 +1253,164 @@ static ssize_t clk_ctl_store(struct device *dev, static DEVICE_ATTR_RW(link_state); static DEVICE_ATTR_RW(clk_ctl); +#endif + +struct aspm_sysfs_state { + const char *name; + int disable_mask; +}; + +static const struct aspm_sysfs_state aspm_sysfs_states[] = { + { "L0S", ASPM_STATE_L0S }, + { "L1", ASPM_STATE_L1 }, + { "L1.1", ASPM_STATE_L1_1_MASK }, + { "L1.2", ASPM_STATE_L1_2_MASK }, +}; + +static struct pci_dev *aspm_get_parent(struct pci_dev *pdev) +{ + struct pci_dev *parent = pdev->bus->self; + + if (pdev->has_secondary_link) + parent = pdev; + + return parent && parent->link_state ? parent : NULL; +} + +static ssize_t aspm_disable_link_state_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct pci_dev *parent, *pdev = to_pci_dev(dev); + struct pcie_link_state *link; + int len = 0, i; + + parent = aspm_get_parent(pdev); + if (!parent) + return -EOPNOTSUPP; + + link = parent->link_state; + + mutex_lock(&aspm_lock); + + for (i = 0; i < ARRAY_SIZE(aspm_sysfs_states); i++) { + const struct aspm_sysfs_state *st = aspm_sysfs_states + i; + + if (link->aspm_disable & st->disable_mask) + len += scnprintf(buf + len, PAGE_SIZE - len, "[%s] ", + st->name); + else + len += scnprintf(buf + len, PAGE_SIZE - len, "%s ", + st->name); + } + + if (link->clkpm_disable) + len += scnprintf(buf + len, PAGE_SIZE - len, "[CLKPM] "); + else + len += scnprintf(buf + len, PAGE_SIZE - len, "CLKPM "); + + mutex_unlock(&aspm_lock); + + len += scnprintf(buf + len, PAGE_SIZE - len, "\n"); + + return len; +} + +static ssize_t aspm_disable_link_state_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct pci_dev *parent, *pdev = to_pci_dev(dev); + struct pcie_link_state *link; + char *buftmp = (char *)buf, *tok; + unsigned int disable_aspm, disable_clkpm; + bool first = true, add; + int err = 0, i; + + if (aspm_disabled) + return -EPERM; + + parent = aspm_get_parent(pdev); + if (!parent) + return -EOPNOTSUPP; + + link = parent->link_state; + + down_read(&pci_bus_sem); + mutex_lock(&aspm_lock); + + disable_aspm = link->aspm_disable; + disable_clkpm = link->clkpm_disable; + + while ((tok = strsep(&buftmp, " \n")) != NULL) { + bool found = false; + + if (!*tok) + continue; + + if (first) { + if (!strcasecmp(tok, "none")) { + disable_aspm = 0; + disable_clkpm = 0; + break; + } + if (!strcasecmp(tok, "all")) { + disable_aspm = ASPM_STATE_ALL; + disable_clkpm = 1; + break; + } + first = false; + } + + if (*tok != '+' && *tok != '-') { + err = -EINVAL; + goto out; + } + + add = *tok++ == '+'; + + for (i = 0; i < ARRAY_SIZE(aspm_sysfs_states); i++) { + const struct aspm_sysfs_state *st = + aspm_sysfs_states + i; + + if (!strcasecmp(tok, st->name)) { + if (add) + disable_aspm |= st->disable_mask; + else + disable_aspm &= ~st->disable_mask; + found = true; + break; + } + } + + if (!found && !strcasecmp(tok, "clkpm")) { + disable_clkpm = add ? 1 : 0; + found = true; + } + + if (!found) { + err = -EINVAL; + goto out; + } + } + + if (disable_aspm & ASPM_STATE_L1) + disable_aspm |= ASPM_STATE_L1SS; + + link->aspm_disable = disable_aspm; + link->clkpm_disable = disable_clkpm; + + pcie_config_aspm_link(link, policy_to_aspm_state(link)); + pcie_set_clkpm(link, policy_to_clkpm_state(link)); +out: + mutex_unlock(&aspm_lock); + up_read(&pci_bus_sem); + + return err ?: len; +} + +static DEVICE_ATTR_RW(aspm_disable_link_state); -static char power_group[] = "power"; void pcie_aspm_create_sysfs_dev_files(struct pci_dev *pdev) { struct pcie_link_state *link_state = pdev->link_state; @@ -1260,12 +1418,18 @@ void pcie_aspm_create_sysfs_dev_files(struct pci_dev *pdev) if (!link_state) return; + if (link_state->aspm_support) + sysfs_add_file_to_group(&pdev->dev.kobj, + &dev_attr_aspm_disable_link_state.attr, power_group); + +#ifdef CONFIG_PCIEASPM_DEBUG if (link_state->aspm_support) sysfs_add_file_to_group(&pdev->dev.kobj, &dev_attr_link_state.attr, power_group); if (link_state->clkpm_capable) sysfs_add_file_to_group(&pdev->dev.kobj, &dev_attr_clk_ctl.attr, power_group); +#endif } void pcie_aspm_remove_sysfs_dev_files(struct pci_dev *pdev) @@ -1275,14 +1439,19 @@ void pcie_aspm_remove_sysfs_dev_files(struct pci_dev *pdev) if (!link_state) return; + if (link_state->aspm_support) + sysfs_remove_file_from_group(&pdev->dev.kobj, + &dev_attr_aspm_disable_link_state.attr, power_group); + +#ifdef CONFIG_PCIEASPM_DEBUG if (link_state->aspm_support) sysfs_remove_file_from_group(&pdev->dev.kobj, &dev_attr_link_state.attr, power_group); if (link_state->clkpm_capable) sysfs_remove_file_from_group(&pdev->dev.kobj, &dev_attr_clk_ctl.attr, power_group); -} #endif +} static int __init pcie_aspm_disable(char *str) {