From 9639570428375b90e9f25adb8088de4446e61151 Mon Sep 17 00:00:00 2001
From: Alex Deucher <alexdeucher@gmail.com>
Date: Sun, 14 Mar 2010 14:08:32 -0400
Subject: [PATCH] drm/radeon/kms/pm: rework power mode parsing

On pre-r6xx, the power mode array is ordered:
low
...
high
default

On r6xx+:
default
low
...
high

Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
---
 drivers/gpu/drm/radeon/radeon_atombios.c |   23 +++++++++++++++++++----
 1 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
index f0ea7f8..eed3f1b 100644
--- a/drivers/gpu/drm/radeon/radeon_atombios.c
+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
@@ -1497,6 +1497,7 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
 			num_modes = power_info->info.ucNumOfPowerModeEntries;
 			if (num_modes > ATOM_MAX_NUMBEROF_POWER_BLOCK)
 				num_modes = ATOM_MAX_NUMBEROF_POWER_BLOCK;
+			/* last mode is always default, array is low to high */
 			for (i = 0; i < num_modes; i++) {
 				rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE;
 				switch (frev) {
@@ -1702,6 +1703,14 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
 					break;
 				}
 			}
+			/* last mode is always default */
+			if (!rdev->pm.default_power_state) {
+				rdev->pm.power_state[state_index - 1].type =
+					POWER_STATE_TYPE_DEFAULT;
+				rdev->pm.default_power_state = &rdev->pm.power_state[state_index - 1];
+				rdev->pm.power_state[state_index - 1].default_clock_mode =
+					&rdev->pm.power_state[state_index - 1].clock_info[0];
+			}
 		} else if (frev == 4) {
 			/* add the i2c bus for thermal/fan chip */
 			/* no support for internal controller yet */
@@ -1721,6 +1730,7 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
 					rdev->pm.i2c_bus = radeon_i2c_create(rdev->ddev, &i2c_bus, "Thermal");
 				}
 			}
+			/* first mode is always default, followed by low to high */
 			for (i = 0; i < power_info->info_4.ucNumStates; i++) {
 				mode_index = 0;
 				power_state = (struct _ATOM_PPLIB_STATE *)
@@ -1820,12 +1830,16 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
 					state_index++;
 				}
 			}
+			/* first mode is always default */
+			if (!rdev->pm.default_power_state) {
+				rdev->pm.power_state[0].type =
+					POWER_STATE_TYPE_DEFAULT;
+				rdev->pm.default_power_state = &rdev->pm.power_state[0];
+				rdev->pm.power_state[0].default_clock_mode =
+					&rdev->pm.power_state[0].clock_info[0];
+			}
 		}
 	} else {
-		/* XXX figure out some good default low power mode for cards w/out power tables */
-	}
-
-	if (rdev->pm.default_power_state == NULL) {
 		/* add the default mode */
 		rdev->pm.power_state[state_index].type =
 			POWER_STATE_TYPE_DEFAULT;
@@ -1842,6 +1856,7 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)
 		rdev->pm.default_power_state = &rdev->pm.power_state[state_index];
 		state_index++;
 	}
+
 	rdev->pm.num_power_states = state_index;
 
 	rdev->pm.current_power_state = rdev->pm.default_power_state;
-- 
1.5.6.3

