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

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

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
Loading
Loading
Loading
Loading
+9 −7
Original line number Original line Diff line number Diff line
@@ -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,
			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)
+4 −0
Original line number Original line Diff line number Diff line
@@ -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)


	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)
+14 −11
Original line number Original line Diff line number Diff line
@@ -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");


@@ -5019,6 +5021,7 @@ static void intel_connector_check_state(struct intel_connector *connector)
			     "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
 * consider. */
 * consider. */