[Intel-gfx] [PATCH] drm/i915: Clamp efficient frequency to valid range

2015-02-10 Thread Tom . O'Rourke
From: Tom O'Rourke Tom.O'rou...@intel.com

The efficient frequency (RPe) should stay in the range
RPn = RPe = RP0.  The pcode clamps the returned value
internally on Broadwell but not on Haswell.

Fix for missing range check in
commit 93ee29203f506582cca2bcec5f05041526d9ab0a
Author: Tom O'Rourke Tom.O'rou...@intel.com
Date:   Wed Nov 19 14:21:52 2014 -0800

drm/i915: Use efficient frequency for HSW/BDW

Reference: 
http://lists.freedesktop.org/archives/intel-gfx/2015-February/059802.html
Reported-by: Michael Auchter a...@phire.org
Suggested-by: Chris Wilson ch...@chris-wilson.co.uk
Signed-off-by: Tom O'Rourke Tom.O'rou...@intel.com
---
 drivers/gpu/drm/i915/intel_pm.c |5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index a3b979d..602c443 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -3998,7 +3998,10 @@ static void gen6_init_rps_frequencies(struct drm_device 
*dev)
ddcc_status);
if (0 == ret)
dev_priv-rps.efficient_freq =
-   (ddcc_status  8)  0xff;
+   clamp_t(u8,
+   ((ddcc_status  8)  0xff),
+   dev_priv-rps.min_freq,
+   dev_priv-rps.max_freq);
}
 
/* Preserve min/max settings in case of re-init */
-- 
1.7.9.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH v2 0/4] Update turbo (rps) min frequency for HSW/BDW

2014-11-19 Thread Tom . O'Rourke
From: Tom O'Rourke Tom.O'rou...@intel.com

These patches update the turbo minimum frequency to 
match the values used for Windows and Android.

v2: Updated patches 1 and 2 based on comments
from Daniel and Chris.  Added 2 related patches.

Tom O'Rourke (4):
  drm/i915: Use efficient frequency for HSW/BDW
  drm/i915: Keep min freq above floor on HSW/BDW
  drm/i915: change initial rps frequency for gen8
  drm/i915: Update ring freq for full gpu freq range

 drivers/gpu/drm/i915/i915_reg.h |1 +
 drivers/gpu/drm/i915/intel_pm.c |   51 +++
 2 files changed, 37 insertions(+), 15 deletions(-)

-- 
1.7.9.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH v2 2/4] drm/i915: Keep min freq above floor on HSW/BDW

2014-11-19 Thread Tom . O'Rourke
From: Tom O'Rourke Tom.O'rou...@intel.com

Set the min_freq_softlimit to max(RPe, 450MHz).

Setting a floor can ensure a minimum experience
level.  The 450MHz value came from a power and
performance study of various types of workloads
(3D, Media, GPGPU, idle, etc).

v2: rebased

Signed-off-by: Tom O'Rourke Tom.O'rou...@intel.com
---
 drivers/gpu/drm/i915/intel_pm.c |3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 2434542..9f9afb3 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -4649,7 +4649,8 @@ static void gen6_init_rps_frequencies(struct drm_device 
*dev)
if (dev_priv-rps.min_freq_softlimit == 0) {
if (IS_HASWELL(dev) || IS_BROADWELL(dev))
dev_priv-rps.min_freq_softlimit =
-   dev_priv-rps.efficient_freq;
+   /* max(RPe, 450 MHz) */
+   max(dev_priv-rps.efficient_freq, (u8) 9);
else
dev_priv-rps.min_freq_softlimit =
dev_priv-rps.min_freq;
-- 
1.7.9.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 3/4] drm/i915: change initial rps frequency for gen8

2014-11-19 Thread Tom . O'Rourke
From: Tom O'Rourke Tom.O'rou...@intel.com

In gen8_enable_rps, change the initial rps setting
to the min_freq_softlimit (same as gen6_enable_rps).

Signed-off-by: Tom O'Rourke Tom.O'rou...@intel.com
---
 drivers/gpu/drm/i915/intel_pm.c |3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 9f9afb3..4fd063f 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -4772,7 +4772,8 @@ static void gen8_enable_rps(struct drm_device *dev)
 
/* 6: Ring frequency + overclocking (our driver does this later */
 
-   gen6_set_rps(dev, (I915_READ(GEN6_GT_PERF_STATUS)  0xff00)  8);
+   dev_priv-rps.power = HIGH_POWER; /* force a reset */
+   gen6_set_rps(dev_priv-dev, dev_priv-rps.min_freq_softlimit);
 
gen6_enable_rps_interrupts(dev);
 
-- 
1.7.9.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 4/4] drm/i915: Update ring freq for full gpu freq range

2014-11-19 Thread Tom . O'Rourke
From: Tom O'Rourke Tom.O'rou...@intel.com

In __gen6_update_ring_freq, use the full range of
possible gpu frequencies from max_freq to min_freq.
The actual gpu frequency could be outside the range
from max_freq_softlimit to min_freq_softlimit due
to power/thermal constraints.

Signed-off-by: Tom O'Rourke Tom.O'rou...@intel.com
---
 drivers/gpu/drm/i915/intel_pm.c |4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 4fd063f..2f744aa 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -4926,9 +4926,9 @@ static void __gen6_update_ring_freq(struct drm_device 
*dev)
 * to use for memory access.  We do this by specifying the IA frequency
 * the PCU should use as a reference to determine the ring frequency.
 */
