From 9d7a0c52cd6c236a4a2e2a51d98275379adbff1a Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
Date: Fri, 11 Sep 2009 20:22:30 +0200
Subject: [PATCH] drm/radeon/kms: add pm state setting function (engine only for now)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
 drivers/gpu/drm/radeon/radeon.h    |    3 +++
 drivers/gpu/drm/radeon/radeon_pm.c |   20 ++++++++++++++++++++
 2 files changed, 23 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 5cdf0a5..28a10d1 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -547,6 +547,7 @@ struct radeon_pm_state {
  * @chip_default:       original gpu state
  * @chip_minimum:       minimum gpu state
  * @chip_maximum:       maximum gpu state
+ * @last_set:           allows as avoid unnecessary changes
  *
  * It keeps track of various data needed to take powermanagement decision.
  * Bandwith need is used to determine minimun clock of the GPU and memory.
@@ -569,6 +570,8 @@ struct radeon_pm {
 	struct radeon_pm_state	chip_default;
 	struct radeon_pm_state	chip_minimum;
 	struct radeon_pm_state	chip_maximum;
+
+	struct radeon_pm_state	*last_set;
 };
 
 void radeon_pm_init(struct radeon_device *rdev);
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
index 9b79a0a..712f5d5 100644
--- a/drivers/gpu/drm/radeon/radeon_pm.c
+++ b/drivers/gpu/drm/radeon/radeon_pm.c
@@ -66,6 +66,8 @@ static void radeon_pm_correct_min_max(struct radeon_pm *r_pm)
 
 void radeon_pm_init(struct radeon_device *rdev)
 {
+	rdev->pm.last_set = NULL;
+
 	DRM_DEBUG("radeon: states from AtomBIOS's firmware:\n");
 	radeon_pm_print("Default", &rdev->pm.chip_default);
 	radeon_pm_print("Minimum", &rdev->pm.chip_minimum);
@@ -78,3 +80,21 @@ void radeon_pm_init(struct radeon_device *rdev)
 	radeon_pm_print("Minimum", &rdev->pm.chip_minimum);
 	radeon_pm_print("Maximum", &rdev->pm.chip_maximum);
 }
+
+static void radeon_pm_set_state(struct radeon_device *rdev, char *name, struct radeon_pm_state *state)
+{
+	DRM_DEBUG("radeon: setting %s power state\n", name);
+
+	if (rdev->pm.last_set == state) {
+		return;
+	}
+
+	if (state->engine_clock) {
+		radeon_set_engine_clock(rdev, state->engine_clock);
+		radeon_get_engine_clock(rdev);
+	}
+
+	/* TODO: set memory and voltage */
+
+	rdev->pm.last_set = state;
+}
-- 
1.6.0.2

