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

Commit 70332ac5 authored by Imre Deak's avatar Imre Deak
Browse files

drm/i915/icl+: Sanitize port to PLL mapping



BIOS can leave the PLL to port mapping enabled, even if the
corresponding encoder is disabled. Disable the port mapping in this
case.

Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: José Roberto de Souza <jose.souza@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
Reviewed-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
Reviewed-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181101140427.31026-9-imre.deak@intel.com
parent c7375d95
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -2822,6 +2822,29 @@ void icl_unmap_plls_to_ports(struct drm_crtc *crtc,
	}
}

void icl_sanitize_encoder_pll_mapping(struct intel_encoder *encoder)
{
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
	u32 val = I915_READ(DPCLKA_CFGCR0_ICL);
	enum port port = encoder->port;
	bool clk_enabled = !(val & icl_dpclka_cfgcr0_clk_off(dev_priv, port));

	if (clk_enabled == !!encoder->base.crtc)
		return;

	/*
	 * Punt on the case now where clock is disabled, but the encoder is
	 * enabled, something else is really broken then.
	 */
	if (WARN_ON(!clk_enabled))
		return;

	DRM_NOTE("Port %c is disabled but it has a mapped PLL, unmap it\n",
		 port_name(port));
	val |= icl_dpclka_cfgcr0_clk_off(dev_priv, port);
	I915_WRITE(DPCLKA_CFGCR0_ICL, val);
}

static void intel_ddi_clk_select(struct intel_encoder *encoder,
				 const struct intel_crtc_state *crtc_state)
{
+4 −0
Original line number Diff line number Diff line
@@ -15349,6 +15349,7 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc,

static void intel_sanitize_encoder(struct intel_encoder *encoder)
{
	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
	struct intel_connector *connector;

	/* We need to check both for a crtc link (meaning that the
@@ -15390,6 +15391,9 @@ static void intel_sanitize_encoder(struct intel_encoder *encoder)

	/* notify opregion of the sanitized encoder state */
	intel_opregion_notify_encoder(encoder, connector && has_active_crtc);

	if (INTEL_GEN(dev_priv) >= 11)
		icl_sanitize_encoder_pll_mapping(encoder);
}

void i915_redisable_vga_power_on(struct drm_i915_private *dev_priv)
+1 −0
Original line number Diff line number Diff line
@@ -1521,6 +1521,7 @@ void icl_map_plls_to_ports(struct drm_crtc *crtc,
void icl_unmap_plls_to_ports(struct drm_crtc *crtc,
			     struct intel_crtc_state *crtc_state,
			     struct drm_atomic_state *old_state);
void icl_sanitize_encoder_pll_mapping(struct intel_encoder *encoder);

unsigned int intel_fb_align_height(const struct drm_framebuffer *fb,
				   int color_plane, unsigned int height);