c940e9b
diff -ur linux-2.6.34.i686/drivers/gpu/drm/radeon/radeon_device.c radeon-fixes.i686/drivers/gpu/drm/radeon/radeon_device.c
c940e9b
--- linux-2.6.34.i686/drivers/gpu/drm/radeon/radeon_device.c	2010-09-02 21:50:43.000000000 +1000
c940e9b
+++ radeon-fixes.i686/drivers/gpu/drm/radeon/radeon_device.c	2010-09-02 21:13:09.000000000 +1000
c940e9b
@@ -777,6 +777,7 @@
c940e9b
 
c940e9b
 int radeon_resume_kms(struct drm_device *dev)
c940e9b
 {
c940e9b
+	struct drm_connector *connector;
c940e9b
 	struct radeon_device *rdev = dev->dev_private;
c940e9b
 
c940e9b
 	if (rdev->powered_down)
c940e9b
@@ -795,6 +796,12 @@
c940e9b
 	radeon_resume(rdev);
c940e9b
 	radeon_pm_resume(rdev);
c940e9b
 	radeon_restore_bios_scratch_regs(rdev);
c940e9b
+
c940e9b
+	/* turn on display hw */
c940e9b
+	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
c940e9b
+		drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
c940e9b
+	}
c940e9b
+
c940e9b
 	radeon_fbdev_set_suspend(rdev, 0);
c940e9b
 	release_console_sem();
c940e9b
 
c940e9b
diff -ur linux-2.6.34.i686/drivers/gpu/drm/radeon/radeon.h radeon-fixes.i686/drivers/gpu/drm/radeon/radeon.h
c940e9b
--- linux-2.6.34.i686/drivers/gpu/drm/radeon/radeon.h	2010-09-02 21:50:42.000000000 +1000
c940e9b
+++ radeon-fixes.i686/drivers/gpu/drm/radeon/radeon.h	2010-09-02 21:36:50.000000000 +1000
c940e9b
@@ -620,7 +620,8 @@
c940e9b
 	DYNPM_STATE_DISABLED,
c940e9b
 	DYNPM_STATE_MINIMUM,
c940e9b
 	DYNPM_STATE_PAUSED,
c940e9b
-	DYNPM_STATE_ACTIVE
c940e9b
+	DYNPM_STATE_ACTIVE,
c940e9b
+	DYNPM_STATE_SUSPENDED,
c940e9b
 };
c940e9b
 enum radeon_dynpm_action {
c940e9b
 	DYNPM_ACTION_NONE,
c940e9b
diff -ur linux-2.6.34.i686/drivers/gpu/drm/radeon/radeon_pm.c radeon-fixes.i686/drivers/gpu/drm/radeon/radeon_pm.c
c940e9b
--- linux-2.6.34.i686/drivers/gpu/drm/radeon/radeon_pm.c	2010-09-02 21:50:42.000000000 +1000
c940e9b
+++ radeon-fixes.i686/drivers/gpu/drm/radeon/radeon_pm.c	2010-09-02 21:36:50.000000000 +1000
c940e9b
@@ -397,13 +397,20 @@
c940e9b
 		rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT;
c940e9b
 		mutex_unlock(&rdev->pm.mutex);
c940e9b
 	} else if (strncmp("profile", buf, strlen("profile")) == 0) {
c940e9b
+		bool flush_wq = false;
c940e9b
+
c940e9b
 		mutex_lock(&rdev->pm.mutex);
c940e9b
-		rdev->pm.pm_method = PM_METHOD_PROFILE;
c940e9b
+		if (rdev->pm.pm_method == PM_METHOD_DYNPM) {
c940e9b
+			cancel_delayed_work(&rdev->pm.dynpm_idle_work);
c940e9b
+			flush_wq = true;
c940e9b
+		}
c940e9b
 		/* disable dynpm */
c940e9b
 		rdev->pm.dynpm_state = DYNPM_STATE_DISABLED;
c940e9b
 		rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE;
c940e9b
-		cancel_delayed_work(&rdev->pm.dynpm_idle_work);
c940e9b
+		rdev->pm.pm_method = PM_METHOD_PROFILE;
c940e9b
 		mutex_unlock(&rdev->pm.mutex);
c940e9b
+		if (flush_wq)
c940e9b
+			flush_workqueue(rdev->wq);
c940e9b
 	} else {
c940e9b
 		DRM_ERROR("invalid power method!\n");
c940e9b
 		goto fail;
c940e9b
@@ -418,9 +425,18 @@
c940e9b
 
c940e9b
 void radeon_pm_suspend(struct radeon_device *rdev)
c940e9b
 {
c940e9b
+	bool flush_wq = false;
c940e9b
+
c940e9b
 	mutex_lock(&rdev->pm.mutex);
c940e9b
-	cancel_delayed_work(&rdev->pm.dynpm_idle_work);
c940e9b
+	if (rdev->pm.pm_method == PM_METHOD_DYNPM) {
c940e9b
+		cancel_delayed_work(&rdev->pm.dynpm_idle_work);
c940e9b
+		if (rdev->pm.dynpm_state == DYNPM_STATE_ACTIVE)
c940e9b
+			rdev->pm.dynpm_state = DYNPM_STATE_SUSPENDED;
c940e9b
+		flush_wq = true;
c940e9b
+	}
c940e9b
 	mutex_unlock(&rdev->pm.mutex);
c940e9b
+	if (flush_wq)
c940e9b
+		flush_workqueue(rdev->wq);
c940e9b
 }
c940e9b
 
c940e9b
 void radeon_pm_resume(struct radeon_device *rdev)
c940e9b
@@ -432,6 +448,12 @@
c940e9b
 	rdev->pm.current_sclk = rdev->clock.default_sclk;
c940e9b
 	rdev->pm.current_mclk = rdev->clock.default_mclk;
c940e9b
 	rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage;
c940e9b
+	if (rdev->pm.pm_method == PM_METHOD_DYNPM
c940e9b
+	    && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) {
c940e9b
+		rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE;
c940e9b
+		queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work,
c940e9b
+					msecs_to_jiffies(RADEON_IDLE_LOOP_MS));
c940e9b
+	}
c940e9b
 	mutex_unlock(&rdev->pm.mutex);
