[kernel/f13/master] - fix radeon suspend/resume issues and two other minor patches

Dave Airlie airlied at fedoraproject.org
Thu Sep 2 11:59:18 UTC 2010


commit c940e9b1b01a072ba773597c84e1495e4bb10394
Author: Dave Airlie <airlied at redhat.com>
Date:   Thu Sep 2 21:54:38 2010 +1000

    - fix radeon suspend/resume issues and two other minor patches

 drm-radeon-resume-fixes.patch |  151 +++++++++++++++++++++++++++++++++++++++++
 kernel.spec                   |    7 ++-
 2 files changed, 157 insertions(+), 1 deletions(-)
---
diff --git a/drm-radeon-resume-fixes.patch b/drm-radeon-resume-fixes.patch
new file mode 100644
index 0000000..ed679aa
--- /dev/null
+++ b/drm-radeon-resume-fixes.patch
@@ -0,0 +1,151 @@
+diff -ur linux-2.6.34.i686/drivers/gpu/drm/radeon/radeon_device.c radeon-fixes.i686/drivers/gpu/drm/radeon/radeon_device.c
+--- linux-2.6.34.i686/drivers/gpu/drm/radeon/radeon_device.c	2010-09-02 21:50:43.000000000 +1000
++++ radeon-fixes.i686/drivers/gpu/drm/radeon/radeon_device.c	2010-09-02 21:13:09.000000000 +1000
+@@ -777,6 +777,7 @@
+ 
+ int radeon_resume_kms(struct drm_device *dev)
+ {
++	struct drm_connector *connector;
+ 	struct radeon_device *rdev = dev->dev_private;
+ 
+ 	if (rdev->powered_down)
+@@ -795,6 +796,12 @@
+ 	radeon_resume(rdev);
+ 	radeon_pm_resume(rdev);
+ 	radeon_restore_bios_scratch_regs(rdev);
++
++	/* turn on display hw */
++	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
++		drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
++	}
++
+ 	radeon_fbdev_set_suspend(rdev, 0);
+ 	release_console_sem();
+ 
+diff -ur linux-2.6.34.i686/drivers/gpu/drm/radeon/radeon.h radeon-fixes.i686/drivers/gpu/drm/radeon/radeon.h
+--- linux-2.6.34.i686/drivers/gpu/drm/radeon/radeon.h	2010-09-02 21:50:42.000000000 +1000
++++ radeon-fixes.i686/drivers/gpu/drm/radeon/radeon.h	2010-09-02 21:36:50.000000000 +1000
+@@ -620,7 +620,8 @@
+ 	DYNPM_STATE_DISABLED,
+ 	DYNPM_STATE_MINIMUM,
+ 	DYNPM_STATE_PAUSED,
+-	DYNPM_STATE_ACTIVE
++	DYNPM_STATE_ACTIVE,
++	DYNPM_STATE_SUSPENDED,
+ };
+ enum radeon_dynpm_action {
+ 	DYNPM_ACTION_NONE,
+diff -ur linux-2.6.34.i686/drivers/gpu/drm/radeon/radeon_pm.c radeon-fixes.i686/drivers/gpu/drm/radeon/radeon_pm.c
+--- linux-2.6.34.i686/drivers/gpu/drm/radeon/radeon_pm.c	2010-09-02 21:50:42.000000000 +1000
++++ radeon-fixes.i686/drivers/gpu/drm/radeon/radeon_pm.c	2010-09-02 21:36:50.000000000 +1000
+@@ -397,13 +397,20 @@
+ 		rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT;
+ 		mutex_unlock(&rdev->pm.mutex);
+ 	} else if (strncmp("profile", buf, strlen("profile")) == 0) {
++		bool flush_wq = false;
++
+ 		mutex_lock(&rdev->pm.mutex);
+-		rdev->pm.pm_method = PM_METHOD_PROFILE;
++		if (rdev->pm.pm_method == PM_METHOD_DYNPM) {
++			cancel_delayed_work(&rdev->pm.dynpm_idle_work);
++			flush_wq = true;
++		}
+ 		/* disable dynpm */
+ 		rdev->pm.dynpm_state = DYNPM_STATE_DISABLED;
+ 		rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE;
+-		cancel_delayed_work(&rdev->pm.dynpm_idle_work);
++		rdev->pm.pm_method = PM_METHOD_PROFILE;
+ 		mutex_unlock(&rdev->pm.mutex);
++		if (flush_wq)
++			flush_workqueue(rdev->wq);
+ 	} else {
+ 		DRM_ERROR("invalid power method!\n");
+ 		goto fail;
+@@ -418,9 +425,18 @@
+ 
+ void radeon_pm_suspend(struct radeon_device *rdev)
+ {
++	bool flush_wq = false;
++
+ 	mutex_lock(&rdev->pm.mutex);
+-	cancel_delayed_work(&rdev->pm.dynpm_idle_work);
++	if (rdev->pm.pm_method == PM_METHOD_DYNPM) {
++		cancel_delayed_work(&rdev->pm.dynpm_idle_work);
++		if (rdev->pm.dynpm_state == DYNPM_STATE_ACTIVE)
++			rdev->pm.dynpm_state = DYNPM_STATE_SUSPENDED;
++		flush_wq = true;
++	}
+ 	mutex_unlock(&rdev->pm.mutex);
++	if (flush_wq)
++		flush_workqueue(rdev->wq);
+ }
+ 
+ void radeon_pm_resume(struct radeon_device *rdev)
+@@ -432,6 +448,12 @@
+ 	rdev->pm.current_sclk = rdev->clock.default_sclk;
+ 	rdev->pm.current_mclk = rdev->clock.default_mclk;
+ 	rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage;
++	if (rdev->pm.pm_method == PM_METHOD_DYNPM
++	    && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) {
++		rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE;
++		queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work,
++					msecs_to_jiffies(RADEON_IDLE_LOOP_MS));
++	}
+ 	mutex_unlock(&rdev->pm.mutex);
+ 	radeon_pm_compute_clocks(rdev);
+ }
+@@ -486,6 +508,8 @@
+ void radeon_pm_fini(struct radeon_device *rdev)
+ {
+ 	if (rdev->pm.num_power_states > 1) {
++		bool flush_wq = false;
++
+ 		mutex_lock(&rdev->pm.mutex);
+ 		if (rdev->pm.pm_method == PM_METHOD_PROFILE) {
+ 			rdev->pm.profile = PM_PROFILE_DEFAULT;
+@@ -493,13 +517,16 @@
+ 			radeon_pm_set_clocks(rdev);
+ 		} else if (rdev->pm.pm_method == PM_METHOD_DYNPM) {
+ 			/* cancel work */
+-			cancel_delayed_work_sync(&rdev->pm.dynpm_idle_work);
++			cancel_delayed_work(&rdev->pm.dynpm_idle_work);
++			flush_wq = true;
+ 			/* reset default clocks */
+ 			rdev->pm.dynpm_state = DYNPM_STATE_DISABLED;
+ 			rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT;
+ 			radeon_pm_set_clocks(rdev);
+ 		}
+ 		mutex_unlock(&rdev->pm.mutex);
++		if (flush_wq)
++			flush_workqueue(rdev->wq);
+ 
+ 		device_remove_file(rdev->dev, &dev_attr_power_profile);
+ 		device_remove_file(rdev->dev, &dev_attr_power_method);
+@@ -720,12 +747,12 @@
+ 			radeon_pm_get_dynpm_state(rdev);
+ 			radeon_pm_set_clocks(rdev);
+ 		}
++
++		queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work,
++					msecs_to_jiffies(RADEON_IDLE_LOOP_MS));
+ 	}
+ 	mutex_unlock(&rdev->pm.mutex);
+ 	ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched);
+-
+-	queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work,
+-					msecs_to_jiffies(RADEON_IDLE_LOOP_MS));
+ }
+ 
+ /*
+diff -ur linux-2.6.34.i686/drivers/gpu/drm/ttm/ttm_page_alloc.c radeon-fixes.i686/drivers/gpu/drm/ttm/ttm_page_alloc.c
+--- linux-2.6.34.i686/drivers/gpu/drm/ttm/ttm_page_alloc.c	2010-09-02 21:50:42.000000000 +1000
++++ radeon-fixes.i686/drivers/gpu/drm/ttm/ttm_page_alloc.c	2010-09-02 21:13:14.000000000 +1000
+@@ -667,7 +667,7 @@
+ {
+ 	struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
+ 	struct page *p = NULL;
+-	int gfp_flags = 0;
++	int gfp_flags = GFP_USER;
+ 	int r;
+ 
+ 	/* set zero flag for page allocation if required */
diff --git a/kernel.spec b/kernel.spec
index 2116966..8162e47 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -48,7 +48,7 @@ Summary: The Linux kernel
 # reset this by hand to 1 (or to 0 and then use rpmdev-bumpspec).
 # scripts/rebase.sh should be made to do that for you, actually.
 #
