From: Peter Wu <peter@lekensteyn.nl>
To: Mika Westerberg <mika.westerberg@linux.intel.com>
Cc: nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org,
Dave Airlie <airlied@redhat.com>,
Bjorn Helgaas <helgaas@kernel.org>,
linux-pci@vger.kernel.org, linux-pm@vger.kernel.org
Subject: Re: [PATCH 4/4] drm/nouveau/acpi: fix lockup with PCIe runtime PM
Date: Fri, 27 May 2016 13:10:37 +0200 [thread overview]
Message-ID: <20160527111037.GA1436@al> (raw)
In-Reply-To: <20160525135535.GN1789@lahna.fi.intel.com>
On Wed, May 25, 2016 at 04:55:35PM +0300, Mika Westerberg wrote:
> On Wed, May 25, 2016 at 12:53:01AM +0200, Peter Wu wrote:
> > Since "PCI: Add runtime PM support for PCIe ports", the parent PCIe port
> > can be runtime-suspended which disables power resources via ACPI. This
> > is incompatible with DSM, resulting in a GPU device which is still in D3
> > and locks up the kernel on resume.
> >
> > Mirror the behavior of Windows 8 and newer[1] (as observed via an AMLi
> > debugger trace) and stop using the DSM functions for D3cold when power
> > resources are available on the parent PCIe port.
> >
> > [1]: https://msdn.microsoft.com/windows/hardware/drivers/bringup/firmware-requirements-for-d3cold
> >
> > Signed-off-by: Peter Wu <peter@lekensteyn.nl>
> > ---
> > drivers/gpu/drm/nouveau/nouveau_acpi.c | 34 ++++++++++++++++++++++++++++++----
> > 1 file changed, 30 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c
> > index df9f73e..e469df7 100644
> > --- a/drivers/gpu/drm/nouveau/nouveau_acpi.c
> > +++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c
> > @@ -46,6 +46,7 @@ static struct nouveau_dsm_priv {
> > bool dsm_detected;
> > bool optimus_detected;
> > bool optimus_flags_detected;
> > + bool optimus_skip_dsm;
> > acpi_handle dhandle;
> > acpi_handle rom_handle;
> > } nouveau_dsm_priv;
> > @@ -212,8 +213,26 @@ static const struct vga_switcheroo_handler nouveau_dsm_handler = {
> > .get_client_id = nouveau_dsm_get_client_id,
> > };
> >
> > +/* Firmware supporting Windows 8 or later do not use _DSM to put the device into
> > + * D3cold, they instead rely on disabling power resources on the parent. */
> > +static bool nouveau_pr3_present(struct pci_dev *pdev)
> > +{
> > + struct pci_dev *parent_pdev = pci_upstream_bridge(pdev);
> > + struct acpi_device *ad;
>
> Nit: please call this adev instead of ad.
Will do.
> > +
> > + if (!parent_pdev)
> > + return false;
> > +
> > + ad = ACPI_COMPANION(&parent_pdev->dev);
> > + if (!ad)
> > + return false;
> > +
> > + return ad->power.flags.power_resources;
>
> Is this sufficient to tell if the parent device has _PR3? I thought it
> returns true if it has power resources in general, not necessarily _PR3.
>
> Otherwise this looks okay to me.
It is indeed set whenever there is any _PRx method. I wonder if it is
appropriate to access fields directly like this, perhaps this would be
more accurate (based on device_pm.c):
/* Check whether the _PR3 method is available. */
return adev->power.states[ACPI_STATE_D3_COLD].flags.valid;
I am also considering adding a check in case the pcieport driver does
not support D3cold via runtime PM, what do you think of this?
if (!parent_pdev)
return false;
/* If the PCIe port does not support D3cold via runtime PM, allow a
* fallback to the Optimus DSM method to put the device in D3cold. */
if (parent_pdev->no_d3cold)
return false;
This is needed to avoid the regression reported in the cover letter, but
also allows pre-2015 systems to (still) have the D3cold possibility.
Out of curiosity I looked up an pre-2015 laptop (found Acer V5-573G,
apparently from November 2013, Windows 8.1) and extracted the ACPI
tables from the BIOS images. BIOS 2.28 (2014/05/13) introduces support
for power resources on the parent devicea(\_SB.PCI0.PEG0._PR3 and a
related NVP3 device) when _OSI("Windows 2013") is true. (This is added
as alternative for the old DSM interface.)
Maybe 2014 is also an appropriate cutoff date? I wonder if it is
feasible to detect firmware use of _OSI("Windows 2013") and use that
instead of the BIOS year.
--
Kind regards,
Peter Wu
https://lekensteyn.nl
WARNING: multiple messages have this Message-ID (diff)
From: Peter Wu <peter-VTkQYDcBqhK7DlmcbJSQ7g@public.gmane.org>
To: Mika Westerberg
<mika.westerberg-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
Cc: linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org,
Bjorn Helgaas <helgaas-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org,
Dave Airlie <airlied-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Subject: Re: [PATCH 4/4] drm/nouveau/acpi: fix lockup with PCIe runtime PM
Date: Fri, 27 May 2016 13:10:37 +0200 [thread overview]
Message-ID: <20160527111037.GA1436@al> (raw)
In-Reply-To: <20160525135535.GN1789-3PARRvDOhMZrdx17CPfAsdBPR1lH4CV8@public.gmane.org>
On Wed, May 25, 2016 at 04:55:35PM +0300, Mika Westerberg wrote:
> On Wed, May 25, 2016 at 12:53:01AM +0200, Peter Wu wrote:
> > Since "PCI: Add runtime PM support for PCIe ports", the parent PCIe port
> > can be runtime-suspended which disables power resources via ACPI. This
> > is incompatible with DSM, resulting in a GPU device which is still in D3
> > and locks up the kernel on resume.
> >
> > Mirror the behavior of Windows 8 and newer[1] (as observed via an AMLi
> > debugger trace) and stop using the DSM functions for D3cold when power
> > resources are available on the parent PCIe port.
> >
> > [1]: https://msdn.microsoft.com/windows/hardware/drivers/bringup/firmware-requirements-for-d3cold
> >
> > Signed-off-by: Peter Wu <peter@lekensteyn.nl>
> > ---
> > drivers/gpu/drm/nouveau/nouveau_acpi.c | 34 ++++++++++++++++++++++++++++++----
> > 1 file changed, 30 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c
> > index df9f73e..e469df7 100644
> > --- a/drivers/gpu/drm/nouveau/nouveau_acpi.c
> > +++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c
> > @@ -46,6 +46,7 @@ static struct nouveau_dsm_priv {
> > bool dsm_detected;
> > bool optimus_detected;
> > bool optimus_flags_detected;
> > + bool optimus_skip_dsm;
> > acpi_handle dhandle;
> > acpi_handle rom_handle;
> > } nouveau_dsm_priv;
> > @@ -212,8 +213,26 @@ static const struct vga_switcheroo_handler nouveau_dsm_handler = {
> > .get_client_id = nouveau_dsm_get_client_id,
> > };
> >
> > +/* Firmware supporting Windows 8 or later do not use _DSM to put the device into
> > + * D3cold, they instead rely on disabling power resources on the parent. */
> > +static bool nouveau_pr3_present(struct pci_dev *pdev)
> > +{
> > + struct pci_dev *parent_pdev = pci_upstream_bridge(pdev);
> > + struct acpi_device *ad;
>
> Nit: please call this adev instead of ad.
Will do.
> > +
> > + if (!parent_pdev)
> > + return false;
> > +
> > + ad = ACPI_COMPANION(&parent_pdev->dev);
> > + if (!ad)
> > + return false;
> > +
> > + return ad->power.flags.power_resources;
>
> Is this sufficient to tell if the parent device has _PR3? I thought it
> returns true if it has power resources in general, not necessarily _PR3.
>
> Otherwise this looks okay to me.
It is indeed set whenever there is any _PRx method. I wonder if it is
appropriate to access fields directly like this, perhaps this would be
more accurate (based on device_pm.c):
/* Check whether the _PR3 method is available. */
return adev->power.states[ACPI_STATE_D3_COLD].flags.valid;
I am also considering adding a check in case the pcieport driver does
not support D3cold via runtime PM, what do you think of this?
if (!parent_pdev)
return false;
/* If the PCIe port does not support D3cold via runtime PM, allow a
* fallback to the Optimus DSM method to put the device in D3cold. */
if (parent_pdev->no_d3cold)
return false;
This is needed to avoid the regression reported in the cover letter, but
also allows pre-2015 systems to (still) have the D3cold possibility.
Out of curiosity I looked up an pre-2015 laptop (found Acer V5-573G,
apparently from November 2013, Windows 8.1) and extracted the ACPI
tables from the BIOS images. BIOS 2.28 (2014/05/13) introduces support
for power resources on the parent devicea(\_SB.PCI0.PEG0._PR3 and a
related NVP3 device) when _OSI("Windows 2013") is true. (This is added
as alternative for the old DSM interface.)
Maybe 2014 is also an appropriate cutoff date? I wonder if it is
feasible to detect firmware use of _OSI("Windows 2013") and use that
instead of the BIOS year.
--
Kind regards,
Peter Wu
https://lekensteyn.nl
_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau
next prev parent reply other threads:[~2016-05-27 11:10 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-24 22:52 [PATCH 0/4] nouveau fixes for RPM/Optimus-related hangs Peter Wu
[not found] ` <1464130381-4797-1-git-send-email-peter-VTkQYDcBqhK7DlmcbJSQ7g@public.gmane.org>
2016-05-24 22:52 ` [PATCH 1/4] drm/nouveau/acpi: ensure matching ACPI handle and supported functions Peter Wu
2016-05-24 22:52 ` [PATCH 2/4] drm/nouveau/acpi: return supported DSM functions Peter Wu
2016-05-24 22:53 ` [PATCH 3/4] drm/nouveau/acpi: check for function 0x1B before using it Peter Wu
2016-05-24 22:53 ` [PATCH 4/4] drm/nouveau/acpi: fix lockup with PCIe runtime PM Peter Wu
2016-05-24 22:53 ` Peter Wu
2016-05-25 13:55 ` Mika Westerberg
2016-05-27 11:10 ` Peter Wu [this message]
2016-05-27 11:10 ` Peter Wu
2016-05-27 11:55 ` [Nouveau] " Hans de Goede
2016-05-30 9:57 ` Mika Westerberg
2016-05-30 9:57 ` Mika Westerberg
2016-05-30 12:20 ` Peter Wu
2016-05-30 12:20 ` Peter Wu
2016-05-30 13:09 ` Mika Westerberg
2016-05-30 13:09 ` Mika Westerberg
2016-05-30 16:13 ` Peter Wu
2016-05-30 16:13 ` Peter Wu
2016-05-31 8:43 ` Mika Westerberg
2016-05-31 11:02 ` Peter Wu
2016-05-31 11:02 ` Peter Wu
2016-06-01 9:28 ` Mika Westerberg
2016-06-01 17:21 ` Peter Wu
2016-06-01 17:21 ` Peter Wu
2016-05-31 12:20 ` [Nouveau] " Lukas Wunner
2016-05-31 12:20 ` Lukas Wunner
2016-06-01 16:51 ` [Nouveau] " Peter Wu
2016-06-01 16:51 ` Peter Wu
2016-06-01 17:40 ` [Nouveau] " Lukas Wunner
2016-05-27 13:01 ` Emil Velikov
2016-05-27 21:31 ` Peter Wu
2016-05-27 21:31 ` Peter Wu
2016-05-28 12:27 ` [Nouveau] " Lukas Wunner
2016-05-28 12:27 ` Lukas Wunner
2016-05-30 10:48 ` [Nouveau] " Emil Velikov
2016-05-30 11:23 ` Peter Wu
2016-05-30 11:23 ` Peter Wu
2016-05-30 12:41 ` [Nouveau] " Emil Velikov
2016-05-30 12:41 ` Emil Velikov
2016-05-25 9:08 ` [Nouveau] [PATCH 0/4] nouveau fixes for RPM/Optimus-related hangs Hans de Goede
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=20160527111037.GA1436@al \
--to=peter@lekensteyn.nl \
--cc=airlied@redhat.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=helgaas@kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=mika.westerberg@linux.intel.com \
--cc=nouveau@lists.freedesktop.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.