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

Commit 081dfcfa authored by Ville Syrjälä's avatar Ville Syrjälä
Browse files

drm/i915: Pass the encoder type explicitly to skl_set_iboost()



encoder->type isn't reliable for DP/HDMI encoders, so pass the type
explicity to skl_set_iboost(). Also take the opportunity to streamline
the code.

v2: Clean up the argument types to skl_ddi_set_iboost() while at it

Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171016145705.11780-4-ville.syrjala@linux.intel.com


Reviewed-by: default avatarJames Ausmus <james.ausmus@intel.com>
parent 975786ee
Loading
Loading
Loading
Loading
+22 −35
Original line number Diff line number Diff line
@@ -1788,50 +1788,37 @@ static void _skl_ddi_set_iboost(struct drm_i915_private *dev_priv,
	I915_WRITE(DISPIO_CR_TX_BMU_CR0, tmp);
}

static void skl_ddi_set_iboost(struct intel_encoder *encoder, u32 level)
static void skl_ddi_set_iboost(struct intel_encoder *encoder,
			       int level, enum intel_output_type type)
{
	struct intel_digital_port *intel_dig_port = enc_to_dig_port(&encoder->base);
	struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev);
	enum port port = intel_dig_port->port;
	int type = encoder->type;
	const struct ddi_buf_trans *ddi_translations;
	uint8_t iboost;
	uint8_t dp_iboost, hdmi_iboost;
	int n_entries;

	/* VBT may override standard boost values */
	dp_iboost = dev_priv->vbt.ddi_port_info[port].dp_boost_level;
	hdmi_iboost = dev_priv->vbt.ddi_port_info[port].hdmi_boost_level;
	if (type == INTEL_OUTPUT_HDMI)
		iboost = dev_priv->vbt.ddi_port_info[port].hdmi_boost_level;
	else
		iboost = dev_priv->vbt.ddi_port_info[port].dp_boost_level;

	if (type == INTEL_OUTPUT_DP) {
		if (dp_iboost) {
			iboost = dp_iboost;
		} else {
			ddi_translations = intel_ddi_get_buf_trans_dp(dev_priv, &n_entries);
			iboost = ddi_translations[level].i_boost;
		}
	} else if (type == INTEL_OUTPUT_EDP) {
		if (dp_iboost) {
			iboost = dp_iboost;
		} else {
	if (iboost == 0) {
		const struct ddi_buf_trans *ddi_translations;
		int n_entries;

		if (type == INTEL_OUTPUT_HDMI)
			ddi_translations = intel_ddi_get_buf_trans_hdmi(dev_priv, &n_entries);
		else if (type == INTEL_OUTPUT_EDP)
			ddi_translations = intel_ddi_get_buf_trans_edp(dev_priv, &n_entries);
		else
			ddi_translations = intel_ddi_get_buf_trans_dp(dev_priv, &n_entries);

			if (WARN_ON(port != PORT_A &&
		if (WARN_ON(type != INTEL_OUTPUT_HDMI &&
			    port != PORT_A &&
			    port != PORT_E && n_entries > 9))
			n_entries = 9;

		iboost = ddi_translations[level].i_boost;
	}
	} else if (type == INTEL_OUTPUT_HDMI) {
		if (hdmi_iboost) {
			iboost = hdmi_iboost;
		} else {
			ddi_translations = intel_ddi_get_buf_trans_hdmi(dev_priv, &n_entries);
			iboost = ddi_translations[level].i_boost;
		}
	} else {
		return;
	}

	/* Make sure that the requested I_boost is valid */
	if (iboost && iboost != 0x1 && iboost != 0x3 && iboost != 0x7) {
@@ -2096,7 +2083,7 @@ uint32_t ddi_signal_levels(struct intel_dp *intel_dp)
	uint32_t level = intel_ddi_dp_level(intel_dp);

	if (IS_GEN9_BC(dev_priv))
	    skl_ddi_set_iboost(encoder, level);
		skl_ddi_set_iboost(encoder, level, encoder->type);

	return DDI_BUF_TRANS_SELECT(level);
}
@@ -2218,7 +2205,7 @@ static void intel_ddi_pre_enable_hdmi(struct intel_encoder *encoder,
		intel_prepare_hdmi_ddi_buffers(encoder);

	if (IS_GEN9_BC(dev_priv))
		skl_ddi_set_iboost(encoder, level);
		skl_ddi_set_iboost(encoder, level, INTEL_OUTPUT_HDMI);

	intel_dig_port->set_infoframes(&encoder->base,
				       crtc_state->has_infoframe,