aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDeepak S <deepak.s@linux.intel.com>2014-07-12 05:24:33 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-07-11 12:22:01 -0400
commit22b1b2f866b2089d8264e367121c9c9ee0689da4 (patch)
tree3b2aeb264245d428ede75e6b2fdeb568bebf8ebb
parent67c3bf6f55a97a0915a0f9ea07278a3073cc9601 (diff)
drm/i915: CHV GPU frequency to opcode functions
Adding chv specific fre/encode conversion. v2: Remove generic function and platform check (Daniel) Signed-off-by: Deepak S <deepak.s@linux.intel.com> Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c78
1 files changed, 76 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 32ccd7a9378d..1ec777a3914a 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -6926,7 +6926,7 @@ int sandybridge_pcode_write(struct drm_i915_private *dev_priv, u8 mbox, u32 val)
6926 return 0; 6926 return 0;
6927} 6927}
6928 6928
6929int vlv_gpu_freq(struct drm_i915_private *dev_priv, int val) 6929int byt_gpu_freq(struct drm_i915_private *dev_priv, int val)
6930{ 6930{
6931 int div; 6931 int div;
6932 6932
@@ -6948,7 +6948,7 @@ int vlv_gpu_freq(struct drm_i915_private *dev_priv, int val)
6948 return DIV_ROUND_CLOSEST(dev_priv->mem_freq * (val + 6 - 0xbd), 4 * div); 6948 return DIV_ROUND_CLOSEST(dev_priv->mem_freq * (val + 6 - 0xbd), 4 * div);
6949} 6949}
6950 6950
6951int vlv_freq_opcode(struct drm_i915_private *dev_priv, int val) 6951int byt_freq_opcode(struct drm_i915_private *dev_priv, int val)
6952{ 6952{
6953 int mul; 6953 int mul;
6954 6954
@@ -6970,6 +6970,80 @@ int vlv_freq_opcode(struct drm_i915_private *dev_priv, int val)
6970 return DIV_ROUND_CLOSEST(4 * mul * val, dev_priv->mem_freq) + 0xbd - 6; 6970 return DIV_ROUND_CLOSEST(4 * mul * val, dev_priv->mem_freq) + 0xbd - 6;
6971} 6971}
6972 6972
6973int chv_gpu_freq(struct drm_i915_private *dev_priv, int val)
6974{
6975 int div, freq;
6976
6977 switch (dev_priv->rps.cz_freq) {
6978 case 200:
6979 div = 5;
6980 break;
6981 case 267:
6982 div = 6;
6983 break;
6984 case 320:
6985 case 333:
6986 case 400:
6987 div = 8;
6988 break;
6989 default:
6990 return -1;
6991 }
6992
6993 freq = (DIV_ROUND_CLOSEST((dev_priv->rps.cz_freq * val), 2 * div) / 2);
6994
6995 return freq;
6996}
6997
6998int chv_freq_opcode(struct drm_i915_private *dev_priv, int val)
6999{
7000 int mul, opcode;
7001
7002 switch (dev_priv->rps.cz_freq) {
7003 case 200:
7004 mul = 5;
7005 break;
7006 case 267:
7007 mul = 6;
7008 break;
7009 case 320:
7010 case 333:
7011 case 400:
7012 mul = 8;
7013 break;
7014 default:
7015 return -1;
7016 }
7017
7018 opcode = (DIV_ROUND_CLOSEST((val * 2 * mul), dev_priv->rps.cz_freq) * 2);
7019
7020 return opcode;
7021}
7022
7023int vlv_gpu_freq(struct drm_i915_private *dev_priv, int val)
7024{
7025 int ret = -1;
7026
7027 if (IS_CHERRYVIEW(dev_priv->dev))
7028 ret = chv_gpu_freq(dev_priv, val);
7029 else if (IS_VALLEYVIEW(dev_priv->dev))
7030 ret = byt_gpu_freq(dev_priv, val);
7031
7032 return ret;
7033}
7034
7035int vlv_freq_opcode(struct drm_i915_private *dev_priv, int val)
7036{
7037 int ret = -1;
7038
7039 if (IS_CHERRYVIEW(dev_priv->dev))
7040 ret = chv_freq_opcode(dev_priv, val);
7041 else if (IS_VALLEYVIEW(dev_priv->dev))
7042 ret = byt_freq_opcode(dev_priv, val);
7043
7044 return ret;
7045}
7046
6973void intel_pm_setup(struct drm_device *dev) 7047void intel_pm_setup(struct drm_device *dev)
6974{ 7048{
6975 struct drm_i915_private *dev_priv = dev->dev_private; 7049 struct drm_i915_private *dev_priv = dev->dev_private;