diff options
author | Deepak S <deepak.s@linux.intel.com> | 2014-07-12 05:24:33 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2014-07-11 12:22:01 -0400 |
commit | 22b1b2f866b2089d8264e367121c9c9ee0689da4 (patch) | |
tree | 3b2aeb264245d428ede75e6b2fdeb568bebf8ebb | |
parent | 67c3bf6f55a97a0915a0f9ea07278a3073cc9601 (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.c | 78 |
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 | ||
6929 | int vlv_gpu_freq(struct drm_i915_private *dev_priv, int val) | 6929 | int 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 | ||
6951 | int vlv_freq_opcode(struct drm_i915_private *dev_priv, int val) | 6951 | int 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 | ||
6973 | int 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 | |||
6998 | int 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 | |||
7023 | int 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 | |||
7035 | int 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 | |||
6973 | void intel_pm_setup(struct drm_device *dev) | 7047 | void 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; |