diff options
author | Madhav Chauhan <madhav.chauhan@intel.com> | 2018-11-29 16:12:27 +0200 |
---|---|---|
committer | Jani Nikula <jani.nikula@intel.com> | 2018-12-03 15:54:33 +0200 |
commit | 2ca711caeca2c6a4f3026d9fbdb135b65d7d68b3 (patch) | |
tree | 584180495656f94453e4a60325e4a897378aaa6e /drivers | |
parent | 5a8507b5aa84fe26f2511fd667aa5965499c9d82 (diff) |
drm/i915/icl: Consider DSI for getting transcoder state
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
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 3b4831c2c4b8..9b5753cdc76b 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -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); |