| From 1c2a2f772b86a80ed40f690fb971b8b2d52575c2 Mon Sep 17 00:00:00 2001 |
| From: Paulo Zanoni <paulo.r.zanoni@intel.com> |
| Date: Tue, 10 Sep 2013 19:36:37 -0300 |
| Subject: drm/i915: write D_COMP using the mailbox |
| |
| You can't write it using the MCHBAR mirror, the write will just get |
| dropped. |
| |
| This should make us BSpec-compliant, but there's no real bug I could |
| reproduce that is fixed by this patch. |
| |
| Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> |
| Signed-off-by: Rodrigo Vivi <rodrigo.vivi@gmail.com> |
| Reviewed-by: Damien Lespiau <damien.lespiau@intel.com> |
| [danvet: Fix spelling mistake in the comment that Damien spotted.] |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| |
| (cherry picked from commit 515b239269fb67fd167676d335a56ef0c13e53d5) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/i915_reg.h | 4 ++++ |
| drivers/gpu/drm/i915/intel_display.c | 10 ++++++++-- |
| 2 files changed, 12 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/gpu/drm/i915/i915_reg.h |
| +++ b/drivers/gpu/drm/i915/i915_reg.h |
| @@ -1443,6 +1443,8 @@ |
| * device 0 function 0's pci config register 0x44 or 0x48 and matches it in |
| * every way. It is not accessible from the CP register read instructions. |
| * |
| + * Starting from Haswell, you can't write registers using the MCHBAR mirror, |
| + * just read. |
| */ |
| #define MCHBAR_MIRROR_BASE 0x10000 |
| |
| @@ -4730,6 +4732,8 @@ |
| #define GEN6_PCODE_READ_MIN_FREQ_TABLE 0x9 |
| #define GEN6_PCODE_WRITE_RC6VIDS 0x4 |
| #define GEN6_PCODE_READ_RC6VIDS 0x5 |
| +#define GEN6_PCODE_READ_D_COMP 0x10 |
| +#define GEN6_PCODE_WRITE_D_COMP 0x11 |
| #define GEN6_ENCODE_RC6_VID(mv) (((mv) - 245) / 5) |
| #define GEN6_DECODE_RC6_VID(vids) (((vids) * 5) + 245) |
| #define GEN6_PCODE_DATA 0x138128 |
| --- a/drivers/gpu/drm/i915/intel_display.c |
| +++ b/drivers/gpu/drm/i915/intel_display.c |
| @@ -6135,7 +6135,10 @@ void hsw_disable_lcpll(struct drm_i915_p |
| |
| val = I915_READ(D_COMP); |
| val |= D_COMP_COMP_DISABLE; |
| - I915_WRITE(D_COMP, val); |
| + mutex_lock(&dev_priv->rps.hw_lock); |
| + if (sandybridge_pcode_write(dev_priv, GEN6_PCODE_WRITE_D_COMP, val)) |
| + DRM_ERROR("Failed to disable D_COMP\n"); |
| + mutex_unlock(&dev_priv->rps.hw_lock); |
| POSTING_READ(D_COMP); |
| ndelay(100); |
| |
| @@ -6177,7 +6180,10 @@ void hsw_restore_lcpll(struct drm_i915_p |
| val = I915_READ(D_COMP); |
| val |= D_COMP_COMP_FORCE; |
| val &= ~D_COMP_COMP_DISABLE; |
| - I915_WRITE(D_COMP, val); |
| + mutex_lock(&dev_priv->rps.hw_lock); |
| + if (sandybridge_pcode_write(dev_priv, GEN6_PCODE_WRITE_D_COMP, val)) |
| + DRM_ERROR("Failed to enable D_COMP\n"); |
| + mutex_unlock(&dev_priv->rps.hw_lock); |
| POSTING_READ(D_COMP); |
| |
| val = I915_READ(LCPLL_CTL); |