drm/i915/icl: Consider DSI for getting transcoder state
authorMadhav Chauhan <madhav.chauhan@intel.com>
Thu, 29 Nov 2018 14:12:27 +0000 (16:12 +0200)
committerJani Nikula <jani.nikula@intel.com>
Mon, 3 Dec 2018 13:54:33 +0000 (15:54 +0200)
For Gen11 DSI, we use similar registers like for eDP
to find if DSI encoder is connected or not to a pipe.
This patch refactors existing hsw_get_transcoder_state()
to handle this.

v2 by Jani:
 - Add WARN_ON(dsi && edp) (Ville)

Signed-off-by: Madhav Chauhan <madhav.chauhan@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/2e10b977dfc7aa985a8559d6cd59ed0981848e95.1543500286.git.jani.nikula@intel.com
drivers/gpu/drm/i915/intel_display.c

index 3b4831c..9b5753c 100644 (file)
@@ -9477,6 +9477,8 @@ static bool hsw_get_transcoder_state(struct intel_crtc *crtc,
        struct drm_i915_private *dev_priv = to_i915(dev);
        enum intel_display_power_domain power_domain;
        u32 tmp;
+       bool is_dsi = false;
+       bool is_edp = false;
 
        /*
         * The pipe->transcoder mapping is fixed with the exception of the eDP
@@ -9489,26 +9491,41 @@ static bool hsw_get_transcoder_state(struct intel_crtc *crtc,
         * consistency and less surprising code; it's in always on power).
         */
        tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_EDP));
-       if (tmp & TRANS_DDI_FUNC_ENABLE) {
-               enum pipe trans_edp_pipe;
+       if (tmp & TRANS_DDI_FUNC_ENABLE)
+               is_edp = true;
+
+       if (IS_ICELAKE(dev_priv)) {
+               tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_DSI_0));
+               if (tmp & TRANS_DDI_FUNC_ENABLE)
+                       is_dsi = true;
+       }
+
+       WARN_ON(is_edp && is_dsi);
+
+       if (is_edp || is_dsi) {
+               enum pipe trans_pipe;
                switch (tmp & TRANS_DDI_EDP_INPUT_MASK) {
                default:
                        WARN(1, "unknown pipe linked to edp transcoder\n");
                        /* fall through */
                case TRANS_DDI_EDP_INPUT_A_ONOFF:
                case TRANS_DDI_EDP_INPUT_A_ON:
-                       trans_edp_pipe = PIPE_A;
+                       trans_pipe = PIPE_A;
                        break;
                case TRANS_DDI_EDP_INPUT_B_ONOFF:
-                       trans_edp_pipe = PIPE_B;
+                       trans_pipe = PIPE_B;
                        break;
                case TRANS_DDI_EDP_INPUT_C_ONOFF:
-                       trans_edp_pipe = PIPE_C;
+                       trans_pipe = PIPE_C;
                        break;
                }
 
-               if (trans_edp_pipe == crtc->pipe)
-                       pipe_config->cpu_transcoder = TRANSCODER_EDP;
+               if (trans_pipe == crtc->pipe) {
+                       if (is_edp)
+                               pipe_config->cpu_transcoder = TRANSCODER_EDP;
+                       else if (is_dsi)
+                               pipe_config->cpu_transcoder = TRANSCODER_DSI_0;
+               }
        }
 
        power_domain = POWER_DOMAIN_TRANSCODER(pipe_config->cpu_transcoder);