This patch adds an option to force low power mode.

If this option is enabled, the engine will be downclocked for less power
consumption. This can be very useful for people with noisy cards (like mine).

Signed-off-by: Miguel Botón <[email protected]>
---
 drivers/gpu/drm/radeon/radeon.h        |    1 +
 drivers/gpu/drm/radeon/radeon_clocks.c |    4 ++--
 drivers/gpu/drm/radeon/radeon_drv.c    |    4 ++++
 drivers/gpu/drm/radeon/radeon_pm.c     |   21 +++++++++++++++++++++
 4 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index e0b53b1..0bf38f8 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -77,6 +77,7 @@
 extern int radeon_no_wb;
 extern int radeon_modeset;
 extern int radeon_dynclks;
+extern int radeon_lowpower;
 extern int radeon_r4xx_atom;
 extern int radeon_agpmode;
 extern int radeon_vram_limit;
diff --git a/drivers/gpu/drm/radeon/radeon_clocks.c 
b/drivers/gpu/drm/radeon/radeon_clocks.c
index a813541..2b2557d 100644
--- a/drivers/gpu/drm/radeon/radeon_clocks.c
+++ b/drivers/gpu/drm/radeon/radeon_clocks.c
@@ -826,8 +826,8 @@ int radeon_static_clocks_init(struct drm_device *dev)
 
        /* XXX make sure engine is idle */
 
-       if (radeon_dynclks != -1) {
-               if (radeon_dynclks)
+       if (radeon_dynclks != -1 || radeon_lowpower != -1) {
+               if (radeon_dynclks || radeon_lowpower)
                        radeon_set_clock_gating(rdev, 1);
        }
        radeon_apply_clock_quirks(rdev);
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c 
b/drivers/gpu/drm/radeon/radeon_drv.c
index 7f50fb8..fdf866b 100644
--- a/drivers/gpu/drm/radeon/radeon_drv.c
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
@@ -78,6 +78,7 @@ void radeon_debugfs_cleanup(struct drm_minor *minor);
 int radeon_no_wb;
 int radeon_modeset = -1;
 int radeon_dynclks = -1;
+int radeon_lowpower = -1;
 int radeon_r4xx_atom = 0;
 int radeon_agpmode = 0;
 int radeon_vram_limit = 0;
@@ -96,6 +97,9 @@ module_param_named(modeset, radeon_modeset, int, 0400);
 MODULE_PARM_DESC(dynclks, "Disable/Enable dynamic clocks");
 module_param_named(dynclks, radeon_dynclks, int, 0444);
 
+MODULE_PARM_DESC(lowpower, "Force low power mode");
+module_param_named(lowpower, radeon_lowpower, int, 0444);
+
 MODULE_PARM_DESC(r4xx_atom, "Enable ATOMBIOS modesetting for R4xx");
 module_param_named(r4xx_atom, radeon_r4xx_atom, int, 0444);
 
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c 
b/drivers/gpu/drm/radeon/radeon_pm.c
index a7dc92b..4245f89 100644
--- a/drivers/gpu/drm/radeon/radeon_pm.c
+++ b/drivers/gpu/drm/radeon/radeon_pm.c
@@ -26,6 +26,7 @@
 #define RADEON_RECLOCK_DELAY_MS 200
 
 int radeon_debugfs_pm_init(struct radeon_device *rdev);
+void radeon_pm_force_lowpower_mode(struct radeon_device *rdev, int enable);
 void radeon_pm_reclock_work_handler(struct work_struct *work);
 
 int radeon_pm_init(struct radeon_device *rdev)
@@ -45,6 +46,11 @@ int radeon_pm_init(struct radeon_device *rdev)
                DRM_INFO("radeon: dynamic clocking initialized\n");
        }
 
+       if (radeon_lowpower != -1 && radeon_lowpower) {
+               radeon_pm_force_lowpower_mode(rdev, 1);
+               DRM_INFO("radeon: forcing low power mode\n");
+       }
+
        return 0;
 }
 
@@ -113,6 +119,21 @@ static int radeon_debugfs_pm_info(struct seq_file *m, void 
*data)
 
        return 0;
 }
+ 
+void radeon_pm_force_lowpower_mode(struct radeon_device *rdev, int enable)
+{
+       mutex_lock(&rdev->cp.mutex);
+
+       if (enable) {
+               rdev->pm.downclocked = true;
+               radeon_set_engine_clock(rdev, rdev->clock.default_sclk / 2);
+       } else {
+               rdev->pm.downclocked = false;
+               radeon_set_engine_clock(rdev, rdev->clock.default_sclk);
+       }
+
+       mutex_unlock(&rdev->cp.mutex);
+}
 
 static struct drm_info_list radeon_pm_info_list[] = {
        {"radeon_pm_info", radeon_debugfs_pm_info, 0, NULL},

-- 
Miguel Botón

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
--
_______________________________________________
Dri-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to