aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_dp_mst.c
diff options
context:
space:
mode:
authorLyude Paul <lyude@redhat.com>2018-10-08 19:24:32 -0400
committerLyude Paul <lyude@redhat.com>2018-10-09 11:12:23 -0400
commit6ed5bb1fbad34382c8cfe9a9bf737e9a43053df5 (patch)
tree5eda3fb62da85bfe8b819789c5d6fdc6596b9df2 /drivers/gpu/drm/i915/intel_dp_mst.c
parent4d80273976bf880c4bed9359b8f2d45663140c86 (diff)
drm/i915: Don't unset intel_connector->mst_port
Currently we set intel_connector->mst_port to NULL to signify that the MST port has been removed from the system so that we can prevent further action on the port such as connector probes, mode probing, etc. However, we're going to need access to intel_connector->mst_port in order to fixup ->best_encoder() so that it can always return the correct encoder for an MST port to prevent legacy DPMS prop changes from failing. This should be safe, so instead keep intel_connector->mst_port always set and instead just check the status of drm_connector->regustered to signify whether or not the connector has disappeared from the system. Changes since v2: - Add a comment to mst_port_gone (Jani Nikula) - Change mst_port_gone to a u8 instead of a bool, per the kernel bot. Apparently bool is discouraged in structs these days Changes since v4: - Don't use mst_port_gone at all! Just check if the connector is registered or not - Daniel Vetter Signed-off-by: Lyude Paul <lyude@redhat.com> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Cc: stable@vger.kernel.org Link: https://patchwork.freedesktop.org/patch/msgid/20181008232437.5571-4-lyude@redhat.com
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp_mst.c')
-rw-r--r--drivers/gpu/drm/i915/intel_dp_mst.c17
1 files changed, 6 insertions, 11 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c
index 43db2e9ac575..aa21742d8634 100644
--- a/drivers/gpu/drm/i915/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/intel_dp_mst.c
@@ -307,9 +307,8 @@ static int intel_dp_mst_get_ddc_modes(struct drm_connector *connector)
307 struct edid *edid; 307 struct edid *edid;
308 int ret; 308 int ret;
309 309
310 if (!intel_dp) { 310 if (!READ_ONCE(connector->registered))
311 return intel_connector_update_modes(connector, NULL); 311 return intel_connector_update_modes(connector, NULL);
312 }
313 312
314 edid = drm_dp_mst_get_edid(connector, &intel_dp->mst_mgr, intel_connector->port); 313 edid = drm_dp_mst_get_edid(connector, &intel_dp->mst_mgr, intel_connector->port);
315 ret = intel_connector_update_modes(connector, edid); 314 ret = intel_connector_update_modes(connector, edid);
@@ -324,9 +323,10 @@ intel_dp_mst_detect(struct drm_connector *connector, bool force)
324 struct intel_connector *intel_connector = to_intel_connector(connector); 323 struct intel_connector *intel_connector = to_intel_connector(connector);
325 struct intel_dp *intel_dp = intel_connector->mst_port; 324 struct intel_dp *intel_dp = intel_connector->mst_port;
326 325
327 if (!intel_dp) 326 if (!READ_ONCE(connector->registered))
328 return connector_status_disconnected; 327 return connector_status_disconnected;
329 return drm_dp_mst_detect_port(connector, &intel_dp->mst_mgr, intel_connector->port); 328 return drm_dp_mst_detect_port(connector, &intel_dp->mst_mgr,
329 intel_connector->port);
330} 330}
331 331
332static void 332static void
@@ -366,7 +366,7 @@ intel_dp_mst_mode_valid(struct drm_connector *connector,
366 int bpp = 24; /* MST uses fixed bpp */ 366 int bpp = 24; /* MST uses fixed bpp */
367 int max_rate, mode_rate, max_lanes, max_link_clock; 367 int max_rate, mode_rate, max_lanes, max_link_clock;
368 368
369 if (!intel_dp) 369 if (!READ_ONCE(connector->registered))
370 return MODE_ERROR; 370 return MODE_ERROR;
371 371
372 if (mode->flags & DRM_MODE_FLAG_DBLSCAN) 372 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
@@ -398,7 +398,7 @@ static struct drm_encoder *intel_mst_atomic_best_encoder(struct drm_connector *c
398 struct intel_dp *intel_dp = intel_connector->mst_port; 398 struct intel_dp *intel_dp = intel_connector->mst_port;
399 struct intel_crtc *crtc = to_intel_crtc(state->crtc); 399 struct intel_crtc *crtc = to_intel_crtc(state->crtc);
400 400
401 if (!intel_dp) 401 if (!READ_ONCE(connector->registered))
402 return NULL; 402 return NULL;
403 return &intel_dp->mst_encoders[crtc->pipe]->base.base; 403 return &intel_dp->mst_encoders[crtc->pipe]->base.base;
404} 404}
@@ -499,7 +499,6 @@ static void intel_dp_register_mst_connector(struct drm_connector *connector)
499static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr, 499static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
500 struct drm_connector *connector) 500 struct drm_connector *connector)
501{ 501{
502 struct intel_connector *intel_connector = to_intel_connector(connector);
503 struct drm_i915_private *dev_priv = to_i915(connector->dev); 502 struct drm_i915_private *dev_priv = to_i915(connector->dev);
504 503
505 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", connector->base.id, connector->name); 504 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", connector->base.id, connector->name);
@@ -508,10 +507,6 @@ static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
508 if (dev_priv->fbdev) 507 if (dev_priv->fbdev)
509 drm_fb_helper_remove_one_connector(&dev_priv->fbdev->helper, 508 drm_fb_helper_remove_one_connector(&dev_priv->fbdev->helper,
510 connector); 509 connector);
511 /* prevent race with the check in ->detect */
512 drm_modeset_lock(&connector->dev->mode_config.connection_mutex, NULL);
513 intel_connector->mst_port = NULL;
514 drm_modeset_unlock(&connector->dev->mode_config.connection_mutex);
515 510
516 drm_connector_put(connector); 511 drm_connector_put(connector);
517} 512}