From: Jani Nikula <jani.nikula@intel.com>
To: Imre Deak <imre.deak@intel.com>, intel-gfx@lists.freedesktop.org
Cc: "Daniel Vetter" <daniel.vetter@ffwll.ch>,
linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
"Bjørn Mork" <bjorn@mork.no>
Subject: Re: [PATCH v2] drm/i915: gen4: work around hang during hibernation
Date: Mon, 02 Mar 2015 14:29:25 +0200 [thread overview]
Message-ID: <87385n60re.fsf@intel.com> (raw)
In-Reply-To: <1425294281-7297-1-git-send-email-imre.deak@intel.com>
On Mon, 02 Mar 2015, Imre Deak <imre.deak@intel.com> wrote:
> Bjørn reported that his machine hang during hibernation and eventually
> bisected the problem to the following commit:
>
> commit da2bc1b9db3351addd293e5b82757efe1f77ed1d
> Author: Imre Deak <imre.deak@intel.com>
> Date: Thu Oct 23 19:23:26 2014 +0300
>
> drm/i915: add poweroff_late handler
>
> The problem seems to be that after the kernel puts the device into D3
> the BIOS still tries to access it, or otherwise assumes that it's in D0.
> This is clearly bogus, since ACPI mandates that devices are put into D3
> by the OSPM if they are not wake-up sources. In the future we want to
> unify more of the driver's runtime and system suspend paths, for example
> by skipping all the system suspend/hibernation hooks if the device is
> runtime suspended already. Accordingly for all other platforms the goal
> is still to properly power down the device during hibernation.
>
> v2:
> - Another GEN4 Lenovo laptop had the same issue, while platforms from
> other vendors (including mobile and desktop, GEN4 and non-GEN4) seem
> to work fine. Based on this apply the workaround on all GEN4 Lenovo
> platforms.
> - add code comment about failing platforms (Ville)
>
> Reference: http://lists.freedesktop.org/archives/intel-gfx/2015-February/060633.html
> Reported-and-bisected-by: Bjørn Mork <bjorn@mork.no>
> Signed-off-by: Imre Deak <imre.deak@intel.com>
Bjørn, I would really appreciate your Tested-by on this patch before I
queue it for v4.0 and cc: stable for v3.19.
BR,
Jani.
> ---
> drivers/gpu/drm/i915/i915_drv.c | 30 +++++++++++++++++++++++++-----
> 1 file changed, 25 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
> index 4badb23..ff3662f 100644
> --- a/drivers/gpu/drm/i915/i915_drv.c
> +++ b/drivers/gpu/drm/i915/i915_drv.c
> @@ -637,7 +637,7 @@ static int i915_drm_suspend(struct drm_device *dev)
> return 0;
> }
>
> -static int i915_drm_suspend_late(struct drm_device *drm_dev)
> +static int i915_drm_suspend_late(struct drm_device *drm_dev, bool hibernation)
> {
> struct drm_i915_private *dev_priv = drm_dev->dev_private;
> int ret;
> @@ -651,7 +651,17 @@ static int i915_drm_suspend_late(struct drm_device *drm_dev)
> }
>
> pci_disable_device(drm_dev->pdev);
> - pci_set_power_state(drm_dev->pdev, PCI_D3hot);
> + /*
> + * During hibernation on some GEN4 platforms the BIOS may try to access
> + * the device even though it's already in D3 and hang the machine. So
> + * leave the device in D0 on those platforms and hope the BIOS will
> + * power down the device properly. Platforms where this was seen:
> + * Lenovo Thinkpad X301, X61s
> + */
> + if (!(hibernation &&
> + drm_dev->pdev->subsystem_vendor == PCI_VENDOR_ID_LENOVO &&
> + INTEL_INFO(dev_priv)->gen == 4))
> + pci_set_power_state(drm_dev->pdev, PCI_D3hot);
>
> return 0;
> }
> @@ -677,7 +687,7 @@ int i915_suspend_legacy(struct drm_device *dev, pm_message_t state)
> if (error)
> return error;
>
> - return i915_drm_suspend_late(dev);
> + return i915_drm_suspend_late(dev, false);
> }
>
> static int i915_drm_resume(struct drm_device *dev)
> @@ -965,7 +975,17 @@ static int i915_pm_suspend_late(struct device *dev)
> if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF)
> return 0;
>
> - return i915_drm_suspend_late(drm_dev);
> + return i915_drm_suspend_late(drm_dev, false);
> +}
> +
> +static int i915_pm_poweroff_late(struct device *dev)
> +{
> + struct drm_device *drm_dev = dev_to_i915(dev)->dev;
> +
> + if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF)
> + return 0;
> +
> + return i915_drm_suspend_late(drm_dev, true);
> }
>
> static int i915_pm_resume_early(struct device *dev)
> @@ -1535,7 +1555,7 @@ static const struct dev_pm_ops i915_pm_ops = {
> .thaw_early = i915_pm_resume_early,
> .thaw = i915_pm_resume,
> .poweroff = i915_pm_suspend,
> - .poweroff_late = i915_pm_suspend_late,
> + .poweroff_late = i915_pm_poweroff_late,
> .restore_early = i915_pm_resume_early,
> .restore = i915_pm_resume,
>
> --
> 2.1.0
>
--
Jani Nikula, Intel Open Source Technology Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
WARNING: multiple messages have this Message-ID (diff)
From: Jani Nikula <jani.nikula@intel.com>
To: Imre Deak <imre.deak@intel.com>, intel-gfx@lists.freedesktop.org
Cc: "Bjørn Mork" <bjorn@mork.no>,
linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
"Daniel Vetter" <daniel.vetter@ffwll.ch>,
"Ville Syrjälä" <ville.syrjala@linux.intel.com>,
"David Weinehall" <david.weinehall@linux.intel.com>
Subject: Re: [PATCH v2] drm/i915: gen4: work around hang during hibernation
Date: Mon, 02 Mar 2015 14:29:25 +0200 [thread overview]
Message-ID: <87385n60re.fsf@intel.com> (raw)
In-Reply-To: <1425294281-7297-1-git-send-email-imre.deak@intel.com>
On Mon, 02 Mar 2015, Imre Deak <imre.deak@intel.com> wrote:
> Bjørn reported that his machine hang during hibernation and eventually
> bisected the problem to the following commit:
>
> commit da2bc1b9db3351addd293e5b82757efe1f77ed1d
> Author: Imre Deak <imre.deak@intel.com>
> Date: Thu Oct 23 19:23:26 2014 +0300
>
> drm/i915: add poweroff_late handler
>
> The problem seems to be that after the kernel puts the device into D3
> the BIOS still tries to access it, or otherwise assumes that it's in D0.
> This is clearly bogus, since ACPI mandates that devices are put into D3
> by the OSPM if they are not wake-up sources. In the future we want to
> unify more of the driver's runtime and system suspend paths, for example
> by skipping all the system suspend/hibernation hooks if the device is
> runtime suspended already. Accordingly for all other platforms the goal
> is still to properly power down the device during hibernation.
>
> v2:
> - Another GEN4 Lenovo laptop had the same issue, while platforms from
> other vendors (including mobile and desktop, GEN4 and non-GEN4) seem
> to work fine. Based on this apply the workaround on all GEN4 Lenovo
> platforms.
> - add code comment about failing platforms (Ville)
>
> Reference: http://lists.freedesktop.org/archives/intel-gfx/2015-February/060633.html
> Reported-and-bisected-by: Bjørn Mork <bjorn@mork.no>
> Signed-off-by: Imre Deak <imre.deak@intel.com>
Bjørn, I would really appreciate your Tested-by on this patch before I
queue it for v4.0 and cc: stable for v3.19.
BR,
Jani.
> ---
> drivers/gpu/drm/i915/i915_drv.c | 30 +++++++++++++++++++++++++-----
> 1 file changed, 25 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
> index 4badb23..ff3662f 100644
> --- a/drivers/gpu/drm/i915/i915_drv.c
> +++ b/drivers/gpu/drm/i915/i915_drv.c
> @@ -637,7 +637,7 @@ static int i915_drm_suspend(struct drm_device *dev)
> return 0;
> }
>
> -static int i915_drm_suspend_late(struct drm_device *drm_dev)
> +static int i915_drm_suspend_late(struct drm_device *drm_dev, bool hibernation)
> {
> struct drm_i915_private *dev_priv = drm_dev->dev_private;
> int ret;
> @@ -651,7 +651,17 @@ static int i915_drm_suspend_late(struct drm_device *drm_dev)
> }
>
> pci_disable_device(drm_dev->pdev);
> - pci_set_power_state(drm_dev->pdev, PCI_D3hot);
> + /*
> + * During hibernation on some GEN4 platforms the BIOS may try to access
> + * the device even though it's already in D3 and hang the machine. So
> + * leave the device in D0 on those platforms and hope the BIOS will
> + * power down the device properly. Platforms where this was seen:
> + * Lenovo Thinkpad X301, X61s
> + */
> + if (!(hibernation &&
> + drm_dev->pdev->subsystem_vendor == PCI_VENDOR_ID_LENOVO &&
> + INTEL_INFO(dev_priv)->gen == 4))
> + pci_set_power_state(drm_dev->pdev, PCI_D3hot);
>
> return 0;
> }
> @@ -677,7 +687,7 @@ int i915_suspend_legacy(struct drm_device *dev, pm_message_t state)
> if (error)
> return error;
>
> - return i915_drm_suspend_late(dev);
> + return i915_drm_suspend_late(dev, false);
> }
>
> static int i915_drm_resume(struct drm_device *dev)
> @@ -965,7 +975,17 @@ static int i915_pm_suspend_late(struct device *dev)
> if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF)
> return 0;
>
> - return i915_drm_suspend_late(drm_dev);
> + return i915_drm_suspend_late(drm_dev, false);
> +}
> +
> +static int i915_pm_poweroff_late(struct device *dev)
> +{
> + struct drm_device *drm_dev = dev_to_i915(dev)->dev;
> +
> + if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF)
> + return 0;
> +
> + return i915_drm_suspend_late(drm_dev, true);
> }
>
> static int i915_pm_resume_early(struct device *dev)
> @@ -1535,7 +1555,7 @@ static const struct dev_pm_ops i915_pm_ops = {
> .thaw_early = i915_pm_resume_early,
> .thaw = i915_pm_resume,
> .poweroff = i915_pm_suspend,
> - .poweroff_late = i915_pm_suspend_late,
> + .poweroff_late = i915_pm_poweroff_late,
> .restore_early = i915_pm_resume_early,
> .restore = i915_pm_resume,
>
> --
> 2.1.0
>
--
Jani Nikula, Intel Open Source Technology Center
next prev parent reply other threads:[~2015-03-02 12:29 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-02 11:04 [PATCH v2] drm/i915: gen4: work around hang during hibernation Imre Deak
2015-03-02 11:04 ` Imre Deak
2015-03-02 12:29 ` Jani Nikula [this message]
2015-03-02 12:29 ` Jani Nikula
2015-03-02 13:00 ` Bjørn Mork
2015-03-02 13:00 ` Bjørn Mork
2015-03-04 8:15 ` Jani Nikula
2015-03-04 8:15 ` Jani Nikula
2015-03-03 15:27 ` shuang.he
2015-03-18 9:37 ` Paul Bolle
2015-03-18 9:37 ` Paul Bolle
2015-03-18 10:22 ` Ville Syrjälä
2015-03-18 10:22 ` Ville Syrjälä
2015-03-18 16:22 ` Paul Bolle
2015-03-18 16:22 ` Paul Bolle
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=87385n60re.fsf@intel.com \
--to=jani.nikula@intel.com \
--cc=bjorn@mork.no \
--cc=daniel.vetter@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=imre.deak@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=linux-kernel@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 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.