linux-arm-msm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sean Paul <seanpaul@chromium.org>
To: abhinavk@codeaurora.org, architt@codeaurora.org,
	chandanu@codeaurora.org, jsanka@codeaurora.org,
	jcrouse@codeaurora.org, ryadav@codeaurora.org,
	seanpaul@chromium.org, skolluku@codeaurora.org,
	dri-devel@lists.freedesktop.org, robdclark@gmail.com,
	airlied@linux.ie, freedreno@lists.freedesktop.org,
	linux-arm-msm@vger.kernel.org, nganji@codeaurora.org,
	hoegsberg@chromium.org, dovizu@chromium.org, robh+dt@kernel.org
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>,
	Lloyd Atkinson <latkinso@codeaurora.org>,
	"Gustavo A. R. Silva" <garsilva@embeddedor.com>,
	Neil Armstrong <narmstrong@baylibre.com>
Subject: [PATCH 06/21] drm/msm/dsi: Use one connector for dual DSI mode
Date: Mon,  9 Jul 2018 13:31:42 -0400	[thread overview]
Message-ID: <20180709173200.238457-7-seanpaul@chromium.org> (raw)
In-Reply-To: <20180709173200.238457-1-seanpaul@chromium.org>

From: Chandan Uddaraju <chandanu@codeaurora.org>

Current DSI driver uses two connectors for dual DSI case even
though we only have one panel. Fix this by implementing one
connector/bridge for dual DSI use case. Use master DSI
controllers to register one connector/bridge.

Changes in V2:
    -Removed Change-Id from the commit text tags.
    -Remove extra parentheses

Changes in V3:
    -None

Reviewed-by: Archit Taneja <architt@codeaurora.org>
Signed-off-by: Chandan Uddaraju <chandanu@codeaurora.org>
[seanpaul removed unused local var causing a build warning]
Signed-off-by: Sean Paul <seanpaul@chromium.org>
---
 drivers/gpu/drm/msm/dsi/dsi.c         |   3 +
 drivers/gpu/drm/msm/dsi/dsi.h         |   1 +
 drivers/gpu/drm/msm/dsi/dsi_manager.c | 112 ++++++--------------------
 3 files changed, 30 insertions(+), 86 deletions(-)

diff --git a/drivers/gpu/drm/msm/dsi/dsi.c b/drivers/gpu/drm/msm/dsi/dsi.c
index b744bcc7d8ad..ff8164cc6738 100644
--- a/drivers/gpu/drm/msm/dsi/dsi.c
+++ b/drivers/gpu/drm/msm/dsi/dsi.c
@@ -208,6 +208,9 @@ int msm_dsi_modeset_init(struct msm_dsi *msm_dsi, struct drm_device *dev,
 		goto fail;
 	}
 
+	if (!msm_dsi_manager_validate_current_config(msm_dsi->id))
+		goto fail;
+
 	msm_dsi->encoder = encoder;
 
 	msm_dsi->bridge = msm_dsi_manager_bridge_init(msm_dsi->id);
diff --git a/drivers/gpu/drm/msm/dsi/dsi.h b/drivers/gpu/drm/msm/dsi/dsi.h
index 01c38f67d699..c858e8e1a5bd 100644
--- a/drivers/gpu/drm/msm/dsi/dsi.h
+++ b/drivers/gpu/drm/msm/dsi/dsi.h
@@ -100,6 +100,7 @@ bool msm_dsi_manager_cmd_xfer_trigger(int id, u32 dma_base, u32 len);
 void msm_dsi_manager_attach_dsi_device(int id, u32 device_flags);
 int msm_dsi_manager_register(struct msm_dsi *msm_dsi);
 void msm_dsi_manager_unregister(struct msm_dsi *msm_dsi);
+bool msm_dsi_manager_validate_current_config(u8 id);
 
 /* msm dsi */
 static inline bool msm_dsi_device_connected(struct msm_dsi *msm_dsi)
diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c
index 3bb506b44a4b..000721fe5ab4 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_manager.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c
@@ -306,102 +306,25 @@ static void dsi_mgr_connector_destroy(struct drm_connector *connector)
 	kfree(dsi_connector);
 }
 
