From: Yongqiang Sun <yongqiang.sun@xxxxxxx> Change-Id: Ic4347e0c772f074fb9efdcff42b3aa42bda1e5ad Signed-off-by: Yongqiang Sun <yongqiang.sun at amd.com> Reviewed-by: Reviewed-by: Harry Wentland <Harry.Wentland at amd.com> Acked-by: Harry Wentland <harry.wentland at amd.com> --- drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c | 12 ++++++++++++ drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c | 2 ++ 2 files changed, 14 insertions(+) diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c index 9a65b978d07a..b798b7a2231b 100644 --- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c @@ -828,6 +828,7 @@ static void handle_hpd_irq(void *param) /* In case of failure or MST no need to update connector status or notify the OS * since (for MST case) MST does this in it's own context. */ + mutex_lock(&aconnector->hpd_lock); if (dc_link_detect(aconnector->dc_link, false)) { amdgpu_dm_update_connector_after_detect(aconnector); @@ -839,6 +840,7 @@ static void handle_hpd_irq(void *param) if (aconnector->base.force == DRM_FORCE_UNSPECIFIED) drm_kms_helper_hotplug_event(dev); } + mutex_unlock(&aconnector->hpd_lock); } @@ -929,6 +931,13 @@ static void handle_hpd_rx_irq(void *param) const struct dc_link *dc_link = aconnector->dc_link; bool is_mst_root_connector = aconnector->mst_mgr.mst_state; + /* TODO:Temporary add mutex to protect hpd interrupt not have a gpio + * conflict, after implement i2c helper, this mutex should be + * retired. + */ + if (aconnector->dc_link->type != dc_connection_mst_branch) + mutex_lock(&aconnector->hpd_lock); + if (dc_link_handle_hpd_rx_irq(aconnector->dc_link) && !is_mst_root_connector) { /* Downstream Port status changed. */ @@ -946,6 +955,9 @@ static void handle_hpd_rx_irq(void *param) if ((dc_link->cur_link_settings.lane_count != LANE_COUNT_UNKNOWN) || (dc_link->type == dc_connection_mst_branch)) dm_handle_hpd_rx_irq(aconnector); + + if (aconnector->dc_link->type != dc_connection_mst_branch) + mutex_unlock(&aconnector->hpd_lock); } static void register_hpd_handlers(struct amdgpu_device *adev) diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c index fba2bd74f669..e73c658cdfec 100644 --- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c +++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c @@ -2041,6 +2041,8 @@ void amdgpu_dm_connector_init_helper( aconnector->base.dpms = DRM_MODE_DPMS_OFF; aconnector->hpd.hpd = AMDGPU_HPD_NONE; /* not used */ + mutex_init(&aconnector->hpd_lock); + /*configure suport HPD hot plug connector_>polled default value is 0 * which means HPD hot plug not supported*/ switch (connector_type) { -- 2.10.1