From: Bjorn Helgaas <helgaas@kernel.org>
To: Manivannan Sadhasivam <mani@kernel.org>
Cc: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>,
bhelgaas@google.com, lukas@wunner.de, linux-pci@vger.kernel.org,
linux-kernel@vger.kernel.org, stable@vger.kernel.org,
Jim Quinlan <james.quinlan@broadcom.com>,
Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Subject: Re: [PATCH v2] PCI/pwrctrl: Skip creating pwrctrl device unless CONFIG_PCI_PWRCTRL is enabled
Date: Wed, 2 Jul 2025 15:04:22 -0500 [thread overview]
Message-ID: <20250702200422.GA1897177@bhelgaas> (raw)
In-Reply-To: <ezlr2xqy5bnq6cnrrjltlim7oiorcy2xrsoclj6fnu5jcymie5@xfatlrts6vod>
On Thu, Jul 03, 2025 at 12:00:43AM +0530, Manivannan Sadhasivam wrote:
> On Wed, Jul 02, 2025 at 12:53:07PM GMT, Bjorn Helgaas wrote:
> > On Wed, Jul 02, 2025 at 12:17:00PM +0530, Manivannan Sadhasivam wrote:
> > > On Tue, Jul 01, 2025 at 03:35:26PM -0500, Bjorn Helgaas wrote:
> > > > [+cc Bart]
> > > >
> > > > On Tue, Jul 01, 2025 at 12:17:31PM +0530, Manivannan Sadhasivam wrote:
> > > > > If devicetree describes power supplies related to a PCI device, we
> > > > > previously created a pwrctrl device even if CONFIG_PCI_PWRCTL was
> > > > > not enabled.
> > > > >
> > > > > When pci_pwrctrl_create_device() creates and returns a pwrctrl device,
> > > > > pci_scan_device() doesn't enumerate the PCI device. It assumes the pwrctrl
> > > > > core will rescan the bus after turning on the power. However, if
> > > > > CONFIG_PCI_PWRCTL is not enabled, the rescan never happens.
> > > >
> > > > Separate from this patch, can we refine the comment in
> > > > pci_scan_device() to explain *why* we should skip scanning if a
> > > > pwrctrl device was created? The current comment leaves me with two
> > > > questions:
> > > >
> > > > 1) How do we know the pwrctrl device is currently off? If it is
> > > > already on, why should we defer enumerating the device?
> > >
> > > I believe you meant to ask "how do we know the PCI device is
> > > currently off". If the pwrctrl device is created, then we for sure
> > > know that the pwrctrl driver will power on the PCI device at some
> > > point (depending on when the driver gets loaded). Even if the device
> > > was already powered on, we do not want to probe the client driver
> > > because, we have seen race between pwrctrl driver and PCI client
> > > driver probing in parallel. So I had imposed a devlink dependency
> > > (see b458ff7e8176) that makes sure that the PCI client driver
> > > wouldn't get probed until the pwrctrl driver (if the pwrctrl device
> > > was created) is probed. This will ensure that the PCI device state
> > > is reset and initialized by the pwrctrl driver before the client
> > > driver probes.
> >
> > I'm confused about this. Assume there is a pwrctrl device and the
> > related PCI device is already powered on when Linux boots. Apparently
> > we do NOT want to enumerate the PCI device? We want to wait for the
> > pwrctrl driver to claim the pwrctrl device and do a rescan? Even
> > though the pwrctrl driver may be a loadable module and may not even be
> > available at all?
> >
> > It seems to me that a PCI device that is already powered on should be
> > enumerated and made available. If there's a pwrctrl device for it,
> > and we decide to load pwrctrl, then we also get the ability to turn
> > the PCI device off and on again as needed. But if we *don't* load
> > pwrctrl, it seems like we should still be able to use a PCI device
> > that's already powered on.
>
> The problem with enumerating the PCI device which was already
> powered on is that the pwrctrl driver cannot reliably know whether
> the device is powered on or not. So by the time the pwrctrl driver
> probes, the client driver might also be probing. For the case of
> WLAN chipsets, the pwrctrl driver used to sample the EN (Enable)
> GPIO pin to know whether the device is powered on or not (see
> a9aaf1ff88a8), but that also turned out to be racy and people were
> complaining.
>
> So to simplify things, we enforced this dependency.
Oh, thank you! This inability of pwrctrl to determine the current
device power state is a critical missing piece in understanding the
race.
Although d8b762070c3f ("power: sequencing: qcom-wcn: set the
wlan-enable GPIO to output") suggests that gpiod_get_value_cansleep()
*does* read the current GPIO state, i.e., the current device power
state.
29da3e8748f9 ("power: sequencing: qcom-wcn: explain why we need the
WLAN_EN GPIO hack") adds a comment that we *should* use GPIOD_OUT_LOW
(which would toggle WLAN power) but can't until the qcom controller
driver implements link-down handling.
Is power-cycling the PCI device when pwrctrl loads a requirement of
the pwrctrl design? A power cycle adds significant latency, so it
seems a little aggressive to me unless it is absolutely required.
29da3e8748f9 also mentions some platforms that still fail to probe
WLAN due to some unspecified qcom issue that needs a workaround, so I
guess this is still an open issue?
So I wonder if this inability to determine the current power state is
real or just an artifact of the various workarounds so far.
> > > > 2) If the pwrctrl device is currently off, won't the Vendor ID read
> > > > just fail like it does for every other non-existent device? If
> > > > so, why can't we just let that happen?
> > >
> > > Again, it is not the pwrctrl device that is off, it is the PCI
> > > device. If it is not turned on, yes VID read will fail, but why do
> > > we need to read the VID in the first place if we know that the PCI
> > > device requires pwrctrl and the pwrctrl driver is going to be probed
> > > later.
> >
> > I was assuming pwrctrl is only required if we want to turn the PCI
> > device power on or off. Maybe that's not true?
>
> Pretty much so, but we will also use it to do D3Cold (during system
> suspend) in the near future.
Turning main power on and off is exactly what D3cold is about. I
expected this kind of use for suspend, which is why I asked about
overlap with ACPI, which also provides ways to control main power.
Bjorn
next prev parent reply other threads:[~2025-07-02 20:04 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-01 6:47 [PATCH v2] PCI/pwrctrl: Skip creating pwrctrl device unless CONFIG_PCI_PWRCTRL is enabled Manivannan Sadhasivam
2025-07-01 7:00 ` Lukas Wunner
2025-07-01 11:57 ` Manivannan Sadhasivam
2025-07-01 12:49 ` Lukas Wunner
2025-07-01 20:35 ` Bjorn Helgaas
2025-07-02 6:47 ` Manivannan Sadhasivam
2025-07-02 17:53 ` Bjorn Helgaas
2025-07-02 18:30 ` Manivannan Sadhasivam
2025-07-02 20:04 ` Bjorn Helgaas [this message]
2025-07-01 21:01 ` Bjorn Helgaas
2025-07-02 7:20 ` Manivannan Sadhasivam
2025-07-22 18:58 ` Bjorn Helgaas
2025-07-22 19:15 ` Bjorn Helgaas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250702200422.GA1897177@bhelgaas \
--to=helgaas@kernel.org \
--cc=bartosz.golaszewski@linaro.org \
--cc=bhelgaas@google.com \
--cc=james.quinlan@broadcom.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lukas@wunner.de \
--cc=mani@kernel.org \
--cc=manivannan.sadhasivam@linaro.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox