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

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.comReviewed-by: default avatarJames Ausmus <james.ausmus@intel.com>
parent 975786ee
...@@ -1788,49 +1788,36 @@ static void _skl_ddi_set_iboost(struct drm_i915_private *dev_priv, ...@@ -1788,49 +1788,36 @@ static void _skl_ddi_set_iboost(struct drm_i915_private *dev_priv,
I915_WRITE(DISPIO_CR_TX_BMU_CR0, tmp); 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 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); struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev);
enum port port = intel_dig_port->port; enum port port = intel_dig_port->port;
int type = encoder->type;
const struct ddi_buf_trans *ddi_translations;
uint8_t iboost; uint8_t iboost;
uint8_t dp_iboost, hdmi_iboost;
int n_entries;
/* VBT may override standard boost values */ if (type == INTEL_OUTPUT_HDMI)
dp_iboost = dev_priv->vbt.ddi_port_info[port].dp_boost_level; iboost = dev_priv->vbt.ddi_port_info[port].hdmi_boost_level;
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 (iboost == 0) {
if (dp_iboost) { const struct ddi_buf_trans *ddi_translations;
iboost = dp_iboost; int n_entries;
} else {
ddi_translations = intel_ddi_get_buf_trans_dp(dev_priv, &n_entries); if (type == INTEL_OUTPUT_HDMI)
iboost = ddi_translations[level].i_boost; ddi_translations = intel_ddi_get_buf_trans_hdmi(dev_priv, &n_entries);
} else if (type == INTEL_OUTPUT_EDP)
} else if (type == INTEL_OUTPUT_EDP) {
if (dp_iboost) {
iboost = dp_iboost;
} else {
ddi_translations = intel_ddi_get_buf_trans_edp(dev_priv, &n_entries); 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_E && n_entries > 9)) port != PORT_A &&
n_entries = 9; port != PORT_E && n_entries > 9))
n_entries = 9;
iboost = ddi_translations[level].i_boost; 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 */ /* Make sure that the requested I_boost is valid */
...@@ -2096,7 +2083,7 @@ uint32_t ddi_signal_levels(struct intel_dp *intel_dp) ...@@ -2096,7 +2083,7 @@ uint32_t ddi_signal_levels(struct intel_dp *intel_dp)
uint32_t level = intel_ddi_dp_level(intel_dp); uint32_t level = intel_ddi_dp_level(intel_dp);
if (IS_GEN9_BC(dev_priv)) 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); return DDI_BUF_TRANS_SELECT(level);
} }
...@@ -2218,7 +2205,7 @@ static void intel_ddi_pre_enable_hdmi(struct intel_encoder *encoder, ...@@ -2218,7 +2205,7 @@ static void intel_ddi_pre_enable_hdmi(struct intel_encoder *encoder,
intel_prepare_hdmi_ddi_buffers(encoder); intel_prepare_hdmi_ddi_buffers(encoder);
if (IS_GEN9_BC(dev_priv)) 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, intel_dig_port->set_infoframes(&encoder->base,
crtc_state->has_infoframe, crtc_state->has_infoframe,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment