From: Ville Syrjälä <ville.syrj...@linux.intel.com>

CPT/PPT require a specific procedure for enabling 12bpc HDMI. Implement
it, and to keep things neat pull the code into a function.

Signed-off-by: Ville Syrjälä <ville.syrj...@linux.intel.com>
---
 drivers/gpu/drm/i915/i915_reg.h   |  1 +
 drivers/gpu/drm/i915/intel_hdmi.c | 55 ++++++++++++++++++++++++++++++++++++++-
 2 files changed, 55 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index a56d9a7..f9a0d66 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -5399,6 +5399,7 @@ enum punit_power_well {
 #define _TRANSA_CHICKEN1        0xf0060
 #define _TRANSB_CHICKEN1        0xf1060
 #define TRANS_CHICKEN1(pipe) _PIPE(pipe, _TRANSA_CHICKEN1, _TRANSB_CHICKEN1)
+#define  TRANS_CHICKEN1_HDMI_GC_DISABLE                (1<<10)
 #define  TRANS_CHICKEN1_DP0UNIT_GC_DISABLE     (1<<4)
 #define _TRANSA_CHICKEN2        0xf0064
 #define _TRANSB_CHICKEN2        0xf1064
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c 
b/drivers/gpu/drm/i915/intel_hdmi.c
index 8b5f3aa..76637ba 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -793,6 +793,56 @@ static void intel_enable_hdmi(struct intel_encoder 
*encoder)
        }
 }
 
+static void cpt_enable_hdmi(struct intel_encoder *encoder)
+{
+       struct drm_device *dev = encoder->base.dev;
+       struct drm_i915_private *dev_priv = dev->dev_private;
+       struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
+       struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
+       enum pipe pipe = crtc->pipe;
+       u32 temp;
+
+       temp = I915_READ(intel_hdmi->hdmi_reg);
+
+       temp |= SDVO_ENABLE;
+       if (crtc->config.has_audio)
+               temp |= SDVO_AUDIO_ENABLE;
+
+       /*
+        * WaEnableHDMI8bpcBefore12bpc:snb,ivb
+        *
+        * The procedure for 12bpc is as follows:
+        * 1. disable HDMI clock gating
+        * 2. enable HDMI with 8bpc
+        * 3. enable HDMI with 12bpc
+        * 4. enable HDMI clock gating
+        */
+
+       if (crtc->config.pipe_bpp > 24) {
+               I915_WRITE(TRANS_CHICKEN1(pipe),
+                          I915_READ(TRANS_CHICKEN1(pipe)) |
+                          TRANS_CHICKEN1_HDMI_GC_DISABLE);
+
+               temp &= ~SDVO_COLOR_FORMAT_MASK;
+               temp |= SDVO_COLOR_FORMAT_8bpc;
+       }
+
+       I915_WRITE(intel_hdmi->hdmi_reg, temp);
+       POSTING_READ(intel_hdmi->hdmi_reg);
+
+       if (crtc->config.pipe_bpp > 24) {
+               temp &= ~SDVO_COLOR_FORMAT_MASK;
+               temp |= HDMI_COLOR_FORMAT_12bpc;
+
+               I915_WRITE(intel_hdmi->hdmi_reg, temp);
+               POSTING_READ(intel_hdmi->hdmi_reg);
+
+               I915_WRITE(TRANS_CHICKEN1(pipe),
+                          I915_READ(TRANS_CHICKEN1(pipe)) &
+                          ~TRANS_CHICKEN1_HDMI_GC_DISABLE);
+       }
+}
+
 static void vlv_enable_hdmi(struct intel_encoder *encoder)
 {
 }
@@ -1688,7 +1738,10 @@ void intel_hdmi_init(struct drm_device *dev, int 
hdmi_reg, enum port port)
                intel_encoder->post_disable = vlv_hdmi_post_disable;
        } else {
                intel_encoder->pre_enable = intel_hdmi_pre_enable;
-               intel_encoder->enable = intel_enable_hdmi;
+               if (HAS_PCH_CPT(dev))
+                       intel_encoder->enable = cpt_enable_hdmi;
+               else
+                       intel_encoder->enable = intel_enable_hdmi;
        }
 
        intel_encoder->type = INTEL_OUTPUT_HDMI;
-- 
2.0.4

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

Reply via email to