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 <cohens@codeaurora.org>
This commit is contained in:
Steve Cohen 2019-11-25 18:27:18 -05:00
parent bfbb5f63e7
commit 8469b7be9e
3 changed files with 36 additions and 24 deletions

View File

@ -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 <linux/list.h>
@ -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(

View File

@ -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 <robdclark@gmail.com>
*
@ -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");

View File

@ -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,