From 8469b7be9ebee552aa27c0d6972eea0ff0683c6c Mon Sep 17 00:00:00 2001 From: Steve Cohen Date: Mon, 25 Nov 2019 18:27:18 -0500 Subject: [PATCH] disp: msm: use iterator APIs to walk the connector list Use the DRM APIs for walking the list of connectors. This ensures the proper locks are taken to prevent possible corruption by other threads. Change-Id: Iacdd1c6ad8eab224ceac550e0229489851a09706 Signed-off-by: Steve Cohen --- msm/dsi/dsi_display.c | 22 +++++++++++++--------- msm/sde/sde_encoder.c | 18 +++++++++++------- msm/sde/sde_rm.c | 20 ++++++++++++-------- 3 files changed, 36 insertions(+), 24 deletions(-) diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index e9162e235485..91675c835ec9 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. */ #include @@ -5463,10 +5463,11 @@ static struct dsi_display_ext_bridge *dsi_display_ext_get_bridge( { struct msm_drm_private *priv; struct sde_kms *sde_kms; - struct list_head *connector_list; - struct drm_connector *conn_iter; + struct drm_connector *conn; + struct drm_connector_list_iter conn_iter; struct sde_connector *sde_conn; struct dsi_display *display; + struct dsi_display_ext_bridge *dsi_bridge = NULL; int i; if (!bridge || !bridge->encoder) { @@ -5476,20 +5477,23 @@ static struct dsi_display_ext_bridge *dsi_display_ext_get_bridge( priv = bridge->dev->dev_private; sde_kms = to_sde_kms(priv->kms); - connector_list = &sde_kms->dev->mode_config.connector_list; - list_for_each_entry(conn_iter, connector_list, head) { - sde_conn = to_sde_connector(conn_iter); + drm_connector_list_iter_begin(sde_kms->dev, &conn_iter); + drm_for_each_connector_iter(conn, &conn_iter) { + sde_conn = to_sde_connector(conn); if (sde_conn->encoder == bridge->encoder) { display = sde_conn->display; display_for_each_ctrl(i, display) { - if (display->ext_bridge[i].bridge == bridge) - return &display->ext_bridge[i]; + if (display->ext_bridge[i].bridge == bridge) { + dsi_bridge = &display->ext_bridge[i]; + break; + } } } } + drm_connector_list_iter_end(&conn_iter); - return NULL; + return dsi_bridge; } static void dsi_display_drm_ext_adjust_timing( diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index f10540db02a0..136717e63c4c 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2020, The Linux Foundation. All rights reserved. * Copyright (C) 2013 Red Hat * Author: Rob Clark * @@ -2768,8 +2768,8 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc, struct sde_encoder_virt *sde_enc; struct msm_drm_private *priv; struct sde_kms *sde_kms; - struct list_head *connector_list; - struct drm_connector *conn = NULL, *conn_iter; + struct drm_connector_list_iter conn_iter; + struct drm_connector *conn = NULL, *conn_search; struct sde_rm_hw_iter dsc_iter, pp_iter, qdss_iter; struct sde_rm_hw_request request_hw; enum sde_intf_mode intf_mode; @@ -2794,7 +2794,6 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc, priv = drm_enc->dev->dev_private; sde_kms = to_sde_kms(priv->kms); - connector_list = &sde_kms->dev->mode_config.connector_list; SDE_EVT32(DRMID(drm_enc)); @@ -2808,9 +2807,14 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc, } sde_enc->crtc = drm_enc->crtc; - list_for_each_entry(conn_iter, connector_list, head) - if (conn_iter->encoder == drm_enc) - conn = conn_iter; + drm_connector_list_iter_begin(sde_kms->dev, &conn_iter); + drm_for_each_connector_iter(conn_search, &conn_iter) { + if (conn_search->encoder == drm_enc) { + conn = conn_search; + break; + } + } + drm_connector_list_iter_end(&conn_iter); if (!conn) { SDE_ERROR_ENC(sde_enc, "failed to find attached connector\n"); diff --git a/msm/sde/sde_rm.c b/msm/sde/sde_rm.c index c08f723b9b14..29653a6509c5 100644 --- a/msm/sde/sde_rm.c +++ b/msm/sde/sde_rm.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. */ #define pr_fmt(fmt) "[drm:%s] " fmt, __func__ @@ -1862,15 +1862,19 @@ static struct sde_rm_rsvp *_sde_rm_get_rsvp_nxt( static struct drm_connector *_sde_rm_get_connector( struct drm_encoder *enc) { - struct drm_connector *conn = NULL; - struct list_head *connector_list = - &enc->dev->mode_config.connector_list; + struct drm_connector *conn = NULL, *conn_search; + struct drm_connector_list_iter conn_iter; - list_for_each_entry(conn, connector_list, head) - if (conn->encoder == enc) - return conn; + drm_connector_list_iter_begin(enc->dev, &conn_iter); + drm_for_each_connector_iter(conn_search, &conn_iter) { + if (conn_search->encoder == enc) { + conn = conn_search; + break; + } + } + drm_connector_list_iter_end(&conn_iter); - return NULL; + return conn; } int sde_rm_update_topology(struct drm_connector_state *conn_state,