Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8469b7be authored by Steve Cohen's avatar Steve Cohen
Browse files

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: default avatarSteve Cohen <cohens@codeaurora.org>
parent bfbb5f63
Loading
Loading
Loading
Loading
+13 −9
Original line number Original line Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
// 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>
#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 msm_drm_private *priv;
	struct sde_kms *sde_kms;
	struct sde_kms *sde_kms;
	struct list_head *connector_list;
	struct drm_connector *conn;
	struct drm_connector *conn_iter;
	struct drm_connector_list_iter conn_iter;
	struct sde_connector *sde_conn;
	struct sde_connector *sde_conn;
	struct dsi_display *display;
	struct dsi_display *display;
	struct dsi_display_ext_bridge *dsi_bridge = NULL;
	int i;
	int i;


	if (!bridge || !bridge->encoder) {
	if (!bridge || !bridge->encoder) {
@@ -5476,20 +5477,23 @@ static struct dsi_display_ext_bridge *dsi_display_ext_get_bridge(


	priv = bridge->dev->dev_private;
	priv = bridge->dev->dev_private;
	sde_kms = to_sde_kms(priv->kms);
	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) {
	drm_connector_list_iter_begin(sde_kms->dev, &conn_iter);
		sde_conn = to_sde_connector(conn_iter);
	drm_for_each_connector_iter(conn, &conn_iter) {
		sde_conn = to_sde_connector(conn);
		if (sde_conn->encoder == bridge->encoder) {
		if (sde_conn->encoder == bridge->encoder) {
			display = sde_conn->display;
			display = sde_conn->display;
			display_for_each_ctrl(i, display) {
			display_for_each_ctrl(i, display) {
				if (display->ext_bridge[i].bridge == bridge)
				if (display->ext_bridge[i].bridge == bridge) {
					return &display->ext_bridge[i];
					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(
static void dsi_display_drm_ext_adjust_timing(
+11 −7
Original line number Original line Diff line number Diff line
/*
/*
 * 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
 * Copyright (C) 2013 Red Hat
 * Author: Rob Clark <robdclark@gmail.com>
 * 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 sde_encoder_virt *sde_enc;
	struct msm_drm_private *priv;
	struct msm_drm_private *priv;
	struct sde_kms *sde_kms;
	struct sde_kms *sde_kms;
	struct list_head *connector_list;
	struct drm_connector_list_iter conn_iter;
	struct drm_connector *conn = NULL, *conn_iter;
	struct drm_connector *conn = NULL, *conn_search;
	struct sde_rm_hw_iter dsc_iter, pp_iter, qdss_iter;
	struct sde_rm_hw_iter dsc_iter, pp_iter, qdss_iter;
	struct sde_rm_hw_request request_hw;
	struct sde_rm_hw_request request_hw;
	enum sde_intf_mode intf_mode;
	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;
	priv = drm_enc->dev->dev_private;
	sde_kms = to_sde_kms(priv->kms);
	sde_kms = to_sde_kms(priv->kms);
	connector_list = &sde_kms->dev->mode_config.connector_list;


	SDE_EVT32(DRMID(drm_enc));
	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;
	sde_enc->crtc = drm_enc->crtc;


	list_for_each_entry(conn_iter, connector_list, head)
	drm_connector_list_iter_begin(sde_kms->dev, &conn_iter);
		if (conn_iter->encoder == drm_enc)
	drm_for_each_connector_iter(conn_search, &conn_iter) {
			conn = conn_iter;
		if (conn_search->encoder == drm_enc) {
			conn = conn_search;
			break;
		}
	}
	drm_connector_list_iter_end(&conn_iter);


	if (!conn) {
	if (!conn) {
		SDE_ERROR_ENC(sde_enc, "failed to find attached connector\n");
		SDE_ERROR_ENC(sde_enc, "failed to find attached connector\n");
+12 −8
Original line number Original line Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
// 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__
#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(
static struct drm_connector *_sde_rm_get_connector(
		struct drm_encoder *enc)
		struct drm_encoder *enc)
{
{
	struct drm_connector *conn = NULL;
	struct drm_connector *conn = NULL, *conn_search;
	struct list_head *connector_list =
	struct drm_connector_list_iter conn_iter;
			&enc->dev->mode_config.connector_list;


	list_for_each_entry(conn, connector_list, head)
	drm_connector_list_iter_begin(enc->dev, &conn_iter);
		if (conn->encoder == enc)
	drm_for_each_connector_iter(conn_search, &conn_iter) {
			return conn;
		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,
int sde_rm_update_topology(struct drm_connector_state *conn_state,