Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2ca711ca authored by Madhav Chauhan's avatar Madhav Chauhan Committed by Jani Nikula
Browse files

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: default avatarMadhav Chauhan <madhav.chauhan@intel.com>
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/2e10b977dfc7aa985a8559d6cd59ed0981848e95.1543500286.git.jani.nikula@intel.com
parent 5a8507b5
Loading
Loading
Loading
Loading
+24 −7
Original line number Diff line number Diff line
@@ -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)
		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);