diff options
author | Dave Airlie <airlied@redhat.com> | 2014-05-01 23:44:18 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2014-07-21 02:48:58 -0400 |
commit | 36cd7444c044806cd2a4e450a8385597221d5d25 (patch) | |
tree | f10068f47dd96af9ed84bdb2adeff950a4e601d1 | |
parent | 44905a27dd01f2bddd96664d0ab7da43a07f4d5a (diff) |
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: Todd Previte <tprevite@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 25 |
3 files changed, 27 insertions, 18 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 4a5b0f80e059..f27daf70ba72 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
@@ -2209,13 +2209,15 @@ static void intel_connector_info(struct seq_file *m, | |||
2209 | seq_printf(m, "\tCEA rev: %d\n", | 2209 | seq_printf(m, "\tCEA rev: %d\n", |
2210 | connector->display_info.cea_rev); | 2210 | connector->display_info.cea_rev); |
2211 | } | 2211 | } |
2212 | if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT || | 2212 | if (intel_encoder) { |
2213 | intel_encoder->type == INTEL_OUTPUT_EDP) | 2213 | if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT || |
2214 | intel_dp_info(m, intel_connector); | 2214 | intel_encoder->type == INTEL_OUTPUT_EDP) |
2215 | else if (intel_encoder->type == INTEL_OUTPUT_HDMI) | 2215 | intel_dp_info(m, intel_connector); |
2216 | intel_hdmi_info(m, intel_connector); | 2216 | else if (intel_encoder->type == INTEL_OUTPUT_HDMI) |
2217 | else if (intel_encoder->type == INTEL_OUTPUT_LVDS) | 2217 | intel_hdmi_info(m, intel_connector); |
2218 | intel_lvds_info(m, intel_connector); | 2218 | else if (intel_encoder->type == INTEL_OUTPUT_LVDS) |
2219 | intel_lvds_info(m, intel_connector); | ||
2220 | } | ||
2219 | 2221 | ||
2220 | seq_printf(m, "\tmodes:\n"); | 2222 | seq_printf(m, "\tmodes:\n"); |
2221 | list_for_each_entry(mode, &connector->modes, head) | 2223 | list_for_each_entry(mode, &connector->modes, head) |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 026f0a3f3b90..12d77b5368c4 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -1165,6 +1165,8 @@ static void i915_hotplug_work_func(struct work_struct *work) | |||
1165 | dev_priv->hpd_event_bits = 0; | 1165 | dev_priv->hpd_event_bits = 0; |
1166 | list_for_each_entry(connector, &mode_config->connector_list, head) { | 1166 | list_for_each_entry(connector, &mode_config->connector_list, head) { |
1167 | intel_connector = to_intel_connector(connector); | 1167 | intel_connector = to_intel_connector(connector); |
1168 | if (!intel_connector->encoder) | ||
1169 | continue; | ||
1168 | intel_encoder = intel_connector->encoder; | 1170 | intel_encoder = intel_connector->encoder; |
1169 | if (intel_encoder->hpd_pin > HPD_NONE && | 1171 | if (intel_encoder->hpd_pin > HPD_NONE && |
1170 | dev_priv->hpd_stats[intel_encoder->hpd_pin].hpd_mark == HPD_MARK_DISABLED && | 1172 | 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 | 1197 | ||
1196 | list_for_each_entry(connector, &mode_config->connector_list, head) { | 1198 | list_for_each_entry(connector, &mode_config->connector_list, head) { |
1197 | intel_connector = to_intel_connector(connector); | 1199 | intel_connector = to_intel_connector(connector); |
1200 | if (!intel_connector->encoder) | ||
1201 | continue; | ||
1198 | intel_encoder = intel_connector->encoder; | 1202 | intel_encoder = intel_connector->encoder; |
1199 | if (hpd_event_bits & (1 << intel_encoder->hpd_pin)) { | 1203 | if (hpd_event_bits & (1 << intel_encoder->hpd_pin)) { |
1200 | if (intel_encoder->hot_plug) | 1204 | if (intel_encoder->hot_plug) |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index e07e6b5dee35..008bb3dc88cb 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -5003,20 +5003,23 @@ static void intel_connector_check_state(struct intel_connector *connector) | |||
5003 | "wrong connector dpms state\n"); | 5003 | "wrong connector dpms state\n"); |
5004 | WARN(connector->base.encoder != &encoder->base, | 5004 | WARN(connector->base.encoder != &encoder->base, |
5005 | "active connector not linked to encoder\n"); | 5005 | "active connector not linked to encoder\n"); |
5006 | WARN(!encoder->connectors_active, | ||
5007 | "encoder->connectors_active not set\n"); | ||
5008 | 5006 | ||
5009 | encoder_enabled = encoder->get_hw_state(encoder, &pipe); | 5007 | if (encoder) { |
5010 | WARN(!encoder_enabled, "encoder not enabled\n"); | 5008 | WARN(!encoder->connectors_active, |
5011 | if (WARN_ON(!encoder->base.crtc)) | 5009 | "encoder->connectors_active not set\n"); |
5012 | return; | 5010 | |
5011 | encoder_enabled = encoder->get_hw_state(encoder, &pipe); | ||
5012 | WARN(!encoder_enabled, "encoder not enabled\n"); | ||
5013 | if (WARN_ON(!encoder->base.crtc)) | ||
5014 | return; | ||
5013 | 5015 | ||
5014 | crtc = encoder->base.crtc; | 5016 | crtc = encoder->base.crtc; |
5015 | 5017 | ||
5016 | WARN(!crtc->enabled, "crtc not enabled\n"); | 5018 | WARN(!crtc->enabled, "crtc not enabled\n"); |
5017 | WARN(!to_intel_crtc(crtc)->active, "crtc not active\n"); | 5019 | WARN(!to_intel_crtc(crtc)->active, "crtc not active\n"); |
5018 | WARN(pipe != to_intel_crtc(crtc)->pipe, | 5020 | WARN(pipe != to_intel_crtc(crtc)->pipe, |
5019 | "encoder active on the wrong pipe\n"); | 5021 | "encoder active on the wrong pipe\n"); |
5022 | } | ||
5020 | } | 5023 | } |
5021 | } | 5024 | } |
5022 | 5025 | ||