Commit 36cd7444 authored by Dave Airlie's avatar Dave Airlie

drm/i915: check connector->encoder before using it.

DP MST will need connectors that aren't connected to specific
encoders, add some checks in advance to avoid oopses.
Reviewed-by: default avatarTodd Previte <tprevite@gmail.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 44905a27
...@@ -2209,6 +2209,7 @@ static void intel_connector_info(struct seq_file *m, ...@@ -2209,6 +2209,7 @@ static void intel_connector_info(struct seq_file *m,
seq_printf(m, "\tCEA rev: %d\n", seq_printf(m, "\tCEA rev: %d\n",
connector->display_info.cea_rev); connector->display_info.cea_rev);
} }
if (intel_encoder) {
if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT || if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
intel_encoder->type == INTEL_OUTPUT_EDP) intel_encoder->type == INTEL_OUTPUT_EDP)
intel_dp_info(m, intel_connector); intel_dp_info(m, intel_connector);
...@@ -2216,6 +2217,7 @@ static void intel_connector_info(struct seq_file *m, ...@@ -2216,6 +2217,7 @@ static void intel_connector_info(struct seq_file *m,
intel_hdmi_info(m, intel_connector); intel_hdmi_info(m, intel_connector);
else if (intel_encoder->type == INTEL_OUTPUT_LVDS) else if (intel_encoder->type == INTEL_OUTPUT_LVDS)
intel_lvds_info(m, intel_connector); intel_lvds_info(m, intel_connector);
}
seq_printf(m, "\tmodes:\n"); seq_printf(m, "\tmodes:\n");
list_for_each_entry(mode, &connector->modes, head) list_for_each_entry(mode, &connector->modes, head)
......
...@@ -1165,6 +1165,8 @@ static void i915_hotplug_work_func(struct work_struct *work) ...@@ -1165,6 +1165,8 @@ static void i915_hotplug_work_func(struct work_struct *work)
dev_priv->hpd_event_bits = 0; dev_priv->hpd_event_bits = 0;
list_for_each_entry(connector, &mode_config->connector_list, head) { list_for_each_entry(connector, &mode_config->connector_list, head) {
intel_connector = to_intel_connector(connector); intel_connector = to_intel_connector(connector);
if (!intel_connector->encoder)
continue;
intel_encoder = intel_connector->encoder; intel_encoder = intel_connector->encoder;
if (intel_encoder->hpd_pin > HPD_NONE && if (intel_encoder->hpd_pin > HPD_NONE &&
dev_priv->hpd_stats[intel_encoder->hpd_pin].hpd_mark == HPD_MARK_DISABLED && dev_priv->hpd_stats[intel_encoder->hpd_pin].hpd_mark == HPD_MARK_DISABLED &&
...@@ -1195,6 +1197,8 @@ static void i915_hotplug_work_func(struct work_struct *work) ...@@ -1195,6 +1197,8 @@ static void i915_hotplug_work_func(struct work_struct *work)
list_for_each_entry(connector, &mode_config->connector_list, head) { list_for_each_entry(connector, &mode_config->connector_list, head) {
intel_connector = to_intel_connector(connector); intel_connector = to_intel_connector(connector);
if (!intel_connector->encoder)
continue;
intel_encoder = intel_connector->encoder; intel_encoder = intel_connector->encoder;
if (hpd_event_bits & (1 << intel_encoder->hpd_pin)) { if (hpd_event_bits & (1 << intel_encoder->hpd_pin)) {
if (intel_encoder->hot_plug) if (intel_encoder->hot_plug)
......
...@@ -5003,6 +5003,8 @@ static void intel_connector_check_state(struct intel_connector *connector) ...@@ -5003,6 +5003,8 @@ static void intel_connector_check_state(struct intel_connector *connector)
"wrong connector dpms state\n"); "wrong connector dpms state\n");
WARN(connector->base.encoder != &encoder->base, WARN(connector->base.encoder != &encoder->base,
"active connector not linked to encoder\n"); "active connector not linked to encoder\n");
if (encoder) {
WARN(!encoder->connectors_active, WARN(!encoder->connectors_active,
"encoder->connectors_active not set\n"); "encoder->connectors_active not set\n");
...@@ -5018,6 +5020,7 @@ static void intel_connector_check_state(struct intel_connector *connector) ...@@ -5018,6 +5020,7 @@ static void intel_connector_check_state(struct intel_connector *connector)
WARN(pipe != to_intel_crtc(crtc)->pipe, WARN(pipe != to_intel_crtc(crtc)->pipe,
"encoder active on the wrong pipe\n"); "encoder active on the wrong pipe\n");
} }
}
} }
/* Even simpler default implementation, if there's really no special case to /* Even simpler default implementation, if there's really no special case to
......
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