| From 635708d73aec306534b98f6cda53b8049c14fc08 Mon Sep 17 00:00:00 2001 |
| From: Jesse Barnes <jbarnes@virtuousgeek.org> |
| Date: Wed, 17 Apr 2013 15:54:57 -0700 |
| Subject: drm/i915: VLV GPU frequency to opcode functions |
| |
| When requesting frequency changes or querying status from the Punit, we |
| need to use an opcode that corresponds to the frequency, taking into |
| account the memory frequency. |
| |
| Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org> |
| Acked-by: Ben Widawsky <ben@bwidawsk.net> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| (cherry picked from commit 855ba3be12badf6228151ca3ccf54632cfdd463d) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/i915_drv.h | 2 ++ |
| drivers/gpu/drm/i915/intel_pm.c | 56 +++++++++++++++++++++++++++++++++++++++++ |
| 2 files changed, 58 insertions(+) |
| |
| diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h |
| index 989d9a2d8bff..3be035a8a7b1 100644 |
| --- a/drivers/gpu/drm/i915/i915_drv.h |
| +++ b/drivers/gpu/drm/i915/i915_drv.h |
| @@ -1891,6 +1891,8 @@ 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 valleyview_punit_read(struct drm_i915_private *dev_priv, u8 addr, u32 *val); |
| int valleyview_punit_write(struct drm_i915_private *dev_priv, u8 addr, u32 val); |
| +int vlv_gpu_freq(int ddr_freq, int val); |
| +int vlv_freq_opcode(int ddr_freq, int val); |
| |
| #define __i915_read(x, y) \ |
| u##x i915_read##x(struct drm_i915_private *dev_priv, u32 reg); |
| diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c |
| index f10a9b6758cb..746990fd1bd4 100644 |
| --- a/drivers/gpu/drm/i915/intel_pm.c |
| +++ b/drivers/gpu/drm/i915/intel_pm.c |
| @@ -4655,3 +4655,59 @@ int valleyview_punit_write(struct drm_i915_private *dev_priv, u8 addr, u32 val) |
| { |
| return vlv_punit_rw(dev_priv, PUNIT_OPCODE_REG_WRITE, addr, &val); |
| } |
| + |
| +int vlv_gpu_freq(int ddr_freq, int val) |
| +{ |
| + int mult, base; |
| + |
| + switch (ddr_freq) { |
| + case 800: |
| + mult = 20; |
| + base = 120; |
| + break; |
| + case 1066: |
| + mult = 22; |
| + base = 133; |
| + break; |
| + case 1333: |
| + mult = 21; |
| + base = 125; |
| + break; |
| + default: |
| + return -1; |
| + } |
| + |
| + return ((val - 0xbd) * mult) + base; |
| +} |
| + |
| +int vlv_freq_opcode(int ddr_freq, int val) |
| +{ |
| + int mult, base; |
| + |
| + switch (ddr_freq) { |
| + case 800: |
| + mult = 20; |
| + base = 120; |
| + break; |
| + case 1066: |
| + mult = 22; |
| + base = 133; |
| + break; |
| + case 1333: |
| + mult = 21; |
| + base = 125; |
| + break; |
| + default: |
| + return -1; |
| + } |
| + |
| + val /= mult; |
| + val -= base / mult; |
| + val += 0xbd; |
| + |
| + if (val > 0xea) |
| + val = 0xea; |
| + |
| + return val; |
| +} |
| + |
| -- |
| 1.8.5.rc3 |
| |