-static void dsi_dual_connector_fix_modes(struct drm_connector *connector)
-{
-	struct drm_display_mode *mode, *m;
-
-	/* Only support left-right mode */
-	list_for_each_entry_safe(mode, m, &connector->probed_modes, head) {
-		mode->clock >>= 1;
-		mode->hdisplay >>= 1;
-		mode->hsync_start >>= 1;
-		mode->hsync_end >>= 1;
-		mode->htotal >>= 1;
-		drm_mode_set_name(mode);
-	}
-}
-
-static int dsi_dual_connector_tile_init(
-			struct drm_connector *connector, int id)
-{
-	struct drm_display_mode *mode;
-	/* Fake topology id */
-	char topo_id[8] = {'M', 'S', 'M', 'D', 'U', 'D', 'S', 'I'};
-
-	if (connector->tile_group) {
-		DBG("Tile property has been initialized");
-		return 0;
-	}
-
-	/* Use the first mode only for now */
-	mode = list_first_entry(&connector->probed_modes,
-				struct drm_display_mode,
-				head);
-	if (!mode)
-		return -EINVAL;
-
-	connector->tile_group = drm_mode_get_tile_group(
-					connector->dev, topo_id);
-	if (!connector->tile_group)
-		connector->tile_group = drm_mode_create_tile_group(
-					connector->dev, topo_id);
-	if (!connector->tile_group) {
-		pr_err("%s: failed to create tile group\n", __func__);
-		return -ENOMEM;
-	}
-
-	connector->has_tile = true;
-	connector->tile_is_single_monitor = true;
-
-	/* mode has been fixed */
-	connector->tile_h_size = mode->hdisplay;
-	connector->tile_v_size = mode->vdisplay;
-
-	/* Only support left-right mode */
-	connector->num_h_tile = 2;
-	connector->num_v_tile = 1;
-
-	connector->tile_v_loc = 0;
-	connector->tile_h_loc = (id == DSI_RIGHT) ? 1 : 0;
-
-	return 0;
-}
-
 static int dsi_mgr_connector_get_modes(struct drm_connector *connector)
 {
 	int id = dsi_mgr_connector_get_id(connector);
 	struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id);
 	struct drm_panel *panel = msm_dsi->panel;
-	int ret, num;
+	int num;
 
 	if (!panel)
 		return 0;
 
-	/* Since we have 2 connectors, but only 1 drm_panel in dual DSI mode,
-	 * panel should not attach to any connector.
-	 * Only temporarily attach panel to the current connector here,
-	 * to let panel set mode to this connector.
+	/*
+	 * In dual DSI mode, we have one connector that can be
+	 * attached to the drm_panel.
 	 */
 	drm_panel_attach(panel, connector);
 	num = drm_panel_get_modes(panel);
-	drm_panel_detach(panel);
 	if (!num)
 		return 0;
 
-	if (IS_DUAL_DSI()) {
-		/* report half resolution to user */
-		dsi_dual_connector_fix_modes(connector);
-		ret = dsi_dual_connector_tile_init(connector, id);
-		if (ret)
-			return ret;
-		ret = drm_mode_connector_set_tile_property(connector);
-		if (ret) {
-			pr_err("%s: set tile property failed, %d\n",
-					__func__, ret);
-			return ret;
-		}
-	}
-
 	return num;
 }
 
@@ -455,8 +378,8 @@ static void dsi_mgr_bridge_pre_enable(struct drm_bridge *bridge)
 	if (ret)
 		goto phy_en_fail;
 
-	/* Do nothing with the host if it is DSI 1 in case of dual DSI */
-	if (is_dual_dsi && (DSI_1 == id))
+	/* Do nothing with the host if it is slave-DSI in case of dual DSI */
+	if (is_dual_dsi && !IS_MASTER_DSI_LINK(id))
 		return;
 
 	ret = msm_dsi_host_power_on(host, &phy_shared_timings[id], is_dual_dsi);
@@ -557,11 +480,11 @@ static void dsi_mgr_bridge_post_disable(struct drm_bridge *bridge)
 		return;
 
 	/*
-	 * Do nothing with the host if it is DSI 1 in case of dual DSI.
+	 * Do nothing with the host if it is slave-DSI in case of dual DSI.
 	 * It is safe to call dsi_mgr_phy_disable() here because a single PHY
 	 * won't be diabled until both PHYs request disable.
 	 */
-	if (is_dual_dsi && (DSI_1 == id))
+	if (is_dual_dsi && !IS_MASTER_DSI_LINK(id))
 		goto disable_phy;
 
 	if (panel) {
@@ -622,7 +545,7 @@ static void dsi_mgr_bridge_mode_set(struct drm_bridge *bridge,
 			mode->vsync_end, mode->vtotal,
 			mode->type, mode->flags);
 
-	if (is_dual_dsi && (DSI_1 == id))
+	if (is_dual_dsi && !IS_MASTER_DSI_LINK(id))
 		return;
 
 	msm_dsi_host_set_display_mode(host, adjusted_mode);
@@ -690,6 +613,23 @@ struct drm_connector *msm_dsi_manager_connector_init(u8 id)
 	return connector;
 }
 