-   for (gpu_freq = dev_priv-rps.max_freq_softlimit; gpu_freq = 
dev_priv-rps.min_freq_softlimit;
+   for (gpu_freq = dev_priv-rps.max_freq; gpu_freq = 
dev_priv-rps.min_freq;
 gpu_freq--) {
-   int diff = dev_priv-rps.max_freq_softlimit - gpu_freq;
+   int diff = dev_priv-rps.max_freq - gpu_freq;
unsigned int ia_freq = 0, ring_freq = 0;
 
if (INTEL_INFO(dev)-gen = 8) {
-- 
1.7.9.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH v2 1/4] drm/i915: Use efficient frequency for HSW/BDW

2014-11-19 Thread Tom . O'Rourke
From: Tom O'Rourke Tom.O'rou...@intel.com

Added gen6_init_rps_frequencies() to initialize
the rps frequency values.  This function replaces
parse_rp_state_cap().  In addition to reading RPn,
RP0, and RP1 from RP_STATE_CAP register, the new
function reads efficient frequency (aka RPe) from
pcode for Haswell and Broadwell and sets the turbo
softlimits.  The turbo minimum frequency softlimit
is set to RPe for Haswell and Broadwell and to RPn
otherwise.

For RPe, the efficiency is based on the frequency/power
ratio (MHz/W); this is considering GT power and not
package power.  The efficent frequency is the highest
frequency for which the frequency/power ratio is within
some threshold of the highest frequency/power ratio.
A fixed decrease in frequency results in smaller
decrease in power at frequencies less than RPe than
at frequencies above RPe.

v2: Following suggestions from Chris Wilson and
Daniel Vetter to extend and rename parse_rp_state_cap
and to open-code a poorly named function.

Signed-off-by: Tom O'Rourke Tom.O'rou...@intel.com
---
 drivers/gpu/drm/i915/i915_reg.h |1 +
 drivers/gpu/drm/i915/intel_pm.c |   43 ---
 2 files changed, 32 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 7a77cd5..3a51c05 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -6038,6 +6038,7 @@ enum punit_power_well {
 #define   GEN6_ENCODE_RC6_VID(mv)  (((mv) - 245) / 5)
 #define   GEN6_DECODE_RC6_VID(vids)(((vids) * 5) + 245)
 #define   DISPLAY_IPS_CONTROL  0x19
+#define  HSW_PCODE_DYNAMIC_DUTY_CYCLE_CONTROL  0x1A
 #define GEN6_PCODE_DATA0x138128
 #define   GEN6_PCODE_FREQ_IA_RATIO_SHIFT   8
 #define   GEN6_PCODE_FREQ_RING_RATIO_SHIFT 16
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 8e2dca0..2434542 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -4615,25 +4615,45 @@ int intel_enable_rc6(const struct drm_device *dev)
return i915.enable_rc6;
 }
 
-static void parse_rp_state_cap(struct drm_i915_private *dev_priv, u32 
rp_state_cap)
+static void gen6_init_rps_frequencies(struct drm_device *dev)
 {
+   struct drm_i915_private *dev_priv = dev-dev_private;
+   uint32_t rp_state_cap;
+   u32 ddcc_status = 0;
+   int ret;
+
+   rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
/* All of these values are in units of 50MHz */
dev_priv-rps.cur_freq  = 0;
-   /* static values from HW: RP0  RPe  RP1  RPn (min_freq) */
-   dev_priv-rps.rp1_freq  = (rp_state_cap   8)  0xff;
+   /* static values from HW: RP0  RP1  RPn (min_freq) */
dev_priv-rps.rp0_freq  = (rp_state_cap   0)  0xff;
+   dev_priv-rps.rp1_freq  = (rp_state_cap   8)  0xff;
dev_priv-rps.min_freq  = (rp_state_cap  16)  0xff;
-   /* XXX: only BYT has a special efficient freq */
-   dev_priv-rps.efficient_freq= dev_priv-rps.rp1_freq;
/* hw_max = RP0 until we check for overclocking */
dev_priv-rps.max_freq  = dev_priv-rps.rp0_freq;
 
+   dev_priv-rps.efficient_freq = dev_priv-rps.rp1_freq;
+   if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
+   ret = sandybridge_pcode_read(dev_priv,
+   HSW_PCODE_DYNAMIC_DUTY_CYCLE_CONTROL,
+   ddcc_status);
+   if (0 == ret)
+   dev_priv-rps.efficient_freq =
+   (ddcc_status  8)  0xff;
+   }
+
/* Preserve min/max settings in case of re-init */
if (dev_priv-rps.max_freq_softlimit == 0)
dev_priv-rps.max_freq_softlimit = dev_priv-rps.max_freq;
 
-   if (dev_priv-rps.min_freq_softlimit == 0)
-   dev_priv-rps.min_freq_softlimit = dev_priv-rps.min_freq;
+   if (dev_priv-rps.min_freq_softlimit == 0) {
+   if (IS_HASWELL(dev) || IS_BROADWELL(dev))
+   dev_priv-rps.min_freq_softlimit =
+   dev_priv-rps.efficient_freq;
+   else
+   dev_priv-rps.min_freq_softlimit =
+   dev_priv-rps.min_freq;
+   }
 }
 
 static void gen9_enable_rps(struct drm_device *dev)
@@ -4692,8 +4712,8 @@ static void gen8_enable_rps(struct drm_device *dev)
/* 2a: Disable RC states. */
I915_WRITE(GEN6_RC_CONTROL, 0);
 
-   rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
-   parse_rp_state_cap(dev_priv, rp_state_cap);
+   /* Initialize rps frequencies */
+   gen6_init_rps_frequencies(dev);
 
/* 2b: Program RC6 thresholds.*/
I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 40  16);
@@ -4786,9 +4806,8 @@ static void gen6_enable_rps(struct drm_device *dev)
 
gen6_gt_force_wake_get

[Intel-gfx] [PATCH] drm/i915: Extend pcode mailbox interface

2014-11-13 Thread Tom . O'Rourke
From: Tom O'Rourke Tom.O'rou...@intel.com

In sandybridge_pcode_read and sandybridge_pcode_write,
extend the mbox parameter from u8 to u32.

On Haswell and Sandybridge, bits 7:0 encode the mailbox
command and bits 28:8 are used for address control for
specific commands.

Based on suggestion from Ville Syrjälä.

Signed-off-by: Tom O'Rourke Tom.O'rou...@intel.com
---
 drivers/gpu/drm/i915/i915_drv.h |4 ++--
 drivers/gpu/drm/i915/intel_pm.c |4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 3f3035c..4dea835 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2954,8 +2954,8 @@ void gen6_gt_force_wake_get(struct drm_i915_private 
*dev_priv, int fw_engine);
 void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine);
 void assert_force_wake_inactive(struct drm_i915_private *dev_priv);
 
-int sandybridge_pcode_read(struct drm_i915_private *dev_priv, u8 mbox, u32 
*val);
-int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u8 mbox, u32 
val);
+int sandybridge_pcode_read(struct drm_i915_private *dev_priv, u32 mbox, u32 
*val);
+int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u32 mbox, u32 
val);
 
 /* intel_sideband.c */
 u32 vlv_punit_read(struct drm_i915_private *dev_priv, u8 addr);
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 9e87265..21faa92 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -7154,7 +7154,7 @@ void intel_init_pm(struct drm_device *dev)
}
 }
 
-int sandybridge_pcode_read(struct drm_i915_private *dev_priv, u8 mbox, u32 
*val)
+int sandybridge_pcode_read(struct drm_i915_private *dev_priv, u32 mbox, u32 
*val)
 {
WARN_ON(!mutex_is_locked(dev_priv-rps.hw_lock));
 
@@ -7180,7 +7180,7 @@ int sandybridge_pcode_read(struct drm_i915_private 
*dev_priv, u8 mbox, u32 *val)
return 0;
 }
 
-int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u8 mbox, u32 
val)
+int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u32 mbox, u32 
val)
 {
WARN_ON(!mutex_is_locked(dev_priv-rps.hw_lock));
 
-- 
1.7.9.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 1/2] drm/i915: Use efficient frequency for HSW/BDW

2014-11-05 Thread Tom . O'Rourke
From: Tom O'Rourke Tom.O'rou...@intel.com

Updated gen6|8_enable_rps() for Haswell and Broadwell
to use the efficient frequency read from pcode.

Added hsw_use_efficient_freq() to read efficient
frequency (aka RPe) from pcode.  The efficiency is
based on the frequency/power ratio (MHz/W); this is
considering GT power and not package power.  The
efficent frequency is the highest frequency for which
the frequency/power ratio is within some threshold of
the highest frequency/power ratio.

Also set the min_freq_softlimit to the efficient
frequency.  A fixed decrease in frequency results in
smaller decrease in power at frequencies less than RPe
than at frequencies above RPe.

Signed-off-by: Tom O'Rourke Tom.O'rou...@intel.com
---
 drivers/gpu/drm/i915/i915_reg.h |1 +
 drivers/gpu/drm/i915/intel_pm.c |   22 ++
 2 files changed, 23 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index d43fa0e..6fbfdec 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -6010,6 +6010,7 @@ enum punit_power_well {
 #define   GEN6_ENCODE_RC6_VID(mv)  (((mv) - 245) / 5)
 #define   GEN6_DECODE_RC6_VID(vids)(((vids) * 5) + 245)
 #define   DISPLAY_IPS_CONTROL  0x19
+#define  HSW_PCODE_DYNAMIC_DUTY_CYCLE_CONTROL  0x1A
 #define GEN6_PCODE_DATA0x138128
 #define   GEN6_PCODE_FREQ_IA_RATIO_SHIFT   8
 #define   GEN6_PCODE_FREQ_RING_RATIO_SHIFT 16
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 300d7e5..e4347d9 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -4706,6 +4706,18 @@ static void parse_rp_state_cap(struct drm_i915_private 
*dev_priv, u32 rp_state_c
dev_priv-rps.min_freq_softlimit = dev_priv-rps.min_freq;
 }
 
+static void hsw_use_efficient_freq(struct drm_i915_private *dev_priv)
+{
+   u32 ddcc_status = 0;
+   int ret;
+
+   ret = sandybridge_pcode_read(dev_priv,
+   HSW_PCODE_DYNAMIC_DUTY_CYCLE_CONTROL,
+   ddcc_status);
+   if (0 == ret)
+   dev_priv-rps.efficient_freq = (ddcc_status  8)  0xff;
+}
+
 static void gen9_enable_rps(struct drm_device *dev)
 {
struct drm_i915_private *dev_priv = dev-dev_private;
@@ -4765,6 +4777,11 @@ static void gen8_enable_rps(struct drm_device *dev)
rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
parse_rp_state_cap(dev_priv, rp_state_cap);
 
+   if (IS_BROADWELL(dev)) {
+   hsw_use_efficient_freq(dev_priv);
+   dev_priv-rps.min_freq_softlimit = dev_priv-rps.efficient_freq;
+   }
+
/* 2b: Program RC6 thresholds.*/
I915_WRITE(GEN6_RC6_WAKE_RATE_LIMIT, 40  16);
I915_WRITE(GEN6_RC_EVALUATION_INTERVAL, 125000); /* 12500 * 1280ns */
@@ -4860,6 +4877,11 @@ static void gen6_enable_rps(struct drm_device *dev)
 
parse_rp_state_cap(dev_priv, rp_state_cap);
 
+   if (IS_HASWELL(dev)) {
+   hsw_use_efficient_freq(dev_priv);
+   dev_priv-rps.min_freq_softlimit = dev_priv-rps.efficient_freq;
+   }
+
/* disable the counters and set deterministic thresholds */
I915_WRITE(GEN6_RC_CONTROL, 0);
 
-- 
1.7.9.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 2/2] drm/i915: Keep min freq above floor on HSW/BDW

2014-11-05 Thread Tom . O'Rourke
From: Tom O'Rourke Tom.O'rou...@intel.com

Set the min_freq_softlimit to max(RPe, 450MHz).

Setting a floor can ensure a minimum experience
level.  The 450MHz value came from a power and
performance study of various types of workloads
(3D, Media, GPGPU, idle, etc).

Signed-off-by: Tom O'Rourke Tom.O'rou...@intel.com
---
 drivers/gpu/drm/i915/intel_pm.c |6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index e4347d9..1244ff8 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -4779,7 +4779,8 @@ static void gen8_enable_rps(struct drm_device *dev)
 
if (IS_BROADWELL(dev)) {
hsw_use_efficient_freq(dev_priv);
-   dev_priv-rps.min_freq_softlimit = dev_priv-rps.efficient_freq;
+   dev_priv-rps.min_freq_softlimit =
+   max(dev_priv-rps.efficient_freq, (u8) 9); /* 450 MHz */
}
 
/* 2b: Program RC6 thresholds.*/
@@ -4879,7 +4880,8 @@ static void gen6_enable_rps(struct drm_device *dev)
 
if (IS_HASWELL(dev)) {
hsw_use_efficient_freq(dev_priv);
-   dev_priv-rps.min_freq_softlimit = dev_priv-rps.efficient_freq;
+   dev_priv-rps.min_freq_softlimit =
+   max(dev_priv-rps.efficient_freq, (u8) 9); /* 450 MHz */
}
 
/* disable the counters and set deterministic thresholds */
-- 
1.7.9.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH 0/2] Update turbo (rps) min frequency for HSW/BDW

2014-11-05 Thread Tom . O'Rourke
From: Tom O'Rourke Tom.O'rou...@intel.com

These patches update the turbo minimum frequency to 
match the values used for Windows and Android.  The 
refactoring in Imre's recent series 
[Intel-gfx] [PATCH 0/8] sanitize RPS interrupt enabling/disabling 
conflicts with these changes.  Those conflicts should 
not be difficult to resolve.

Tom O'Rourke (2):
  drm/i915: Use efficient frequency for HSW/BDW
  drm/i915: Keep min freq above floor on HSW/BDW

 drivers/gpu/drm/i915/i915_reg.h |1 +
 drivers/gpu/drm/i915/intel_pm.c |   24 
 2 files changed, 25 insertions(+)

-- 
1.7.9.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH] drm/i915: Add haswell_pcode_write function

2014-11-05 Thread Tom . O'Rourke
From: Tom O'Rourke Tom.O'rou...@intel.com

Based on sandybridge_pcode_write, haswell_pcode_write has an
additional field for address control.

Signed-off-by: Tom O'Rourke Tom.O'rou...@intel.com
---
 drivers/gpu/drm/i915/i915_drv.h |1 +
 drivers/gpu/drm/i915/i915_reg.h |1 +
 drivers/gpu/drm/i915/intel_pm.c |9 +++--
 3 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 0f00e58..fd8b550 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2950,6 +2950,7 @@ void gen6_gt_force_wake_put(struct drm_i915_private 
*dev_priv, int fw_engine);
 void assert_force_wake_inactive(struct drm_i915_private *dev_priv);
 
 int sandybridge_pcode_read(struct drm_i915_private *dev_priv, u8 mbox, u32 
*val);
+int haswell_pcode_write(struct drm_i915_private *dev_priv, u8 mbox, u32 val, 
u32 control);
 int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u8 mbox, u32 
val);
 
 /* intel_sideband.c */
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 6fbfdec..b674050 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -6011,6 +6011,7 @@ enum punit_power_well {
 #define   GEN6_DECODE_RC6_VID(vids)(((vids) * 5) + 245)
 #define   DISPLAY_IPS_CONTROL  0x19
 #define  HSW_PCODE_DYNAMIC_DUTY_CYCLE_CONTROL  0x1A
+#define   HSW_PCODE_ADDR_CNTL(cntl)((cntl  8)  0x1f00)
 #define GEN6_PCODE_DATA0x138128
 #define   GEN6_PCODE_FREQ_IA_RATIO_SHIFT   8
 #define   GEN6_PCODE_FREQ_RING_RATIO_SHIFT 16
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 1244ff8..9c47bc8 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -7277,7 +7277,7 @@ int sandybridge_pcode_read(struct drm_i915_private 
*dev_priv, u8 mbox, u32 *val)
return 0;
 }
 
