diff mbox

drm/radeon: fix freeze for laptop with Turks/Thames GPU.

Message ID 1433525637-10174-1-git-send-email-j.glisse@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jerome Glisse June 5, 2015, 5:33 p.m. UTC
From: Jérôme Glisse <jglisse@redhat.com>

Laptop with Turks/Thames GPU will freeze if dpm is enabled. It seems
the SMC engine is relying on some state inside the CP engine. CP needs
to chew at least one packet for it to get in good state for dynamic
power management.

This patch simply disabled and re-enable DPM after the ring test which
is enough to avoid the freeze.

Signed-off-by: Jérôme Glisse <jglisse@redhat.com>
Cc: stable@vger.kernel.org
---
 drivers/gpu/drm/radeon/radeon_device.c |   15 +++++++++++++++
 1 files changed, 15 insertions(+), 0 deletions(-)

Comments

Alex Deucher June 9, 2015, 3:31 p.m. UTC | #1
On Fri, Jun 5, 2015 at 1:33 PM,  <j.glisse@gmail.com> wrote:
> From: Jérôme Glisse <jglisse@redhat.com>
>
> Laptop with Turks/Thames GPU will freeze if dpm is enabled. It seems
> the SMC engine is relying on some state inside the CP engine. CP needs
> to chew at least one packet for it to get in good state for dynamic
> power management.
>
> This patch simply disabled and re-enable DPM after the ring test which
> is enough to avoid the freeze.
>
> Signed-off-by: Jérôme Glisse <jglisse@redhat.com>
> Cc: stable@vger.kernel.org

Applied.  thanks!

Alex


> ---
>  drivers/gpu/drm/radeon/radeon_device.c |   15 +++++++++++++++
>  1 files changed, 15 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
> index b7ca4c5..a7fdfa4 100644
> --- a/drivers/gpu/drm/radeon/radeon_device.c
> +++ b/drivers/gpu/drm/radeon/radeon_device.c
> @@ -1463,6 +1463,21 @@ int radeon_device_init(struct radeon_device *rdev,
>         if (r)
>                 DRM_ERROR("ib ring test failed (%d).\n", r);
>
> +       /*
> +        * Turks/Thames GPU will freeze whole laptop if DPM is not restarted
> +        * after the CP ring have chew one packet at least. Hence here we stop
> +        * and restart DPM after the radeon_ib_ring_tests().
> +        */
> +       if (rdev->pm.dpm_enabled &&
> +           (rdev->pm.pm_method == PM_METHOD_DPM) &&
> +           (rdev->family == CHIP_TURKS) &&
> +           (rdev->flags & RADEON_IS_MOBILITY)) {
> +               mutex_lock(&rdev->pm.mutex);
> +               radeon_dpm_disable(rdev);
> +               radeon_dpm_enable(rdev);
> +               mutex_unlock(&rdev->pm.mutex);
> +       }
> +
>         if ((radeon_testing & 1)) {
>                 if (rdev->accel_working)
>                         radeon_test_moves(rdev);
> --
> 1.7.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
diff mbox

Patch

diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index b7ca4c5..a7fdfa4 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -1463,6 +1463,21 @@  int radeon_device_init(struct radeon_device *rdev,
 	if (r)
 		DRM_ERROR("ib ring test failed (%d).\n", r);
 
+	/*
+	 * Turks/Thames GPU will freeze whole laptop if DPM is not restarted
+	 * after the CP ring have chew one packet at least. Hence here we stop
+	 * and restart DPM after the radeon_ib_ring_tests().
+	 */
+	if (rdev->pm.dpm_enabled &&
+	    (rdev->pm.pm_method == PM_METHOD_DPM) &&
+	    (rdev->family == CHIP_TURKS) &&
+	    (rdev->flags & RADEON_IS_MOBILITY)) {
+		mutex_lock(&rdev->pm.mutex);
+		radeon_dpm_disable(rdev);
+		radeon_dpm_enable(rdev);
+		mutex_unlock(&rdev->pm.mutex);
+	}
+
 	if ((radeon_testing & 1)) {
 		if (rdev->accel_working)
 			radeon_test_moves(rdev);