From patchwork Sat Aug 24 15:40:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heiner Kallweit X-Patchwork-Id: 1152678 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="t/4sfsSG"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46G2Zk52Gwz9s3Z for ; Sun, 25 Aug 2019 01:42:22 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727248AbfHXPmV (ORCPT ); Sat, 24 Aug 2019 11:42:21 -0400 Received: from mail-wm1-f67.google.com ([209.85.128.67]:37549 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726784AbfHXPmV (ORCPT ); Sat, 24 Aug 2019 11:42:21 -0400 Received: by mail-wm1-f67.google.com with SMTP id d16so11846079wme.2 for ; Sat, 24 Aug 2019 08:42:19 -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=dk/6LfmE1oX8xh4qZCF6iNA2M7CxlYcaWLLLz9LpGWU=; b=t/4sfsSG8sjCEsNg6WFYZHxD/hZ5lb+pBrjALrpzyfcyDMNtA/EaBEYO3VTVTxR2b/ jSlqKYgfN+sUssnYpHdcVXzTeKuTwttcBGQ5TjCtgrN8dNy4Ae35Q4Ya2KEqa1lU53c7 EDP+BVIPMEECKZ5/rCOUVFtPuSqE5kByxKrwAuyvLxOKIZGRHtVnMAP9Qx+nK/ZcYLrw wpFiObjFo/nnmJVeZoZTKyqrATqK1rvT6d2c9BfBdrgjpkCVH3fqIH3vL5EbZ1VB00EW WLOqNxq7dy9S0IeTUWI2lOeEZOMoQJK7hCTyGeH1SBhuhJhRWNjYftHbQPh8S7YiBF41 tUMQ== 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=dk/6LfmE1oX8xh4qZCF6iNA2M7CxlYcaWLLLz9LpGWU=; b=fCwpITI5OhwXJLgxQtI3ElqSqZv/cSUNZkzQhdqyAjLYR1+A3mlIZBO1L9QWkt5ZoB J9Y7aJmlDvDLj5il3FWa1bvrDJnOeasfVEMIa1/hjKAdNUlyjgPdnHao6MAfYk4V6yL1 miGe8r8VP5NGGllewcWWEYTtWJ7ulFQU+MRYW/U0wImn4MeKSTzZrrJkkZ9ZFvKaweqo FZ0xHn/Q/mJu2t59OBacikeEiEiROYJsD8tRAKYG6x5Unww5gbJopDnfd2paP58uk1Li vwH2UrSO89RHamE97L7qG2I3a3OvfNwUcyW7jv262SCAq5xc6UOABfut0oRUI486Ge6s CBnQ== X-Gm-Message-State: APjAAAUHUtFdSf9hkxumlhKBHXsn3Atj5fTgIDGTdK57BRxdmCMGlhLn PeS89uX0X61dMeQGOzQlVxw2IkL/ X-Google-Smtp-Source: APXvYqw84W5lpVmbiJSIlSFv6ZWNCx9ldeUy27SlM5snKLITBe2HknmKvpS2mFK+qa+/8ckN9cwp2w== X-Received: by 2002:a1c:39c5:: with SMTP id g188mr11264342wma.167.1566661339011; Sat, 24 Aug 2019 08:42:19 -0700 (PDT) Received: from ?IPv6:2003:ea:8f04:7c00:2069:2121:113c:4840? (p200300EA8F047C0020692121113C4840.dip0.t-ipconnect.de. [2003:ea:8f04:7c00:2069:2121:113c:4840]) by smtp.googlemail.com with ESMTPSA id f197sm18304857wme.22.2019.08.24.08.42.18 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 24 Aug 2019 08:42:18 -0700 (PDT) Subject: [PATCH v4 1/4] PCI/ASPM: add L1 sub-state support to pci_disable_link_state From: Heiner Kallweit To: Frederick Lawler , Bjorn Helgaas , Greg KH , Rajat Jain Cc: "linux-pci@vger.kernel.org" References: <3797de51-0135-07b6-9566-a1ce8cf3f24e@gmail.com> Message-ID: Date: Sat, 24 Aug 2019 17:40:20 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <3797de51-0135-07b6-9566-a1ce8cf3f24e@gmail.com> 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. Allow separate control of ASPM and PCI PM L1 sub-states. Signed-off-by: Heiner Kallweit --- v2: - allow separate control of ASPM and PCI PM L1 sub-states --- drivers/pci/pcie/aspm.c | 11 ++++++++++- include/linux/pci-aspm.h | 10 +++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index 464f8f926..1c1b9b7d6 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c @@ -1095,7 +1095,16 @@ static int __pci_disable_link_state(struct pci_dev *pdev, int state, bool sem) if (state & PCIE_LINK_STATE_L0S) link->aspm_disable |= ASPM_STATE_L0S; if (state & PCIE_LINK_STATE_L1) - link->aspm_disable |= ASPM_STATE_L1; + /* sub-states require L1 */ + link->aspm_disable |= ASPM_STATE_L1 | ASPM_STATE_L1SS; + if (state & PCIE_LINK_STATE_L1_1) + link->aspm_disable |= ASPM_STATE_L1_1; + if (state & PCIE_LINK_STATE_L1_2) + link->aspm_disable |= ASPM_STATE_L1_2; + if (state & PCIE_LINK_STATE_L1_1_PCIPM) + link->aspm_disable |= ASPM_STATE_L1_1_PCIPM; + if (state & PCIE_LINK_STATE_L1_2_PCIPM) + link->aspm_disable |= ASPM_STATE_L1_2_PCIPM; 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 67064145d..f635cbdff 100644 --- a/include/linux/pci-aspm.h +++ b/include/linux/pci-aspm.h @@ -19,9 +19,13 @@ #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) +#define PCIE_LINK_STATE_L1_1_PCIPM BIT(5) +#define PCIE_LINK_STATE_L1_2_PCIPM BIT(6) #ifdef CONFIG_PCIEASPM int pci_disable_link_state(struct pci_dev *pdev, int state); From patchwork Sat Aug 24 15:40:46 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heiner Kallweit X-Patchwork-Id: 1152679 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="hGu97r4n"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46G2Zl1tDZz9sDB for ; Sun, 25 Aug 2019 01:42:23 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726784AbfHXPmW (ORCPT ); Sat, 24 Aug 2019 11:42:22 -0400 Received: from mail-wr1-f67.google.com ([209.85.221.67]:33473 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726728AbfHXPmV (ORCPT ); Sat, 24 Aug 2019 11:42:21 -0400 Received: by mail-wr1-f67.google.com with SMTP id u16so11311008wrr.0 for ; Sat, 24 Aug 2019 08:42:21 -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=rVtfzdrmRFBQnHI9A6IJKPt4rgOl7HXVD+rwCQXJ+08=; b=hGu97r4nTZ15USgR7dmUp3AZ5hPexGXVFBoP44Z7Tl/4HMO952ohhOxDegLA+B+zyI Zq8pu0MYZfT6blZy9gf7t2SBdn7ZylYpIVE21KI1fVbTjEaoI1eNz7Vc+W7hNG5kZ4+2 fj3nnoIGhC5mjmsG2E7QkqhUarcEo+7IkqXsWJyn9XwfxmBfTv4i8Bk3Ma9nkrPTGFmJ XwvKDBibc+RMndnXtBGiWzHykQ4c4jzpIAREmCnJI1bQs21uWmPLRV3d+S3cH66ZRCGe /GHF+1PWHUE0kz/GSLPl82rSnFm0NhcQvQDUusVKccdYuqRijAg+r0fi9mq2At5TDr0s 8dHA== 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=rVtfzdrmRFBQnHI9A6IJKPt4rgOl7HXVD+rwCQXJ+08=; b=XFCDlq6HruPIJfXyC6BRZRUH9h88YsjiDHBM/cCMKv97AJPnrRPY2cuqY+ZAt13jAO WCEQojcigp3Ga5QGssq+PfYTGpOwQzuWS/mzn8Kskp5ivfXj/eCUpUsMtdKiwbZQvdcu 3gP748RHoqYi5r0/ZiMo1qvYuyIRxiCKfkMvdC87axh4bLmWdDZLjLccX0wJPnQOG1hf EyAqZoaxewVaUOY0kOGkxU+I4T7vcpd75o633hakC1Wi7hcz6ZcZIM195VXTLHL2v2G0 vhIKh/ehtGJq69X8jNDkPL8uwK5+NyFyZ8qZslu/qSbHoptynLT5VdkmP2rTNEIA9WKI ZN9A== X-Gm-Message-State: APjAAAUmf3YUY7+KZHbYZN8v754oYhNEBIEV7CPsUbGmDrS0bXLKdef2 mGKK/y57tRo9YAp2nPP7oNSAxt6m X-Google-Smtp-Source: APXvYqxdAujIbMuQ4v9ySJxU2ldGMSqht/NEigzedLVaaJV/fih3w3LMVbuSgM0/HiV8CIdR3pW9dA== X-Received: by 2002:a5d:63c9:: with SMTP id c9mr11877573wrw.15.1566661340305; Sat, 24 Aug 2019 08:42:20 -0700 (PDT) Received: from ?IPv6:2003:ea:8f04:7c00:2069:2121:113c:4840? (p200300EA8F047C0020692121113C4840.dip0.t-ipconnect.de. [2003:ea:8f04:7c00:2069:2121:113c:4840]) by smtp.googlemail.com with ESMTPSA id a19sm18345910wra.2.2019.08.24.08.42.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 24 Aug 2019 08:42:19 -0700 (PDT) Subject: [PATCH v4 2/4] PCI/ASPM: allow to re-enable Clock PM From: Heiner Kallweit To: Frederick Lawler , Bjorn Helgaas , Greg KH , Rajat Jain Cc: "linux-pci@vger.kernel.org" References: <3797de51-0135-07b6-9566-a1ce8cf3f24e@gmail.com> Message-ID: <25196d94-cf75-da11-97cc-ec6f18b321b2@gmail.com> Date: Sat, 24 Aug 2019 17:40:46 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <3797de51-0135-07b6-9566-a1ce8cf3f24e@gmail.com> 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 1c1b9b7d6..149b876c9 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) @@ -1107,10 +1112,9 @@ static int __pci_disable_link_state(struct pci_dev *pdev, int state, bool sem) link->aspm_disable |= ASPM_STATE_L1_2_PCIPM; 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 Aug 24 15:41:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heiner Kallweit X-Patchwork-Id: 1152680 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="ReS0yLEc"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46G2Zn3NWbz9s3Z for ; Sun, 25 Aug 2019 01:42:25 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727410AbfHXPmZ (ORCPT ); Sat, 24 Aug 2019 11:42:25 -0400 Received: from mail-wm1-f65.google.com ([209.85.128.65]:38564 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726728AbfHXPmY (ORCPT ); Sat, 24 Aug 2019 11:42:24 -0400 Received: by mail-wm1-f65.google.com with SMTP id m125so11829798wmm.3 for ; Sat, 24 Aug 2019 08:42:22 -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=NWoGoqro8CaypLIMqchQ1f4Z89IQ/KV52Mxzk09bfd4=; b=ReS0yLEcnDtP0ouy6pZLvxxTubok0NrMosFyT3gVm66+WJivSCpHQMDTOwcJb78gMT TlfKAx1gSh1xggGvGqNaNVV3UESBpfulSonmjTt15lIAFwUSHtZIadvrT43yMDMDCS3D lJpb7o6IO7VA4dGAuXLv7efpiWIo9zT69QeCsJeauhov8XgzKiIE1865L6oK5W7r4miy 4984QQN/ktXu0rsmA8GnjjsdkL4F+I7XDnvVU4z3+OS+Twrl+qX1OFgajfOmvCaWn/Rv 5R7pBDTuC5joGW2ckf8dbjkdax+BH6YTSUnDtM8uir925wXI5AS4HXlu9IdJN6B1tYZ/ Jafw== 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=NWoGoqro8CaypLIMqchQ1f4Z89IQ/KV52Mxzk09bfd4=; b=G4MDKZ2VRqaveXBsf5aQ4Uae4vaL8Bur+m4v5xmIeYIFAprkxzjJ/RDuCdLkhn4Y0x gh4TajuSAspKiZy/Tc3npnb39AS+MgkadXU8AJGIVgBIcO69JK8Zd+ICPnEZkbSL3JQk J0vC67LTgnR/I5DtalBn1sHz81iYGnL5iQ4huktdlQBjr0FwWmDqsbsWexGXGXEi5dy+ 1S7mV98XlgCeiNPoerCW/gZM69idj1xFV7lcDP5PrXOI18jQGrpw1bLL3+zC/wpxz+qb iGK1gvwgRy2mBGwSM/bUFzxMz28NjfssBk4cUPekYW7+o6cmDE4yV0uc5Lq8jmqWRkqs DOCA== X-Gm-Message-State: APjAAAW2cGOWomZl1fbkOn2kxZhMAjg/6IopDYRaPrw7qbscgn4e9PZh CqUoabg/l7QeUH5eldwGFCU8H37o X-Google-Smtp-Source: APXvYqzStbcXj5djKFsLd4BLRtrurdrRyKc3dfTTjycJ2RppolhkNKpVQwazrWSdA6Fe1rBRcOdIZg== X-Received: by 2002:a1c:4005:: with SMTP id n5mr11445546wma.166.1566661341693; Sat, 24 Aug 2019 08:42:21 -0700 (PDT) Received: from ?IPv6:2003:ea:8f04:7c00:2069:2121:113c:4840? (p200300EA8F047C0020692121113C4840.dip0.t-ipconnect.de. [2003:ea:8f04:7c00:2069:2121:113c:4840]) by smtp.googlemail.com with ESMTPSA id e3sm12951073wrs.37.2019.08.24.08.42.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 24 Aug 2019 08:42:21 -0700 (PDT) Subject: [PATCH v4 3/4] PCI/ASPM: add sysfs attributes for controlling ASPM link states From: Heiner Kallweit To: Frederick Lawler , Bjorn Helgaas , Greg KH , Rajat Jain Cc: "linux-pci@vger.kernel.org" References: <3797de51-0135-07b6-9566-a1ce8cf3f24e@gmail.com> Message-ID: <36db4d65-9a38-03aa-bad1-22b15ebb06c2@gmail.com> Date: Sat, 24 Aug 2019 17:41:27 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <3797de51-0135-07b6-9566-a1ce8cf3f24e@gmail.com> 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 attributes users can control which ASPM link-states are enabled/disabled. Signed-off-by: Heiner Kallweit Reviewed-by: Greg Kroah-Hartman --- v2: - use a dedicated sysfs attribute per link state - allow separate control of ASPM and PCI PM L1 sub-states v3: - statically allocate the attribute group - replace snprintf with printf - base on top of "PCI: Make pcie_downstream_port() available outside of access.c" v4: - add call to sysfs_update_group because is_visible callback returns false always at file creation time - simplify code a little --- Documentation/ABI/testing/sysfs-bus-pci | 13 ++ drivers/pci/pci-sysfs.c | 7 + drivers/pci/pci.h | 4 + drivers/pci/pcie/aspm.c | 184 ++++++++++++++++++++++++ 4 files changed, 208 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-bus-pci b/Documentation/ABI/testing/sysfs-bus-pci index 8bfee557e..49249a165 100644 --- a/Documentation/ABI/testing/sysfs-bus-pci +++ b/Documentation/ABI/testing/sysfs-bus-pci @@ -347,3 +347,16 @@ Description: If the device has any Peer-to-Peer memory registered, this file contains a '1' if the memory has been published for use outside the driver that owns the device. + +What /sys/bus/pci/devices/.../aspm/aspm_l0s +What /sys/bus/pci/devices/.../aspm/aspm_l1 +What /sys/bus/pci/devices/.../aspm/aspm_l1_1 +What /sys/bus/pci/devices/.../aspm/aspm_l1_2 +What /sys/bus/pci/devices/.../aspm/aspm_l1_1_pcipm +What /sys/bus/pci/devices/.../aspm/aspm_l1_2_pcipm +What /sys/bus/pci/devices/.../aspm/aspm_clkpm +date: August 2019 +Contact: Heiner Kallweit +Description: If ASPM is supported for an endpoint, then these files + can be used to disable or enable the individual + power management states. diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 793412954..26e36b0d0 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -1331,6 +1331,10 @@ static int pci_create_capabilities_sysfs(struct pci_dev *dev) pcie_vpd_create_sysfs_dev_files(dev); pcie_aspm_create_sysfs_dev_files(dev); +#ifdef CONFIG_PCIEASPM + /* update visibility of attributes in this group */ + sysfs_update_group(&dev->dev.kobj, &aspm_ctrl_attr_group); +#endif if (dev->reset_fn) { retval = device_create_file(&dev->dev, &dev_attr_reset); @@ -1587,6 +1591,9 @@ static const struct attribute_group *pci_dev_attr_groups[] = { &pcie_dev_attr_group, #ifdef CONFIG_PCIEAER &aer_stats_attr_group, +#endif +#ifdef CONFIG_PCIEASPM + &aspm_ctrl_attr_group, #endif NULL, }; diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 85e9fc14e..3908fb23d 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -649,4 +649,8 @@ static inline void pci_aer_clear_fatal_status(struct pci_dev *dev) { } static inline void pci_aer_clear_device_status(struct pci_dev *dev) { } #endif +#ifdef CONFIG_PCIEASPM +extern const struct attribute_group aspm_ctrl_attr_group; +#endif + #endif /* DRIVERS_PCI_H */ diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index 149b876c9..9da4d1432 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c @@ -1308,6 +1308,190 @@ void pcie_aspm_remove_sysfs_dev_files(struct pci_dev *pdev) } #endif +static struct pcie_link_state *aspm_get_parent_link(struct pci_dev *pdev) +{ + struct pci_dev *parent = pdev->bus->self; + + if (pcie_downstream_port(pdev)) + parent = pdev; + + return parent ? parent->link_state : NULL; +} + +static bool pcie_check_valid_aspm_endpoint(struct pci_dev *pdev) +{ + struct pcie_link_state *link; + + if (!pci_is_pcie(pdev) || pci_pcie_type(pdev) != PCI_EXP_TYPE_ENDPOINT) + return false; + + link = aspm_get_parent_link(pdev); + + return link && link->aspm_capable; +} + +static ssize_t aspm_attr_show_common(struct device *dev, + struct device_attribute *attr, + char *buf, int state) +{ + struct pci_dev *pdev = to_pci_dev(dev); + struct pcie_link_state *link; + int val; + + link = aspm_get_parent_link(pdev); + if (!link) + return -EOPNOTSUPP; + + mutex_lock(&aspm_lock); + val = !!(link->aspm_enabled & state); + mutex_unlock(&aspm_lock); + + return sprintf(buf, "%d\n", val); +} + +static ssize_t aspm_attr_store_common(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len, int state) +{ + struct pci_dev *pdev = to_pci_dev(dev); + struct pcie_link_state *link; + bool state_enable; + + if (aspm_disabled) + return -EPERM; + + link = aspm_get_parent_link(pdev); + if (!link) + return -EOPNOTSUPP; + + if (!(link->aspm_capable & state)) + return -EOPNOTSUPP; + + if (strtobool(buf, &state_enable) < 0) + return -EINVAL; + + down_read(&pci_bus_sem); + mutex_lock(&aspm_lock); + + if (state_enable) { + link->aspm_disable &= ~state; + /* need to enable L1 for sub-states */ + if (state & ASPM_STATE_L1SS) + link->aspm_disable &= ~ASPM_STATE_L1; + } else { + link->aspm_disable |= state; + } + + pcie_config_aspm_link(link, policy_to_aspm_state(link)); + + mutex_unlock(&aspm_lock); + up_read(&pci_bus_sem); + + return len; +} + +#define ASPM_ATTR(_f, _s) \ +static ssize_t aspm_##_f##_show(struct device *dev, \ + struct device_attribute *attr, char *buf) \ +{ return aspm_attr_show_common(dev, attr, buf, ASPM_STATE_##_s); } \ + \ +static ssize_t aspm_##_f##_store(struct device *dev, \ + struct device_attribute *attr, \ + const char *buf, size_t len) \ +{ return aspm_attr_store_common(dev, attr, buf, len, ASPM_STATE_##_s); } + +ASPM_ATTR(l0s, L0S) +ASPM_ATTR(l1, L1) +ASPM_ATTR(l1_1, L1_1) +ASPM_ATTR(l1_2, L1_2) +ASPM_ATTR(l1_1_pcipm, L1_1_PCIPM) +ASPM_ATTR(l1_2_pcipm, L1_2_PCIPM) + +static ssize_t aspm_clkpm_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct pci_dev *pdev = to_pci_dev(dev); + struct pcie_link_state *link; + int val; + + link = aspm_get_parent_link(pdev); + if (!link) + return -EOPNOTSUPP; + + mutex_lock(&aspm_lock); + val = link->clkpm_enabled; + mutex_unlock(&aspm_lock); + + return sprintf(buf, "%d\n", val); +} + +static ssize_t aspm_clkpm_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct pci_dev *pdev = to_pci_dev(dev); + struct pcie_link_state *link; + bool state_enable; + + if (aspm_disabled) + return -EPERM; + + link = aspm_get_parent_link(pdev); + if (!link) + return -EOPNOTSUPP; + + if (!link->clkpm_capable) + return -EOPNOTSUPP; + + if (strtobool(buf, &state_enable) < 0) + return -EINVAL; + + down_read(&pci_bus_sem); + mutex_lock(&aspm_lock); + + link->clkpm_disable = !state_enable; + pcie_set_clkpm(link, policy_to_clkpm_state(link)); + + mutex_unlock(&aspm_lock); + up_read(&pci_bus_sem); + + return len; +} + +static DEVICE_ATTR_RW(aspm_l0s); +static DEVICE_ATTR_RW(aspm_l1); +static DEVICE_ATTR_RW(aspm_l1_1); +static DEVICE_ATTR_RW(aspm_l1_2); +static DEVICE_ATTR_RW(aspm_l1_1_pcipm); +static DEVICE_ATTR_RW(aspm_l1_2_pcipm); +static DEVICE_ATTR_RW(aspm_clkpm); + +static struct attribute *aspm_ctrl_attrs[] = { + &dev_attr_aspm_l0s.attr, + &dev_attr_aspm_l1.attr, + &dev_attr_aspm_l1_1.attr, + &dev_attr_aspm_l1_2.attr, + &dev_attr_aspm_l1_1_pcipm.attr, + &dev_attr_aspm_l1_2_pcipm.attr, + &dev_attr_aspm_clkpm.attr, + NULL +}; + +static umode_t aspm_ctrl_attrs_are_visible(struct kobject *kobj, + struct attribute *a, int n) +{ + struct device *dev = kobj_to_dev(kobj); + struct pci_dev *pdev = to_pci_dev(dev); + + return pcie_check_valid_aspm_endpoint(pdev) ? a->mode : 0; +} + +const struct attribute_group aspm_ctrl_attr_group = { + .name = "aspm", + .attrs = aspm_ctrl_attrs, + .is_visible = aspm_ctrl_attrs_are_visible, +}; + static int __init pcie_aspm_disable(char *str) { if (!strcmp(str, "off")) { From patchwork Sat Aug 24 15:42:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heiner Kallweit X-Patchwork-Id: 1152681 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="cO6uC6Na"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46G2Zp3S9tz9sDB for ; Sun, 25 Aug 2019 01:42:26 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726728AbfHXPm0 (ORCPT ); Sat, 24 Aug 2019 11:42:26 -0400 Received: from mail-wr1-f68.google.com ([209.85.221.68]:39111 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727252AbfHXPmZ (ORCPT ); Sat, 24 Aug 2019 11:42:25 -0400 Received: by mail-wr1-f68.google.com with SMTP id t16so11293299wra.6 for ; Sat, 24 Aug 2019 08:42:23 -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=wa5QIPDWQJ6axAtkVmVG4nVvmhHC/SrPRW3RFzcvIjc=; b=cO6uC6Naegsmij9hO8WksDPfhF0oZJjQtq3O9JYZiQsiuMwRp7wFvrTVjSSnufDN7B kEah2i2H56k2s9Xt2C6piOpu/U8upGWJy1/Ktwz8ZOjR045YW5XvEaqn8JgBBarhtCw8 MDrrDB+p8iTGU3TJ1S2kvsuvxyUbs9TryKFmeHdD9n+9KKd2Z95SKr3sQh1DdDO1+sE/ OvUK7a+gKezGhrUNfYSOK/+O55/AsMKYt6DScnjJfkvZZsN98P7DtiSlfVMxGf0a3m0O lJ12klt0b6C8PbeXmUylxNz5XwnHzvU3rqxxLNCiZUXP5/Cmp71sOS9ef4vop/ZAhOOF EIDw== 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=wa5QIPDWQJ6axAtkVmVG4nVvmhHC/SrPRW3RFzcvIjc=; b=PHoQ5cupaXXLkQRkKLjiw+plz8O4SKpEZV2e/VlfgerRqXuZ+0kXrBKmPVOHU+pDZZ YvuM/IjoimuvGF6hAr38v0mHGuaTguh+gQEvahxhqwpcJGGi0W4Jw6LCVMveTXXpxpZk Q4jyaoYip/Xy2LqnXAV4pH6xHenlmL56FiGU2LRDu70x6tau/wBphTwaLkCebsbQp1Qd jHgrPx1aJ8TmdYsJnAR23QwiD8lHjnJtxUHFP26MzQOgazNkYthB4poWg2bpyTkSaz6W xKW0BMNX/kOMVs2mmDYyHwB4SwS8hnNrQILibx8EOZIyC98jF+NRgr4/DU7Rn7OgIGLx zkVw== X-Gm-Message-State: APjAAAUaqbTyRuGu37NwQhe48tjSZTq8IGHgxwDNvmvtdOLDO9UebkOc qdZ4eiCFeBwNNatevumtpydps6h4 X-Google-Smtp-Source: APXvYqwpHiIGNFssH9xbZVjKtavQPQbnKED/LY30UC3dAGBWDah8ajZQDqz7XiXSYQOTs/rUuYCPmQ== X-Received: by 2002:adf:ffc2:: with SMTP id x2mr11660460wrs.338.1566661342991; Sat, 24 Aug 2019 08:42:22 -0700 (PDT) Received: from ?IPv6:2003:ea:8f04:7c00:2069:2121:113c:4840? (p200300EA8F047C0020692121113C4840.dip0.t-ipconnect.de. [2003:ea:8f04:7c00:2069:2121:113c:4840]) by smtp.googlemail.com with ESMTPSA id r18sm5070066wmh.6.2019.08.24.08.42.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 24 Aug 2019 08:42:22 -0700 (PDT) Subject: [PATCH v4 4/4] PCI/ASPM: remove Kconfig option PCIEASPM_DEBUG and related code From: Heiner Kallweit To: Frederick Lawler , Bjorn Helgaas , Greg KH , Rajat Jain Cc: "linux-pci@vger.kernel.org" References: <3797de51-0135-07b6-9566-a1ce8cf3f24e@gmail.com> Message-ID: <3f53a96e-7f34-2540-f663-bcebf408e0f7@gmail.com> Date: Sat, 24 Aug 2019 17:42:06 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <3797de51-0135-07b6-9566-a1ce8cf3f24e@gmail.com> Content-Language: en-US Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org Now that we have sysfs attributes for enabling/disabling the individual ASPM link states, this debug code isn't needed any longer. Signed-off-by: Heiner Kallweit --- drivers/pci/pci-sysfs.c | 3 -- drivers/pci/pci.h | 8 --- drivers/pci/pcie/Kconfig | 7 --- drivers/pci/pcie/aspm.c | 105 --------------------------------------- 4 files changed, 123 deletions(-) diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 26e36b0d0..8657cdf62 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c @@ -1330,7 +1330,6 @@ static int pci_create_capabilities_sysfs(struct pci_dev *dev) int retval; pcie_vpd_create_sysfs_dev_files(dev); - pcie_aspm_create_sysfs_dev_files(dev); #ifdef CONFIG_PCIEASPM /* update visibility of attributes in this group */ sysfs_update_group(&dev->dev.kobj, &aspm_ctrl_attr_group); @@ -1344,7 +1343,6 @@ static int pci_create_capabilities_sysfs(struct pci_dev *dev) return 0; error: - pcie_aspm_remove_sysfs_dev_files(dev); pcie_vpd_remove_sysfs_dev_files(dev); return retval; } @@ -1420,7 +1418,6 @@ int __must_check pci_create_sysfs_dev_files(struct pci_dev *pdev) static void pci_remove_capabilities_sysfs(struct pci_dev *dev) { pcie_vpd_remove_sysfs_dev_files(dev); - pcie_aspm_remove_sysfs_dev_files(dev); if (dev->reset_fn) { device_remove_file(&dev->dev, &dev_attr_reset); dev->reset_fn = 0; diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 3908fb23d..9ede6a37a 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h @@ -532,14 +532,6 @@ 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 - #ifdef CONFIG_PCIE_ECRC void pcie_set_ecrc_checking(struct pci_dev *dev); void pcie_ecrc_get_policy(char *str); diff --git a/drivers/pci/pcie/Kconfig b/drivers/pci/pcie/Kconfig index 362eb8cfa..a2e862d4e 100644 --- a/drivers/pci/pcie/Kconfig +++ b/drivers/pci/pcie/Kconfig @@ -79,13 +79,6 @@ config PCIEASPM When in doubt, say Y. -config PCIEASPM_DEBUG - bool "Debug PCI Express ASPM" - depends on PCIEASPM - help - This enables PCI Express ASPM debug support. It will add per-device - interface to control ASPM. - choice prompt "Default ASPM policy" default PCIEASPM_DEFAULT diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index 9da4d1432..7a3278011 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c @@ -1203,111 +1203,6 @@ bool pcie_aspm_enabled(struct pci_dev *pdev) } EXPORT_SYMBOL_GPL(pcie_aspm_enabled); -#ifdef CONFIG_PCIEASPM_DEBUG -static ssize_t link_state_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct pci_dev *pci_device = to_pci_dev(dev); - struct pcie_link_state *link_state = pci_device->link_state; - - return sprintf(buf, "%d\n", link_state->aspm_enabled); -} - -static ssize_t link_state_store(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t n) -{ - struct pci_dev *pdev = to_pci_dev(dev); - struct pcie_link_state *link, *root = pdev->link_state->root; - u32 state; - - if (aspm_disabled) - return -EPERM; - - if (kstrtouint(buf, 10, &state)) - return -EINVAL; - if ((state & ~ASPM_STATE_ALL) != 0) - return -EINVAL; - - down_read(&pci_bus_sem); - mutex_lock(&aspm_lock); - list_for_each_entry(link, &link_list, sibling) { - if (link->root != root) - continue; - pcie_config_aspm_link(link, state); - } - mutex_unlock(&aspm_lock); - up_read(&pci_bus_sem); - return n; -} - -static ssize_t clk_ctl_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct pci_dev *pci_device = to_pci_dev(dev); - struct pcie_link_state *link_state = pci_device->link_state; - - return sprintf(buf, "%d\n", link_state->clkpm_enabled); -} - -static ssize_t clk_ctl_store(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t n) -{ - struct pci_dev *pdev = to_pci_dev(dev); - bool state; - - if (strtobool(buf, &state)) - return -EINVAL; - - down_read(&pci_bus_sem); - mutex_lock(&aspm_lock); - pcie_set_clkpm_nocheck(pdev->link_state, state); - mutex_unlock(&aspm_lock); - up_read(&pci_bus_sem); - - return n; -} - -static DEVICE_ATTR_RW(link_state); -static DEVICE_ATTR_RW(clk_ctl); - -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; - - if (!link_state) - return; - - 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); -} - -void pcie_aspm_remove_sysfs_dev_files(struct pci_dev *pdev) -{ - struct pcie_link_state *link_state = pdev->link_state; - - if (!link_state) - return; - - 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 struct pcie_link_state *aspm_get_parent_link(struct pci_dev *pdev) { struct pci_dev *parent = pdev->bus->self;