+bool msm_dsi_manager_validate_current_config(u8 id)
+{
+	bool is_dual_dsi = IS_DUAL_DSI();
+
+	/*
+	 * For dual DSI, we only have one drm panel. For this
+	 * use case, we register only one bridge/connector.
+	 * Skip bridge/connector initialisation if it is
+	 * slave-DSI for dual DSI configuration.
+	 */
+	if (is_dual_dsi && !IS_MASTER_DSI_LINK(id)) {
+		DBG("Skip bridge registration for slave DSI->id: %d\n", id);
+		return false;
+	}
+	return true;
+}
+
 /* initialize bridge */
 struct drm_bridge *msm_dsi_manager_bridge_init(u8 id)
 {
-- 
Sean Paul, Software Engineer, Google / Chromium OS

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  parent reply	other threads:[~2018-07-09 17:31 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-09 17:31 [PATCH 00/21] drm/msm: Add support for SDM845 Display Processing Unit (DPU) Sean Paul
2018-07-09 17:31 ` [PATCH 01/21] dt-bindings: msm/dsi: Add mdp transfer time to msm dsi binding Sean Paul
     [not found]   ` <20180709173200.238457-2-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-07-20 14:13     ` Rob Herring
2018-07-09 17:31 ` [PATCH 05/21] drm/msm/dsi: adjust dsi timing for dual dsi mode Sean Paul
     [not found]   ` <20180709173200.238457-6-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-07-16 14:17     ` Archit Taneja
2018-07-09 17:31 ` Sean Paul [this message]
2018-07-09 17:31 ` [PATCH 17/21] drm/msm: Add preclose kms hook Sean Paul
2018-07-09 17:31 ` [PATCH 19/21] dt-bindings: msm/disp: Add bindings for Snapdragon 845 DPU Sean Paul
     [not found]   ` <20180709173200.238457-20-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-07-12 21:08     ` [PATCH v2 " Sean Paul
     [not found]       ` <20180712210849.146638-1-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-07-16 16:21         ` Rob Herring
     [not found] ` <20180709173200.238457-1-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-07-09 17:31   ` [PATCH 02/21] dt-bindings: clock: Introduce QCOM Display clock bindings Sean Paul
2018-07-09 17:31   ` [PATCH 03/21] drm: Add support for pps and compression mode command packet Sean Paul
2018-07-09 17:31   ` [PATCH 04/21] drm: add msm compressed format modifiers Sean Paul
     [not found]     ` <20180709173200.238457-5-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-07-16 12:28       ` Rob Clark
2018-07-09 17:31   ` [PATCH 07/21] drm/msm/dsi: initialize postdiv_lock before use for 10nm pll Sean Paul
     [not found]     ` <20180709173200.238457-8-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-07-16 14:28       ` Archit Taneja
2018-07-09 17:31   ` [PATCH 08/21] drm/msm: Move wait_for_vblanks into mdp complete_commit() hooks Sean Paul
2018-07-09 17:31   ` [PATCH 09/21] drm/msm/mdp5: subclass msm_mdss for mdp5 Sean Paul
     [not found]     ` <20180709173200.238457-10-seanpaul-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2018-07-16 14:40       ` Archit Taneja
2018-07-09 17:31   ` [PATCH 10/21] drm/msm: enable zpos normalization Sean Paul
2018-07-09 17:31   ` [PATCH 11/21] drm/msm: higher values of pclk can exceed 32 bits when multiplied by a factor Sean Paul
2018-07-16 14:46     ` Archit Taneja
2018-07-09 17:31   ` [PATCH 12/21] drm/msm: Clean up dangling atomic_wq Sean Paul
2018-07-09 17:31   ` [PATCH 13/21] drm/msm: #define MDP version numbers Sean Paul
2018-07-09 17:31   ` [PATCH 14/21] drm/msm: Use labels for unwinding in the error path Sean Paul
2018-07-09 17:31   ` [PATCH 15/21] drm/msm: #define MAX_<OBJECT> in msm_drv.h Sean Paul
2018-07-09 17:31   ` [PATCH 16/21] drm/msm: Add .commit() callback to msm_kms functions Sean Paul
2018-07-09 17:31   ` [PATCH 18/21] drm/msm: Add pm_suspend/resume callbacks to msm_kms Sean Paul
2018-07-09 17:31   ` [PATCH 20/21] drm/msm: Add SDM845 DPU support Sean Paul
2018-07-09 17:31   ` [PATCH 21/21] arm64: dts: qcom: sdm845: Add dpu to sdm845 dts file Sean Paul
2018-07-09 18:07     ` Rob Herring
2018-07-09 18:35       ` Sean Paul
2018-07-09 19:03         ` Rob Clark
2018-07-12 21:13       ` [PATCH v2 " Sean Paul

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180709173200.238457-7-seanpaul@chromium.org \
    --to=seanpaul@chromium.org \
    --cc=abhinavk@codeaurora.org \
    --cc=airlied@linux.ie \
    --cc=architt@codeaurora.org \
    --cc=chandanu@codeaurora.org \
    --cc=daniel.vetter@ffwll.ch \
    --cc=dovizu@chromium.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=freedreno@lists.freedesktop.org \
    --cc=garsilva@embeddedor.com \
    --cc=hoegsberg@chromium.org \
    --cc=jcrouse@codeaurora.org \
    --cc=jsanka@codeaurora.org \
    --cc=latkinso@codeaurora.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=narmstrong@baylibre.com \
    --cc=nganji@codeaurora.org \
    --cc=robdclark@gmail.com \
    --cc=robh+dt@kernel.org \
    --cc=ryadav@codeaurora.org \
    --cc=skolluku@codeaurora.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).