Skip to content

Commit 0e6613e

Browse files
Jerry (Fangzhi) Zuoalexdeucher
authored andcommitted
drm/amd/display: Drop reusing drm connector for MST
[why] It is not safe to keep existing connector while entire topology has been removed. Could lead potential impact to uapi. Entirely unregister all the connectors on the topology, and use a new set of connectors when the topology is plugged back on. [How] Remove the drm connector entirely each time when the corresponding MST topology is gone. When hotunplug a connector (e.g., DP2) 1. Remove connector from userspace. 2. Drop it's reference. When hotplug back on: 1. Detect new topology, and create new connectors. 2. Notify userspace with sysfs hotplug event. 3. Reprobe new connectors, and reassign CRTC from old (e.g., DP2) to new (e.g., DP3) connector. Signed-off-by: Jerry (Fangzhi) Zuo <Jerry.Zuo@amd.com> Reviewed-by: Harry Wentland <harry.wentland@amd.com> Reviewed-by: Lyude Paul <lyude@redhat.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 8be17ac commit 0e6613e

File tree

2 files changed

+7
-35
lines changed

2 files changed

+7
-35
lines changed

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,6 @@ struct amdgpu_dm_connector {
160160
struct mutex hpd_lock;
161161

162162
bool fake_enable;
163-
164-
bool mst_connected;
165163
};
166164

167165
#define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base)

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c

Lines changed: 7 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -320,25 +320,6 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
320320
struct amdgpu_device *adev = dev->dev_private;
321321
struct amdgpu_dm_connector *aconnector;
322322
struct drm_connector *connector;
323-
struct drm_connector_list_iter conn_iter;
324-
325-
drm_connector_list_iter_begin(dev, &conn_iter);
326-
drm_for_each_connector_iter(connector, &conn_iter) {
327-
aconnector = to_amdgpu_dm_connector(connector);
328-
if (aconnector->mst_port == master
329-
&& !aconnector->port) {
330-
DRM_INFO("DM_MST: reusing connector: %p [id: %d] [master: %p]\n",
331-
aconnector, connector->base.id, aconnector->mst_port);
332-
333-
aconnector->port = port;
334-
drm_connector_set_path_property(connector, pathprop);
335-
336-
drm_connector_list_iter_end(&conn_iter);
337-
aconnector->mst_connected = true;
338-
return &aconnector->base;
339-
}
340-
}
341-
drm_connector_list_iter_end(&conn_iter);
342323

343324
aconnector = kzalloc(sizeof(*aconnector), GFP_KERNEL);
344325
if (!aconnector)
@@ -387,8 +368,6 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
387368
*/
388369
amdgpu_dm_connector_funcs_reset(connector);
389370

390-
aconnector->mst_connected = true;
391-
392371
DRM_INFO("DM_MST: added connector: %p [id: %d] [master: %p]\n",
393372
aconnector, connector->base.id, aconnector->mst_port);
394373

@@ -400,6 +379,9 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
400379
static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
401380
struct drm_connector *connector)
402381
{
382+
struct amdgpu_dm_connector *master = container_of(mgr, struct amdgpu_dm_connector, mst_mgr);
383+
struct drm_device *dev = master->base.dev;
384+
struct amdgpu_device *adev = dev->dev_private;
403385
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
404386

405387
DRM_INFO("DM_MST: Disabling connector: %p [id: %d] [master: %p]\n",
@@ -413,7 +395,10 @@ static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
413395
aconnector->dc_sink = NULL;
414396
}
415397

416-
aconnector->mst_connected = false;
398+
drm_connector_unregister(connector);
399+
if (adev->mode_info.rfbdev)
400+
drm_fb_helper_remove_one_connector(&adev->mode_info.rfbdev->helper, connector);
401+
drm_connector_put(connector);
417402
}
418403

419404
static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
@@ -424,28 +409,17 @@ static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
424409
drm_kms_helper_hotplug_event(dev);
425410
}
426411

427-
static void dm_dp_mst_link_status_reset(struct drm_connector *connector)
428-
{
429-
mutex_lock(&connector->dev->mode_config.mutex);
430-
drm_connector_set_link_status_property(connector, DRM_MODE_LINK_STATUS_BAD);
431-
mutex_unlock(&connector->dev->mode_config.mutex);
432-
}
433-
434412
static void dm_dp_mst_register_connector(struct drm_connector *connector)
435413
{
436414
struct drm_device *dev = connector->dev;
437415
struct amdgpu_device *adev = dev->dev_private;
438-
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
439416

440417
if (adev->mode_info.rfbdev)
441418
drm_fb_helper_add_one_connector(&adev->mode_info.rfbdev->helper, connector);
442419
else
443420
DRM_ERROR("adev->mode_info.rfbdev is NULL\n");
444421

445422
drm_connector_register(connector);
446-
447-
if (aconnector->mst_connected)
448-
dm_dp_mst_link_status_reset(connector);
449423
}
450424

451425
static const struct drm_dp_mst_topology_cbs dm_mst_cbs = {

0 commit comments

Comments
 (0)