Skip to content

Commit d9515c5

Browse files
committed
drm/dp/mst: split connector registration into two parts (v2)
In order to cache the EDID properly for tiled displays, we need to retrieve it before we register the connector with userspace, otherwise userspace can call get resources and try and get the edid before we've even cached it. This fixes some problems when hotplugging mst monitors, with X/mutter running. As mutter seems to get 0 modes for one of the monitors in the tile. v2: fix warning in radeon handle tile setting in cached path rather than get edid path. Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Cc: stable@vger.kernel.org Signed-off-by: Dave Airlie <airlied@redhat.com>
1 parent 68d8c9f commit d9515c5

File tree

4 files changed

+23
-6
lines changed

4 files changed

+23
-6
lines changed

drivers/gpu/drm/drm_dp_mst_topology.c

+5-3
Original file line numberDiff line numberDiff line change
@@ -1129,7 +1129,9 @@ static void drm_dp_add_port(struct drm_dp_mst_branch *mstb,
11291129
}
11301130
if (port->port_num >= 8) {
11311131
port->cached_edid = drm_get_edid(port->connector, &port->aux.ddc);
1132+
drm_mode_connector_set_tile_property(port->connector);
11321133
}
1134+
(*mstb->mgr->cbs->register_connector)(port->connector);
11331135
}
11341136

11351137
out:
@@ -2276,10 +2278,10 @@ struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_
22762278

22772279
if (port->cached_edid)
22782280
edid = drm_edid_duplicate(port->cached_edid);
2279-
else
2281+
else {
22802282
edid = drm_get_edid(connector, &port->aux.ddc);
2281-
2282-
drm_mode_connector_set_tile_property(connector);
2283+
drm_mode_connector_set_tile_property(connector);
2284+
}
22832285
drm_dp_put_port(port);
22842286
return edid;
22852287
}

drivers/gpu/drm/i915/intel_dp_mst.c

+8-1
Original file line numberDiff line numberDiff line change
@@ -462,11 +462,17 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo
462462
drm_object_attach_property(&connector->base, dev->mode_config.tile_property, 0);
463463

464464
drm_mode_connector_set_path_property(connector, pathprop);
465+
return connector;
466+
}
467+
468+
static void intel_dp_register_mst_connector(struct drm_connector *connector)
469+
{
470+
struct intel_connector *intel_connector = to_intel_connector(connector);
471+
struct drm_device *dev = connector->dev;
465472
drm_modeset_lock_all(dev);
466473
intel_connector_add_to_fbdev(intel_connector);
467474
drm_modeset_unlock_all(dev);
468475
drm_connector_register(&intel_connector->base);
469-
return connector;
470476
}
471477

472478
static void intel_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
@@ -512,6 +518,7 @@ static void intel_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
512518

513519
static struct drm_dp_mst_topology_cbs mst_cbs = {
514520
.add_connector = intel_dp_add_mst_connector,
521+
.register_connector = intel_dp_register_mst_connector,
515522
.destroy_connector = intel_dp_destroy_mst_connector,
516523
.hotplug = intel_dp_mst_hotplug,
517524
};

drivers/gpu/drm/radeon/radeon_dp_mst.c

+9-2
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,6 @@ static struct drm_connector *radeon_dp_add_mst_connector(struct drm_dp_mst_topol
265265
{
266266
struct radeon_connector *master = container_of(mgr, struct radeon_connector, mst_mgr);
267267
struct drm_device *dev = master->base.dev;
268-
struct radeon_device *rdev = dev->dev_private;
269268
struct radeon_connector *radeon_connector;
270269
struct drm_connector *connector;
271270

@@ -286,12 +285,19 @@ static struct drm_connector *radeon_dp_add_mst_connector(struct drm_dp_mst_topol
286285
drm_object_attach_property(&connector->base, dev->mode_config.path_property, 0);
287286
drm_mode_connector_set_path_property(connector, pathprop);
288287

288+
return connector;
289+
}
290+
291+
static void radeon_dp_register_mst_connector(struct drm_connector *connector)
292+
{
293+
struct drm_device *dev = connector->dev;
294+
struct radeon_device *rdev = dev->dev_private;
295+
289296
drm_modeset_lock_all(dev);
290297
radeon_fb_add_connector(rdev, connector);
291298
drm_modeset_unlock_all(dev);
292299

293300
drm_connector_register(connector);
294-
return connector;
295301
}
296302

297303
static void radeon_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
@@ -324,6 +330,7 @@ static void radeon_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
324330

325331
struct drm_dp_mst_topology_cbs mst_cbs = {
326332
.add_connector = radeon_dp_add_mst_connector,
333+
.register_connector = radeon_dp_register_mst_connector,
327334
.destroy_connector = radeon_dp_destroy_mst_connector,
328335
.hotplug = radeon_dp_mst_hotplug,
329336
};

include/drm/drm_dp_mst_helper.h

+1
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,7 @@ struct drm_dp_mst_topology_mgr;
374374
struct drm_dp_mst_topology_cbs {
375375
/* create a connector for a port */
376376
struct drm_connector *(*add_connector)(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, const char *path);
377+
void (*register_connector)(struct drm_connector *connector);
377378
void (*destroy_connector)(struct drm_dp_mst_topology_mgr *mgr,
378379
struct drm_connector *connector);
379380
void (*hotplug)(struct drm_dp_mst_topology_mgr *mgr);

0 commit comments

Comments
 (0)