-%global baserelease 48
+%global baserelease 49
 %global fedora_build %{baserelease}
 
 # base_sublevel is the kernel version we're starting with and patching
@@ -699,6 +699,7 @@ Patch1821: i915-fix-crt-hotplug-regression.patch
 Patch1824: drm-intel-next.patch
 # make sure the lvds comes back on lid open
 Patch1825: drm-intel-make-lvds-work.patch
+Patch1826: drm-radeon-resume-fixes.patch
 Patch1900: linux-2.6-intel-iommu-igfx.patch
 # radeon
 
@@ -1347,6 +1348,7 @@ ApplyPatch drm-intel-big-hammer.patch
 ApplyOptionalPatch drm-intel-next.patch
 ApplyPatch drm-intel-make-lvds-work.patch
 
+ApplyPatch drm-radeon-resume-fixes.patch
 ApplyPatch linux-2.6-intel-iommu-igfx.patch
 
 # linux1394 git patches
@@ -2045,6 +2047,9 @@ fi
 
 
 %changelog
+* Thu Sep 02 2010 Dave Airlie <airlied at redhat.com> 2.6.34.6-49
+- fix radeon suspend/resume issues and two other minor patches
+
 * Wed Sep 01 2010 Chuck Ebbert <cebbert at redhat.com>  2.6.34.6-48
 - Revert commit 6a1a82df91fa0eb1cc76069a9efe5714d087eccd from 2.6.34.1;
   it breaks ftdi_sio (#613597)


More information about the scm-commits mailing list