c940e9b
 	radeon_pm_compute_clocks(rdev);
c940e9b
 }
c940e9b
@@ -486,6 +508,8 @@
c940e9b
 void radeon_pm_fini(struct radeon_device *rdev)
c940e9b
 {
c940e9b
 	if (rdev->pm.num_power_states > 1) {
c940e9b
+		bool flush_wq = false;
c940e9b
+
c940e9b
 		mutex_lock(&rdev->pm.mutex);
c940e9b
 		if (rdev->pm.pm_method == PM_METHOD_PROFILE) {
c940e9b
 			rdev->pm.profile = PM_PROFILE_DEFAULT;
c940e9b
@@ -493,13 +517,16 @@
c940e9b
 			radeon_pm_set_clocks(rdev);
c940e9b
 		} else if (rdev->pm.pm_method == PM_METHOD_DYNPM) {
c940e9b
 			/* cancel work */
c940e9b
-			cancel_delayed_work_sync(&rdev->pm.dynpm_idle_work);
c940e9b
+			cancel_delayed_work(&rdev->pm.dynpm_idle_work);
c940e9b
+			flush_wq = true;
c940e9b
 			/* reset default clocks */
c940e9b
 			rdev->pm.dynpm_state = DYNPM_STATE_DISABLED;
c940e9b
 			rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT;
c940e9b
 			radeon_pm_set_clocks(rdev);
c940e9b
 		}
c940e9b
 		mutex_unlock(&rdev->pm.mutex);
c940e9b
+		if (flush_wq)
c940e9b
+			flush_workqueue(rdev->wq);
c940e9b
 
c940e9b
 		device_remove_file(rdev->dev, &dev_attr_power_profile);
c940e9b
 		device_remove_file(rdev->dev, &dev_attr_power_method);
c940e9b
@@ -720,12 +747,12 @@
c940e9b
 			radeon_pm_get_dynpm_state(rdev);
c940e9b
 			radeon_pm_set_clocks(rdev);
c940e9b
 		}
c940e9b
+
c940e9b
+		queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work,
c940e9b
+					msecs_to_jiffies(RADEON_IDLE_LOOP_MS));
c940e9b
 	}
c940e9b
 	mutex_unlock(&rdev->pm.mutex);
c940e9b
 	ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched);
c940e9b
-
c940e9b
-	queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work,
c940e9b
-					msecs_to_jiffies(RADEON_IDLE_LOOP_MS));
c940e9b
 }
c940e9b
 
c940e9b
 /*
c940e9b
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
c940e9b
--- linux-2.6.34.i686/drivers/gpu/drm/ttm/ttm_page_alloc.c	2010-09-02 21:50:42.000000000 +1000
c940e9b
+++ radeon-fixes.i686/drivers/gpu/drm/ttm/ttm_page_alloc.c	2010-09-02 21:13:14.000000000 +1000
c940e9b
@@ -667,7 +667,7 @@
c940e9b
 {
c940e9b
 	struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
c940e9b
 	struct page *p = NULL;
c940e9b
-	int gfp_flags = 0;
c940e9b
+	int gfp_flags = GFP_USER;
c940e9b
 	int r;
c940e9b
 
c940e9b
 	/* set zero flag for page allocation if required */