-int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u8 mbox, u32 
val)
+int haswell_pcode_write(struct drm_i915_private *dev_priv, u8 mbox, u32 val, 
u32 control)
 {
WARN_ON(!mutex_is_locked(dev_priv-rps.hw_lock));
 
@@ -7287,7 +7287,7 @@ int sandybridge_pcode_write(struct drm_i915_private 
*dev_priv, u8 mbox, u32 val)
}
 
I915_WRITE(GEN6_PCODE_DATA, val);
-   I915_WRITE(GEN6_PCODE_MAILBOX, GEN6_PCODE_READY | mbox);
+   I915_WRITE(GEN6_PCODE_MAILBOX, GEN6_PCODE_READY | mbox | 
HSW_PCODE_ADDR_CNTL(control));
 
if (wait_for((I915_READ(GEN6_PCODE_MAILBOX)  GEN6_PCODE_READY) == 0,
 500)) {
@@ -7300,6 +7300,11 @@ int sandybridge_pcode_write(struct drm_i915_private 
*dev_priv, u8 mbox, u32 val)
return 0;
 }
 
+int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u8 mbox, u32 
val)
+{
+   return haswell_pcode_write(dev_priv, mbox, val, 0);
+}
+
 static int byt_gpu_freq(struct drm_i915_private *dev_priv, int val)
 {
int div;
-- 
1.7.9.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH] drm/i915/chv: Fix drm/i915/chv: Add a bunch of pre production workarounds

2014-06-10 Thread Tom . O'Rourke
From: Tom O'Rourke Tom.O'rou...@intel.com

Correct a merge mishap in commit e4443e459ccf43f2c139358400365fd6a839d40d.

Wa*:chv belongs in cherryview_enable_rps, not gen8_enable_rps.

Signed-off-by: Tom O'Rourke Tom.O'rou...@intel.com
---
 drivers/gpu/drm/i915/intel_pm.c |   12 ++--
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 18f0ba0..c6e893b 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -3520,15 +3520,11 @@ static void gen8_enable_rps(struct drm_device *dev)
 
I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10);
 
-   /* WaDisablePwrmtrEvent:chv (pre-production hw) */
-   I915_WRITE(0xA80C, I915_READ(0xA80C)  0x00ff);
-   I915_WRITE(0xA810, I915_READ(0xA810)  0xff00);
-
/* 5: Enable RPS */
I915_WRITE(GEN6_RP_CONTROL,
   GEN6_RP_MEDIA_TURBO |
   GEN6_RP_MEDIA_HW_NORMAL_MODE |
-  GEN6_RP_MEDIA_IS_GFX | /* WaSetMaskForGfxBusyness:chv 
(pre-production hw ?) */
+  GEN6_RP_MEDIA_IS_GFX |
   GEN6_RP_ENABLE |
   GEN6_RP_UP_BUSY_AVG |
   GEN6_RP_DOWN_IDLE_AVG);
@@ -4022,10 +4018,14 @@ static void cherryview_enable_rps(struct drm_device 
*dev)
 
I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10);
 
+   /* WaDisablePwrmtrEvent:chv (pre-production hw) */
+   I915_WRITE(0xA80C, I915_READ(0xA80C)  0x00ff);
+   I915_WRITE(0xA810, I915_READ(0xA810)  0xff00);
+
/* 5: Enable RPS */
I915_WRITE(GEN6_RP_CONTROL,
   GEN6_RP_MEDIA_HW_NORMAL_MODE |
-  GEN6_RP_MEDIA_IS_GFX |
+  GEN6_RP_MEDIA_IS_GFX | /* WaSetMaskForGfxBusyness:chv 
(pre-production hw ?) */
   GEN6_RP_ENABLE |
   GEN6_RP_UP_BUSY_AVG |
   GEN6_RP_DOWN_IDLE_AVG);
-- 
1.7.9.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH] drm/i915/chv: WaDisablePwrmtrEvent:chv on CHV only

2014-06-09 Thread Tom . O'Rourke
From: Tom O'Rourke Tom.O'rou...@intel.com

In gen8_enable_rps, don't write CHV registers unless IS_CHERRYVIEW.

Signed-off-by: Tom O'Rourke Tom.O'rou...@intel.com
---
 drivers/gpu/drm/i915/intel_pm.c |6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index d9c5918..3d3e402 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -3522,8 +3522,10 @@ static void gen8_enable_rps(struct drm_device *dev)
I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10);
 
/* WaDisablePwrmtrEvent:chv (pre-production hw) */
-   I915_WRITE(0xA80C, I915_READ(0xA80C)  0x00ff);
-   I915_WRITE(0xA810, I915_READ(0xA810)  0xff00);
+   if (IS_CHERRYVIEW(dev)) {
+   I915_WRITE(0xA80C, I915_READ(0xA80C)  0x00ff);
+   I915_WRITE(0xA810, I915_READ(0xA810)  0xff00);
+   }
 
/* 5: Enable RPS */
I915_WRITE(GEN6_RP_CONTROL,
-- 
1.7.9.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH] drm/i915/bdw: Add Broadwell support for debugfs rps freq info

2014-05-30 Thread Tom . O'Rourke
From: Tom O'Rourke Tom.O'rou...@intel.com

Add Broadwell support to i915_frequency_info
and extend i915_max|min_freq_get|set to (gen = 6).

