FAILED: patch "[PATCH] drm/dp/mst: split connector registration into two parts (v2)" failed to apply to 4.2-stable tree
Subsystems (5)
[email protected]
maintainerThe patch below does not apply to the 4.2-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
d9515c5ec1a20c77d83471e634ad9bb12deb0eacMon Sep 17 00:00:00 2001
From: Dave Airlie <[email protected]>
Date: Wed, 16 Sep 2015 17:55:23 +1000
Subject: [PATCH] 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.
drivers/gpu/drm/drm_dp_mst_topology.c +5 -3
@@ -1129,7 +1129,9 @@ static void drm_dp_add_port(struct drm_dp_mst_branch *mstb, }if (port->port_num >=8 ) { port->cached_edid =drm_get_edid (port->connector, &port->aux.ddc); +drm_mode_connector_set_tile_property (port->connector); } + (*mstb->mgr->cbs->register_connector)(port->connector); } out:
@@ -2276,10 +2278,10 @@ struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_if (port->cached_edid) edid =drm_edid_duplicate (port->cached_edid); -else +else { edid =drm_get_edid (connector, &port->aux.ddc); - -drm_mode_connector_set_tile_property (connector); +drm_mode_connector_set_tile_property (connector); + }drm_dp_put_port (port);return edid; }
drivers/gpu/drm/i915/intel_dp_mst.c +8 -1
@@ -462,11 +462,17 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolodrm_object_attach_property (&connector->base, dev->mode_config.tile_property,0 );drm_mode_connector_set_path_property (connector, pathprop); +return connector; +} + +static void intel_dp_register_mst_connector (struct drm_connector *connector) +{ +struct intel_connector *intel_connector =to_intel_connector (connector); +struct drm_device *dev = connector->dev;drm_modeset_lock_all (dev);intel_connector_add_to_fbdev (intel_connector);drm_modeset_unlock_all (dev);drm_connector_register (&intel_connector->base); -return connector; } 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)static struct drm_dp_mst_topology_cbs mst_cbs = { .add_connector = intel_dp_add_mst_connector, + .register_connector = intel_dp_register_mst_connector, .destroy_connector = intel_dp_destroy_mst_connector, .hotplug = intel_dp_mst_hotplug, };
drivers/gpu/drm/radeon/radeon_dp_mst.c +9 -2
@@ -265,7 +265,6 @@ static struct drm_connector *radeon_dp_add_mst_connector(struct drm_dp_mst_topol { struct radeon_connector *master = container_of(mgr, struct radeon_connector, mst_mgr);struct drm_device *dev = master->base.dev; -struct radeon_device *rdev = dev->dev_private;struct radeon_connector *radeon_connector;struct drm_connector *connector;
@@ -286,12 +285,19 @@ static struct drm_connector *radeon_dp_add_mst_connector(struct drm_dp_mst_topoldrm_object_attach_property (&connector->base, dev->mode_config.path_property,0 );drm_mode_connector_set_path_property (connector, pathprop); +return connector; +} + +static void radeon_dp_register_mst_connector (struct drm_connector *connector) +{ +struct drm_device *dev = connector->dev; +struct radeon_device *rdev = dev->dev_private; +drm_modeset_lock_all (dev);radeon_fb_add_connector (rdev, connector);drm_modeset_unlock_all (dev);drm_connector_register (connector); -return connector; } 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)struct drm_dp_mst_topology_cbs mst_cbs = { .add_connector = radeon_dp_add_mst_connector, + .register_connector = radeon_dp_register_mst_connector, .destroy_connector = radeon_dp_destroy_mst_connector, .hotplug = radeon_dp_mst_hotplug, };
include/drm/drm_dp_mst_helper.h +1 -0
@@ -374,6 +374,7 @@ struct drm_dp_mst_topology_mgr;struct drm_dp_mst_topology_cbs {/* create a connector for a port */ struct drm_connector *(*add_connector)(struct drm_dp_mst_topology_mgr *mgr,struct drm_dp_mst_port *port,const char *path); +void (*register_connector)(struct drm_connector *connector);void (*destroy_connector)(struct drm_dp_mst_topology_mgr *mgr,struct drm_connector *connector);void (*hotplug)(struct drm_dp_mst_topology_mgr *mgr);