Fixes fdo bug #26329

Signed-off-by: Rafał Miłecki <zaj...@gmail.com>
Tested-by: Tobias Jakobi <liquid.a...@gmx.net>
---
 drivers/gpu/drm/radeon/radeon.h          |    5 +++++
 drivers/gpu/drm/radeon/radeon_atombios.c |   18 +++++++++---------
 drivers/gpu/drm/radeon/radeon_combios.c  |    4 ++--
 3 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index d3040e2..1d31677 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -661,6 +661,11 @@ struct radeon_power_state {
        bool voltage_drop_active;
 };
 
+/*
+ * Some modes are overclocked by very low value, accept them
+ */
+#define RADEON_MODE_OVERCLOCK_MARGIN 500 /* 5 MHz */
+
 struct radeon_pm {
        struct mutex            mutex;
        struct delayed_work     idle_work;
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c 
b/drivers/gpu/drm/radeon/radeon_atombios.c
index 4f7dbce..731210b 100644
--- a/drivers/gpu/drm/radeon/radeon_atombios.c
+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
@@ -1463,9 +1463,9 @@ void radeon_atombios_get_power_modes(struct radeon_device 
*rdev)
                                                continue;
                                        /* skip overclock modes for now */
                                        if 
((rdev->pm.power_state[state_index].clock_info[0].mclk >
-                                            rdev->clock.default_mclk) ||
+                                            rdev->clock.default_mclk + 
RADEON_MODE_OVERCLOCK_MARGIN) ||
                                            
(rdev->pm.power_state[state_index].clock_info[0].sclk >
-                                            rdev->clock.default_sclk))
+                                            rdev->clock.default_sclk + 
RADEON_MODE_OVERCLOCK_MARGIN))
                                                continue;
                                        
rdev->pm.power_state[state_index].non_clock_info.pcie_lanes =
                                                
power_info->info.asPowerPlayInfo[i].ucNumPciELanes;
@@ -1528,9 +1528,9 @@ void radeon_atombios_get_power_modes(struct radeon_device 
*rdev)
                                                continue;
                                        /* skip overclock modes for now */
                                        if 
((rdev->pm.power_state[state_index].clock_info[0].mclk >
-                                            rdev->clock.default_mclk) ||
+                                            rdev->clock.default_mclk + 
RADEON_MODE_OVERCLOCK_MARGIN) ||
                                            
(rdev->pm.power_state[state_index].clock_info[0].sclk >
-                                            rdev->clock.default_sclk))
+                                            rdev->clock.default_sclk + 
RADEON_MODE_OVERCLOCK_MARGIN))
                                                continue;
                                        
rdev->pm.power_state[state_index].non_clock_info.pcie_lanes =
                                                
power_info->info_2.asPowerPlayInfo[i].ucNumPciELanes;
@@ -1597,9 +1597,9 @@ void radeon_atombios_get_power_modes(struct radeon_device 
*rdev)
                                                continue;
                                        /* skip overclock modes for now */
                                        if 
((rdev->pm.power_state[state_index].clock_info[0].mclk >
-                                            rdev->clock.default_mclk) ||
+                                            rdev->clock.default_mclk + 
RADEON_MODE_OVERCLOCK_MARGIN) ||
                                            
(rdev->pm.power_state[state_index].clock_info[0].sclk >
-                                            rdev->clock.default_sclk))
+                                            rdev->clock.default_sclk + 
RADEON_MODE_OVERCLOCK_MARGIN))
                                                continue;
                                        
rdev->pm.power_state[state_index].non_clock_info.pcie_lanes =
                                                
power_info->info_3.asPowerPlayInfo[i].ucNumPciELanes;
@@ -1693,7 +1693,7 @@ void radeon_atombios_get_power_modes(struct radeon_device 
*rdev)
                                                        continue;
                                                /* skip overclock modes for now 
*/
                                                if 
(rdev->pm.power_state[state_index].clock_info[mode_index].sclk >
-                                                   rdev->clock.default_sclk)
+                                                   rdev->clock.default_sclk + 
RADEON_MODE_OVERCLOCK_MARGIN)
                                                        continue;
                                                
rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
                                                        VOLTAGE_SW;
@@ -1720,9 +1720,9 @@ void radeon_atombios_get_power_modes(struct radeon_device 
*rdev)
                                                        continue;
                                                /* skip overclock modes for now 
*/
                                                if 
((rdev->pm.power_state[state_index].clock_info[mode_index].mclk >
-                                                    rdev->clock.default_mclk) 
||
+                                                    rdev->clock.default_mclk + 
RADEON_MODE_OVERCLOCK_MARGIN) ||
                                                    
(rdev->pm.power_state[state_index].clock_info[mode_index].sclk >
-                                                    rdev->clock.default_sclk))
+                                                    rdev->clock.default_sclk + 
RADEON_MODE_OVERCLOCK_MARGIN))
                                                        continue;
                                                
rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
                                                        VOLTAGE_SW;
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c 
b/drivers/gpu/drm/radeon/radeon_combios.c
index 9989d22..5ef791b 100644
--- a/drivers/gpu/drm/radeon/radeon_combios.c
+++ b/drivers/gpu/drm/radeon/radeon_combios.c
@@ -2374,9 +2374,9 @@ void radeon_combios_get_power_modes(struct radeon_device 
*rdev)
                                goto default_mode;
                        /* skip overclock modes for now */
                        if 
((rdev->pm.power_state[state_index].clock_info[0].mclk >
-                            rdev->clock.default_mclk) ||
+                            rdev->clock.default_mclk + 
RADEON_MODE_OVERCLOCK_MARGIN) ||
                            
(rdev->pm.power_state[state_index].clock_info[0].sclk >
-                            rdev->clock.default_sclk))
+                            rdev->clock.default_sclk + 
RADEON_MODE_OVERCLOCK_MARGIN))
                                goto default_mode;
                        rdev->pm.power_state[state_index].type =
                                POWER_STATE_TYPE_BATTERY;
-- 
1.6.4.2


------------------------------------------------------------------------------
SOLARIS 10 is the OS for Data Centers - provides features such as DTrace,
Predictive Self Healing and Award Winning ZFS. Get Solaris 10 NOW
http://p.sf.net/sfu/solaris-dev2dev
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to