v2: generalized support for i915_max|min_freq_get|set (Daniel).

Signed-off-by: Tom O'Rourke Tom.O'rou...@intel.com
---
 drivers/gpu/drm/i915/i915_debugfs.c |   16 +---
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index 5858cbb..a75d57d 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -1027,7 +1027,9 @@ static int i915_frequency_info(struct seq_file *m, void 
*unused)
   MEMSTAT_VID_SHIFT);
seq_printf(m, Current P-state: %d\n,
   (rgvstat  MEMSTAT_PSTATE_MASK)  
MEMSTAT_PSTATE_SHIFT);
-   } else if ((IS_GEN6(dev) || IS_GEN7(dev))  !IS_VALLEYVIEW(dev)) {
+   } else if (IS_GEN6(dev)
+   || (IS_GEN7(dev)  !IS_VALLEYVIEW(dev))
+   || IS_BROADWELL(dev)) {
u32 gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS);
u32 rp_state_limits = I915_READ(GEN6_RP_STATE_LIMITS);
u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
@@ -1046,7 +1048,7 @@ static int i915_frequency_info(struct seq_file *m, void 
*unused)
 
reqf = I915_READ(GEN6_RPNSWREQ);
reqf = ~GEN6_TURBO_DISABLE;
-   if (IS_HASWELL(dev))
+   if (IS_HASWELL(dev) || IS_BROADWELL(dev))
reqf = 24;
else
reqf = 25;
@@ -1063,7 +1065,7 @@ static int i915_frequency_info(struct seq_file *m, void 
*unused)
rpdownei = I915_READ(GEN6_RP_CUR_DOWN_EI);
rpcurdown = I915_READ(GEN6_RP_CUR_DOWN);
rpprevdown = I915_READ(GEN6_RP_PREV_DOWN);
-   if (IS_HASWELL(dev))
+   if (IS_HASWELL(dev) || IS_BROADWELL(dev))
cagf = (rpstat  HSW_CAGF_MASK)  HSW_CAGF_SHIFT;
else
cagf = (rpstat  GEN6_CAGF_MASK)  GEN6_CAGF_SHIFT;
@@ -3500,7 +3502,7 @@ i915_max_freq_get(void *data, u64 *val)
struct drm_i915_private *dev_priv = dev-dev_private;
int ret;
 
-   if (!(IS_GEN6(dev) || IS_GEN7(dev)))
+   if (INTEL_INFO(dev)-gen  6)
return -ENODEV;
 
flush_delayed_work(dev_priv-rps.delayed_resume_work);
@@ -3526,7 +3528,7 @@ i915_max_freq_set(void *data, u64 val)
u32 rp_state_cap, hw_max, hw_min;
int ret;
 
-   if (!(IS_GEN6(dev) || IS_GEN7(dev)))
+   if (INTEL_INFO(dev)-gen  6)
return -ENODEV;
 
flush_delayed_work(dev_priv-rps.delayed_resume_work);
@@ -3581,7 +3583,7 @@ i915_min_freq_get(void *data, u64 *val)
struct drm_i915_private *dev_priv = dev-dev_private;
int ret;
 
-   if (!(IS_GEN6(dev) || IS_GEN7(dev)))
+   if (INTEL_INFO(dev)-gen  6)
return -ENODEV;
 
flush_delayed_work(dev_priv-rps.delayed_resume_work);
@@ -3607,7 +3609,7 @@ i915_min_freq_set(void *data, u64 val)
u32 rp_state_cap, hw_max, hw_min;
int ret;
 
-   if (!(IS_GEN6(dev) || IS_GEN7(dev)))
+   if (INTEL_INFO(dev)-gen  6)
return -ENODEV;
 
flush_delayed_work(dev_priv-rps.delayed_resume_work);
-- 
1.7.9.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH] drm/i915/bdw: Add Broadwell support for debugfs rps freq info

2014-05-23 Thread Tom . O'Rourke
From: Tom O'Rourke Tom.O'rou...@intel.com

Add Broadwell support to i915_frequency_info and i915_max|min_freq_get|set.

Signed-off-by: Tom O'Rourke Tom.O'rou...@intel.com
---
 drivers/gpu/drm/i915/i915_debugfs.c |   16 +---
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index 333dd12..4d3b7a4 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -1027,7 +1027,9 @@ static int i915_frequency_info(struct seq_file *m, void 
*unused)
   MEMSTAT_VID_SHIFT);
seq_printf(m, Current P-state: %d\n,
   (rgvstat  MEMSTAT_PSTATE_MASK)  
MEMSTAT_PSTATE_SHIFT);
-   } else if ((IS_GEN6(dev) || IS_GEN7(dev))  !IS_VALLEYVIEW(dev)) {
+   } else if (IS_GEN6(dev)
+   || (IS_GEN7(dev)  !IS_VALLEYVIEW(dev))
+   || IS_BROADWELL(dev)) {
u32 gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS);
u32 rp_state_limits = I915_READ(GEN6_RP_STATE_LIMITS);
u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
@@ -1046,7 +1048,7 @@ static int i915_frequency_info(struct seq_file *m, void 
*unused)
 
