Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp13889651ybl; Sun, 29 Dec 2019 23:26:09 -0800 (PST) X-Google-Smtp-Source: APXvYqxipfFfG+3kqZE6ltOag4nF0JpGBX/OtkaUy8XytcFD15sO1B1tQosGuVCeYt+MJQxkQWvi X-Received: by 2002:a9d:5c02:: with SMTP id o2mr65163026otk.176.1577690769823; Sun, 29 Dec 2019 23:26:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577690769; cv=none; d=google.com; s=arc-20160816; b=EyDi2CI13xj7XWxwF5lyRaAvbi9odbjLmq1uvYywvf18aFlYhi9/GxMm8YUx4adHhG bp7wPoWHp9qxG2GchJVQgppMHiqVHdCmjU+XXQLC4k2s2L9aY7VopHFetJuiuRGTPIgm hBncwB7zOHDDU3BDQ5zL+fejeZTVtyubwSKJUZRU402hbRpUU++c8wv5OEXdarfMbnk4 FkWHEOJxqlOecLC1lWTAWxUDps0LO+juscNA8ktNxAgcoT15YAK7fkbSm+vt5ZRvtM3e sS7BGxkLysDhv9Ec3CPRjD45yl0rEWekqas7JFtlUWXddKGk++/1uMcYKTtKvfuA73Px Cydg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:to:references:message-id :content-transfer-encoding:cc:date:in-reply-to:from:subject :mime-version; bh=fguPiQysGIirccNdjXE0yK7XVyVgowf2Zx8qfPsnNsg=; b=HWR+Hzt+ZccWimo6eqNX9x8tyklf7tEBIzo7OUnSrjlUTF0rv8olk2zQC2aTl31Wnk Isb48sevIZcakdwVtcv4yVIuoLuxMHh8gmqvF54CYA6o1jLB9DJHI5B2pKZU6SBEKf5Z 01hrmszgLQmqEEpmVTbYksOOgCijTO5uPzYnDEsVTIf83ngEZWSr+ap6LzGnv0LLmIvO DnhKpQBYPcPlhW+GILEW5tQQMOevvENp+Fx/IUfENPh8WaNCNxZANJgTXZITJmg0YWs4 WQxnJIoAl5vA27isag1VdMrJ8Ziby1s77eCKzCyRUshrelQ2ahCBKGFpCCIcb4+xWR6Y vfiQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id e1si16691044otj.276.2019.12.29.23.25.44; Sun, 29 Dec 2019 23:26:09 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727195AbfL3HVq convert rfc822-to-8bit (ORCPT + 99 others); Mon, 30 Dec 2019 02:21:46 -0500 Received: from youngberry.canonical.com ([91.189.89.112]:50983 "EHLO youngberry.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727171AbfL3HVq (ORCPT ); Mon, 30 Dec 2019 02:21:46 -0500 Received: from mail-pf1-f199.google.com ([209.85.210.199]) by youngberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1ilpN0-0003yV-Q8 for linux-kernel@vger.kernel.org; Mon, 30 Dec 2019 07:21:43 +0000 Received: by mail-pf1-f199.google.com with SMTP id r17so24156718pfl.2 for ; Sun, 29 Dec 2019 23:21:42 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:subject:from:in-reply-to:date:cc :content-transfer-encoding:message-id:references:to; bh=HqegK53KmgpbkNTeSmtl1L/hHmvokp76tL5l0PO1vVc=; b=Eivb+ssvg4+3IOXbAhg1MRw5ERM0Hpx24RbB4w8fGnezyO3bGmL3zDI6u0eF1iMpha yGaHqf3oU4FMyMHn80/ZnYJxYvXqmxtezT90CFGPcReC17/oIJioD7SPw83Pq8wFWpnD S40CTpvmQYEpmLiTEA/x0pmIrOYSrzFeqzcHkcFDcaAjWRhps5FqjyyflA3OMY0GiSsb CZtnukcex/ZgarFT6Vdf+nS7fIuU7yazusV7qXWpBoGJdmNSC8f+l3aP1hqi2tNAdaGK 5H5oqPnL+NYEKYURNHJ5TKNQSKfEcNZoTNVr8aAnmoRBq3Anip92jx/BG9eTi0ZWJmMf 0e9w== X-Gm-Message-State: APjAAAXn7mDcGOyFg3LR9hane1Fi9HdVrAdcJgMS5ILUq249FROTO7Zl YvfDmIbyvUyYNDKx1xTYrnYkv4RsUOQ4BWcRubZMHcDzPc8VKw6fJZz5ayh8FeaCwskgKcZYYvt 9sMn56sNJLh5rNzYlJ8OSXNSXPDwWlywRRjL/actEBQ== X-Received: by 2002:a62:5447:: with SMTP id i68mr61034939pfb.44.1577690501260; Sun, 29 Dec 2019 23:21:41 -0800 (PST) X-Received: by 2002:a62:5447:: with SMTP id i68mr61034920pfb.44.1577690500950; Sun, 29 Dec 2019 23:21:40 -0800 (PST) Received: from 2001-b011-380f-35a3-6c61-6579-bbdc-0fed.dynamic-ip6.hinet.net (2001-b011-380f-35a3-6c61-6579-bbdc-0fed.dynamic-ip6.hinet.net. [2001:b011:380f:35a3:6c61:6579:bbdc:fed]) by smtp.gmail.com with ESMTPSA id f9sm48722093pfd.141.2019.12.29.23.21.39 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 29 Dec 2019 23:21:40 -0800 (PST) Content-Type: text/plain; charset=us-ascii Mime-Version: 1.0 (Mac OS X Mail 13.0 \(3608.40.2.2.4\)) Subject: Re: [PATCH] PCI/PM: Report runtime wakeup is not supported if bridge isn't bound to driver From: Kai-Heng Feng In-Reply-To: <4466650.2HG2iOLVKt@kreacher> Date: Mon, 30 Dec 2019 15:21:38 +0800 Cc: bhelgaas@google.com, rafael.j.wysocki@intel.com, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8BIT Message-Id: References: <20191227092405.29588-1-kai.heng.feng@canonical.com> <1948783.ToaVGCCZch@kreacher> <4466650.2HG2iOLVKt@kreacher> To: "Rafael J. Wysocki" X-Mailer: Apple Mail (2.3608.40.2.2.4) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org > On Dec 30, 2019, at 06:37, Rafael J. Wysocki wrote: > > On Friday, December 27, 2019 6:15:26 PM CET Kai-Heng Feng wrote: >> >>> On Dec 27, 2019, at 18:36, Rafael J. Wysocki wrote: >>> >>> On Friday, December 27, 2019 10:24:05 AM CET Kai-Heng Feng wrote: >>>> We have a Pericom USB add-on card that has three USB controller >>>> functions 06:00.[0-2], connected to bridge device 05:03.0, which is >>>> connected to another bridge device 04:00.0: >>>> >>>> -[0000:00]-+-00.0 >>>> +-1c.6-[04-06]----00.0-[05-06]----03.0-[06]--+-00.0 >>>> | +-00.1 >>>> | \-00.2 >>>> >>>> When bridge device (05:03.0) and all three USB controller functions >>>> (06:00.[0-2]) are runtime suspended, they don't get woken up by plugging >>>> USB devices into the add-on card. >>>> >>>> This is because the pcieport driver failed to probe on 04:00.0, since >>>> the device supports neither legacy IRQ, MSI nor MSI-X. Because of that, >>>> there's no native PCIe PME can work for devices connected to it. >>> >>> But in that case the PME driver (drivers/pci/pcie/pme.c) should not bind >>> to the port in question, so the "can_wakeup" flag should not be set for >>> the devices under that port. >> >> We can remove the can_wakeup flag for all its child devices once pcieport probe fails, but I think it's not intuitive. >> >>> >>>> So let's correctly report runtime wakeup isn't supported when any of >>>> PCIe bridges isn't bound to pcieport driver. >>>> >>>> Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=205981 >>>> Signed-off-by: Kai-Heng Feng >>>> --- >>>> drivers/pci/pci.c | 12 ++++++++++++ >>>> 1 file changed, 12 insertions(+) >>>> >>>> diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c >>>> index 951099279192..ca686cfbd65e 100644 >>>> --- a/drivers/pci/pci.c >>>> +++ b/drivers/pci/pci.c >>>> @@ -2493,6 +2493,18 @@ bool pci_dev_run_wake(struct pci_dev *dev) >>>> if (!pci_pme_capable(dev, pci_target_state(dev, true))) >>>> return false; >>>> >>>> + /* If any upstream PCIe bridge isn't bound to pcieport driver, there's >>>> + * no IRQ for PME. >>>> + */ >>>> + if (pci_is_pcie(dev)) { >>>> + while (bus->parent) { >>>> + if (!bus->self->driver) >>>> + return false; >>>> + >>>> + bus = bus->parent; >>>> + } >>>> + } >>>> + >>> >>> So it looks like device_can_wakeup() returns 'true' for this device, but it >>> should return 'false'. >> >> The USB controllers can assert PME#, so it actually can wakeup, in a way. > > Well, that's questionable. > > If there is no known way for the PME to be signaled, we may as well mark the > device as wakeup-incapable. Ok. Reasonable. > >> I think the logical distinction between pci_dev_run_wake() and device_can_wakeup() is that, >> pci_dev_run_wake() means it can actually do runtime wakeup, while device_can_wakeup() >> only means it has the capability to wakeup. Am I correct here? > > Kind of, but the "capability" part is not well defined, so to speak, because > if the device happens to be located below a PCIe port in a low-power state > (say D3hot), the PME "support" declared in the config space is clearly > insufficient. Ok. > >>> >>> Do you know why the "can_wakeup" flag is set for it? >> >> All PCI devices with PME cap calls device_set_wakeup_capable() in pci_pm_init(). > > Right, I forgot about that thing. > > It is inconsistent with the rest of the code, particularly with > pci_dev_run_wake(), so I'd try to drop it. > > IIRC that would require some other pieces of code to be reworked to avoid > regressions, though. Ok. So I'll work on a v2 patch on top of your change. > >>> >>>> if (device_can_wakeup(&dev->dev)) >>>> return true; >>>> >>>> >>> >>> Moreover, even if the native PME is not supported, there can be an ACPI GPE (or >>> equivalent) that triggers when WAKE# is asserted by one of the PCIe devices >>> connected to it, so the test added by this patch cannot be used in general. >> >> Ok. So how to know when both native PME isn't supported and it doesn't use ACPI GPE? > > If the PME driver doesn't bind to the device's root port, the native PME cannot > work. > > If there is no wakeup GPE, pci_acpi_setup() will not call > device_set_wakeup_capable() for the device. Thanks for the info. Does adding a check on adev->wakeup.flags.valid sufficiently cover all cases for this patch? > >> I thought ACPI GPE only works for devices directly connect to Root Complex, but I can't find the reference now. > > No, that's not the case. > > It can work for any devices (even old-style PCI, non-PCIe) with PME# connected > to a dedicated WAKE# pin on the board (which then is represented as an ACPI GPE > or a GPIO IRQ). Ok, didn't know that. > >> >> Another short-term workaround is to make pci_pme_list_scan() not skip bridge when it's in D3hot: > > No, that would not be safe in general. > > Basically, pci_finish_runtime_suspend() needs to enable wakeup for devices > that can do PME even though can_wakeup is not set for them, as long as > pci_pme_list_scan() can reach them. That should be sufficient to cover > all of the practically relevant cases. Understand. Kai-Heng > > >