drm/i915: Parse max HDMI TMDS clock from VBT
Starting from version 204 VBT can specify the max TMDS clock we are allowed to use with HDMI ports. Parse that information and take it into account when filtering modes and computing a crtc state. Also take the opportunity to sort the platform check if ladder from new to old. v2: Add defines for the values into intel_vbt_defs.h (Jani) Don't fall back to 0 silently for unknown values (Jani) Skip the debug print for the 0 case (Jani) Cc: Jani Nikula <jani.nikula@intel.com> Reviewed-by: Jani Nikula <jani.nikula@intel.com> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20171030145702.23662-1-ville.syrjala@linux.intel.com
This commit is contained in:
@@ -1224,24 +1224,34 @@ static void pch_post_disable_hdmi(struct intel_encoder *encoder,
|
||||
intel_disable_hdmi(encoder, old_crtc_state, old_conn_state);
|
||||
}
|
||||
|
||||
static int intel_hdmi_source_max_tmds_clock(struct drm_i915_private *dev_priv)
|
||||
static int intel_hdmi_source_max_tmds_clock(struct intel_encoder *encoder)
|
||||
{
|
||||
if (IS_G4X(dev_priv))
|
||||
return 165000;
|
||||
else if (IS_GEMINILAKE(dev_priv))
|
||||
return 594000;
|
||||
else if (IS_HASWELL(dev_priv) || INTEL_INFO(dev_priv)->gen >= 8)
|
||||
return 300000;
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
const struct ddi_vbt_port_info *info =
|
||||
&dev_priv->vbt.ddi_port_info[encoder->port];
|
||||
int max_tmds_clock;
|
||||
|
||||
if (IS_GEMINILAKE(dev_priv))
|
||||
max_tmds_clock = 594000;
|
||||
else if (INTEL_GEN(dev_priv) >= 8 || IS_HASWELL(dev_priv))
|
||||
max_tmds_clock = 300000;
|
||||
else if (INTEL_GEN(dev_priv) >= 5)
|
||||
max_tmds_clock = 225000;
|
||||
else
|
||||
return 225000;
|
||||
max_tmds_clock = 165000;
|
||||
|
||||
if (info->max_tmds_clock)
|
||||
max_tmds_clock = min(max_tmds_clock, info->max_tmds_clock);
|
||||
|
||||
return max_tmds_clock;
|
||||
}
|
||||
|
||||
static int hdmi_port_clock_limit(struct intel_hdmi *hdmi,
|
||||
bool respect_downstream_limits,
|
||||
bool force_dvi)
|
||||
{
|
||||
struct drm_device *dev = intel_hdmi_to_dev(hdmi);
|
||||
int max_tmds_clock = intel_hdmi_source_max_tmds_clock(to_i915(dev));
|
||||
struct intel_encoder *encoder = &hdmi_to_dig_port(hdmi)->base;
|
||||
int max_tmds_clock = intel_hdmi_source_max_tmds_clock(encoder);
|
||||
|
||||
if (respect_downstream_limits) {
|
||||
struct intel_connector *connector = hdmi->attached_connector;
|
||||
|
Reference in New Issue
Block a user