reqf = I915_READ(GEN6_RPNSWREQ);
reqf = ~GEN6_TURBO_DISABLE;
-   if (IS_HASWELL(dev))
+   if (IS_HASWELL(dev) || IS_BROADWELL(dev))
reqf = 24;
else
reqf = 25;
@@ -1063,7 +1065,7 @@ static int i915_frequency_info(struct seq_file *m, void 
*unused)
rpdownei = I915_READ(GEN6_RP_CUR_DOWN_EI);
rpcurdown = I915_READ(GEN6_RP_CUR_DOWN);
rpprevdown = I915_READ(GEN6_RP_PREV_DOWN);
-   if (IS_HASWELL(dev))
+   if (IS_HASWELL(dev) || IS_BROADWELL(dev))
cagf = (rpstat  HSW_CAGF_MASK)  HSW_CAGF_SHIFT;
else
cagf = (rpstat  GEN6_CAGF_MASK)  GEN6_CAGF_SHIFT;
@@ -3500,7 +3502,7 @@ i915_max_freq_get(void *data, u64 *val)
struct drm_i915_private *dev_priv = dev-dev_private;
int ret;
 
-   if (!(IS_GEN6(dev) || IS_GEN7(dev)))
+   if (!(IS_GEN6(dev) || IS_GEN7(dev) || IS_BROADWELL(dev)))
return -ENODEV;
 
flush_delayed_work(dev_priv-rps.delayed_resume_work);
@@ -3526,7 +3528,7 @@ i915_max_freq_set(void *data, u64 val)
u32 rp_state_cap, hw_max, hw_min;
int ret;
 
-   if (!(IS_GEN6(dev) || IS_GEN7(dev)))
+   if (!(IS_GEN6(dev) || IS_GEN7(dev) || IS_BROADWELL(dev)))
return -ENODEV;
 
flush_delayed_work(dev_priv-rps.delayed_resume_work);
@@ -3581,7 +3583,7 @@ i915_min_freq_get(void *data, u64 *val)
struct drm_i915_private *dev_priv = dev-dev_private;
int ret;
 
-   if (!(IS_GEN6(dev) || IS_GEN7(dev)))
+   if (!(IS_GEN6(dev) || IS_GEN7(dev) || IS_BROADWELL(dev)))
return -ENODEV;
 
flush_delayed_work(dev_priv-rps.delayed_resume_work);
@@ -3607,7 +3609,7 @@ i915_min_freq_set(void *data, u64 val)
u32 rp_state_cap, hw_max, hw_min;
int ret;
 
-   if (!(IS_GEN6(dev) || IS_GEN7(dev)))
+   if (!(IS_GEN6(dev) || IS_GEN7(dev) || IS_BROADWELL(dev)))
return -ENODEV;
 
flush_delayed_work(dev_priv-rps.delayed_resume_work);
-- 
1.7.9.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH] drm/i915/bdw: Use timeout mode for RC6 on bdw

2014-04-09 Thread Tom O'Rourke
Higher RC6 residency is observed using timeout mode
instead of EI mode.  This applies to Broadwell only.
The difference is particularly noticeable with video
playback.

Issue: VIZ-3778
Change-Id: I62bb12e21caf19651034826b45cde7f73a80938d
Signed-off-by: Tom O'Rourke Tom.O'rou...@intel.com
---
 drivers/gpu/drm/i915/intel_pm.c |   16 
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 33b2592..0d63abf 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -3335,15 +3335,23 @@ static void gen8_enable_rps(struct drm_device *dev)
for_each_ring(ring, dev_priv, unused)
I915_WRITE(RING_MAX_IDLE(ring-mmio_base), 10);
I915_WRITE(GEN6_RC_SLEEP, 0);
-   I915_WRITE(GEN6_RC6_THRESHOLD, 5); /* 50/125ms per EI */
+   if (IS_BROADWELL(dev))
+   I915_WRITE(GEN6_RC6_THRESHOLD, 625); /* 800us/1.28 for TO */
+   else
+   I915_WRITE(GEN6_RC6_THRESHOLD, 5); /* 50/125ms per EI */
 
/* 3: Enable RC6 */
if (intel_enable_rc6(dev)  INTEL_RC6_ENABLE)
rc6_mask = GEN6_RC_CTL_RC6_ENABLE;
intel_print_rc6_info(dev, rc6_mask);
-   I915_WRITE(GEN6_RC_CONTROL, GEN6_RC_CTL_HW_ENABLE |
-   GEN6_RC_CTL_EI_MODE(1) |
-   rc6_mask);
+   if (IS_BROADWELL(dev))
+   I915_WRITE(GEN6_RC_CONTROL, GEN6_RC_CTL_HW_ENABLE |
+   GEN7_RC_CTL_TO_MODE |
+   rc6_mask);
+   else
+   I915_WRITE(GEN6_RC_CONTROL, GEN6_RC_CTL_HW_ENABLE |
+   GEN6_RC_CTL_EI_MODE(1) |
+   rc6_mask);
 
/* 4 Program defaults and thresholds for RPS*/
I915_WRITE(GEN6_RPNSWREQ,
-- 
1.7.9.5

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


[Intel-gfx] [PATCH] drm/i915: Finish enabling rps before use by sysfs or debugfs

2013-09-16 Thread Tom . O'Rourke
From: Tom O'Rourke Tom.O'rou...@intel.com

Enabling rps (turbo setup) was put in a work queue because it may
take quite awhile.  This change flushes the work queue to initialize
rps values before use by sysfs or debugfs.  Specifically,
rps.delayed_resume_work is flushed before using rps.hw_max,
rps.max_delay, rps.min_delay, or rps.cur_delay.

This change fixes a problem in sysfs where show functions using
uninitialized values show incorrect values and store functions
using uninitialized values in range checks incorrectly fail to
store valid input values.  This change also addresses similar use
before initialized problems in debugfs.

Change-Id: Ib9c4f2066b65013094cb9278fc17958a964836e7
Signed-off-by: Tom O'Rourke Tom.O'rou...@intel.com
---
 drivers/gpu/drm/i915/i915_debugfs.c |   12 
 drivers/gpu/drm/i915/i915_sysfs.c   |   10 ++
 2 files changed, 22 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c 
b/drivers/gpu/drm/i915/i915_debugfs.c
index 1d77624..52e90a1 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -843,6 +843,8 @@ static int i915_cur_delayinfo(struct seq_file *m, void 
*unused)
drm_i915_private_t *dev_priv = dev-dev_private;
int ret;
 
+   flush_delayed_work(dev_priv-rps.delayed_resume_work);
+
if (IS_GEN5(dev)) {
u16 rgvswctl = I915_READ16(MEMSWCTL);
u16 rgvstat = I915_READ16(MEMSTAT_ILK);
@@ -1321,6 +1323,8 @@ static int i915_ring_freq_table(struct seq_file *m, void 
*unused)
return 0;
}
 
+   flush_delayed_work(dev_priv-rps.delayed_resume_work);
+
ret = mutex_lock_interruptible(dev_priv-rps.hw_lock);
if (ret)
return ret;
@@ -1972,6 +1976,8 @@ i915_max_freq_get(void *data, u64 *val)
if (!(IS_GEN6(dev) || IS_GEN7(dev)))
return -ENODEV;
 
+   flush_delayed_work(dev_priv-rps.delayed_resume_work);
+
ret = mutex_lock_interruptible(dev_priv-rps.hw_lock);
if (ret)
return ret;
@@ -1996,6 +2002,8 @@ i915_max_freq_set(void *data, u64 val)
if (!(IS_GEN6(dev) || IS_GEN7(dev)))
return -ENODEV;
 
+   flush_delayed_work(dev_priv-rps.delayed_resume_work);
+
DRM_DEBUG_DRIVER(Manually setting max freq to %llu\n, val);
 
ret = mutex_lock_interruptible(dev_priv-rps.hw_lock);
@@ -2034,6 +2042,8 @@ i915_min_freq_get(void *data, u64 *val)
if (!(IS_GEN6(dev) || IS_GEN7(dev)))
return -ENODEV;
 
+   flush_delayed_work(dev_priv-rps.delayed_resume_work);
+
ret = mutex_lock_interruptible(dev_priv-rps.hw_lock);
if (ret)
return ret;
@@ -2058,6 +2068,8 @@ i915_min_freq_set(void *data, u64 val)
if (!(IS_GEN6(dev) || IS_GEN7(dev)))
return -ENODEV;
 
+   flush_delayed_work(dev_priv-rps.delayed_resume_work);
+
DRM_DEBUG_DRIVER(Manually setting min freq to %llu\n, val);
 
ret = mutex_lock_interruptible(dev_priv-rps.hw_lock);
diff --git a/drivers/gpu/drm/i915/i915_sysfs.c 
b/drivers/gpu/drm/i915/i915_sysfs.c
index d572435..270892b 100644
--- a/drivers/gpu/drm/i915/i915_sysfs.c
+++ b/drivers/gpu/drm/i915/i915_sysfs.c
@@ -213,6 +213,8 @@ static ssize_t gt_cur_freq_mhz_show(struct device *kdev,
struct drm_i915_private *dev_priv = dev-dev_private;
int ret;
 
+   flush_delayed_work(dev_priv-rps.delayed_resume_work);
+
mutex_lock(dev_priv-rps.hw_lock);
if (IS_VALLEYVIEW(dev_priv-dev)) {
u32 freq;
@@ -245,6 +247,8 @@ static ssize_t gt_max_freq_mhz_show(struct device *kdev, 
struct device_attribute
struct drm_i915_private *dev_priv = dev-dev_private;
int ret;
 
+   flush_delayed_work(dev_priv-rps.delayed_resume_work);
+
mutex_lock(dev_priv-rps.hw_lock);
if (IS_VALLEYVIEW(dev_priv-dev))
ret = vlv_gpu_freq(dev_priv-mem_freq, dev_priv-rps.max_delay);
@@ -269,6 +273,8 @@ static ssize_t gt_max_freq_mhz_store(struct device *kdev,
if (ret)
return ret;
 
+   flush_delayed_work(dev_priv-rps.delayed_resume_work);
+
mutex_lock(dev_priv-rps.hw_lock);
 
if (IS_VALLEYVIEW(dev_priv-dev)) {
@@ -317,6 +323,8 @@ static ssize_t gt_min_freq_mhz_show(struct device *kdev, 
struct device_attribute
struct drm_i915_private *dev_priv = dev-dev_private;
int ret;
 
+   flush_delayed_work(dev_priv-rps.delayed_resume_work);
+
mutex_lock(dev_priv-rps.hw_lock);
if (IS_VALLEYVIEW(dev_priv-dev))
ret = vlv_gpu_freq(dev_priv-mem_freq, dev_priv-rps.min_delay);
@@ -341,6 +349,8 @@ static ssize_t gt_min_freq_mhz_store(struct device *kdev,
if (ret)
return ret;
 
+   flush_delayed_work(dev_priv-rps.delayed_resume_work);
+
mutex_lock(dev_priv-rps.hw_lock);
 
if (IS_VALLEYVIEW(dev)) {
-- 
1.7.9.5