All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/3] Cleanup excessive DSI host controller version checks
@ 2018-03-19 19:41 Sibi S
  2018-03-19 19:41 ` [PATCH v2 1/3] drm/msm/dsi: add dsi host helper functions support Sibi S
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Sibi S @ 2018-03-19 19:41 UTC (permalink / raw)
  To: architt, robdclark, jcrouse; +Cc: linux-arm-msm, Sibi S, dri-devel

This patch series aims to create and bind dsi host controller helper
functions to functionalities that vary across DSI v2, DSI 6G 1.x and
DSI 6G v2.0+ controllers. These functionalities are currently under
excessive version checks which is now replaced with the corresponding
helper function.

V2:
  Removes command broadcast support for DSI 6G v2.0+ controllers from
  the patch series and incorporates all the suggested corrections
  

Sibi S (3):
  drm/msm/dsi: add dsi host helper functions support
  drm/msm/dsi: add implementation for helper functions
  drm/msm/dsi: replace version checks with helper functions

 drivers/gpu/drm/msm/dsi/dsi.h      |  16 ++
 drivers/gpu/drm/msm/dsi/dsi_cfg.c  |  56 +++++-
 drivers/gpu/drm/msm/dsi/dsi_cfg.h  |  12 ++
 drivers/gpu/drm/msm/dsi/dsi_host.c | 362 +++++++++++++++++++++----------------
 4 files changed, 280 insertions(+), 166 deletions(-)

-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

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

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v2 1/3] drm/msm/dsi: add dsi host helper functions support
  2018-03-19 19:41 [PATCH v2 0/3] Cleanup excessive DSI host controller version checks Sibi S
@ 2018-03-19 19:41 ` Sibi S
  2018-03-19 19:41 ` [PATCH v2 2/3] drm/msm/dsi: add implementation for helper functions Sibi S
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 7+ messages in thread
From: Sibi S @ 2018-03-19 19:41 UTC (permalink / raw)
  To: architt, robdclark, jcrouse; +Cc: linux-arm-msm, Sibi S, dri-devel

Add dsi host helper functions support for DSI v2 and DSI 6G 1.x
controllers that are under version checks

Signed-off-by: Sibi S <sibis@codeaurora.org>
---
 drivers/gpu/drm/msm/dsi/dsi.h     |  1 +
 drivers/gpu/drm/msm/dsi/dsi_cfg.h | 12 ++++++++++++
 2 files changed, 13 insertions(+)

diff --git a/drivers/gpu/drm/msm/dsi/dsi.h b/drivers/gpu/drm/msm/dsi/dsi.h
index 70d9a9a47acd..80be83e8fdec 100644
--- a/drivers/gpu/drm/msm/dsi/dsi.h
+++ b/drivers/gpu/drm/msm/dsi/dsi.h
@@ -149,6 +149,7 @@ static inline int msm_dsi_pll_set_usecase(struct msm_dsi_pll *pll,
 #endif
 
 /* dsi host */
+struct msm_dsi_host;
 int msm_dsi_host_xfer_prepare(struct mipi_dsi_host *host,
 					const struct mipi_dsi_msg *msg);
 void msm_dsi_host_xfer_restore(struct mipi_dsi_host *host,
diff --git a/drivers/gpu/drm/msm/dsi/dsi_cfg.h b/drivers/gpu/drm/msm/dsi/dsi_cfg.h
index 9cfdcf1c95d5..a795a062b779 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_cfg.h
+++ b/drivers/gpu/drm/msm/dsi/dsi_cfg.h
@@ -40,10 +40,22 @@ struct msm_dsi_config {
 	const int num_dsi;
 };
 
+struct msm_dsi_host_cfg_ops {
+	int (*link_clk_enable)(struct msm_dsi_host *msm_host);
+	void (*link_clk_disable)(struct msm_dsi_host *msm_host);
+	int (*clk_init_ver)(struct msm_dsi_host *msm_host);
+	int (*tx_buf_alloc)(struct msm_dsi_host *msm_host, int size);
+	void* (*tx_buf_get)(struct msm_dsi_host *msm_host);
+	void (*tx_buf_put)(struct msm_dsi_host *msm_host);
+	int (*dma_base_get)(struct msm_dsi_host *msm_host, uint64_t *iova);
+	int (*calc_clk_rate)(struct msm_dsi_host *msm_host);
+};
+
 struct msm_dsi_cfg_handler {
 	u32 major;
 	u32 minor;
 	const struct msm_dsi_config *cfg;
+	const struct msm_dsi_host_cfg_ops *ops;
 };
 
 const struct msm_dsi_cfg_handler *msm_dsi_cfg_get(u32 major, u32 minor);
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

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

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 2/3] drm/msm/dsi: add implementation for helper functions
  2018-03-19 19:41 [PATCH v2 0/3] Cleanup excessive DSI host controller version checks Sibi S
  2018-03-19 19:41 ` [PATCH v2 1/3] drm/msm/dsi: add dsi host helper functions support Sibi S
@ 2018-03-19 19:41 ` Sibi S
  2018-03-19 20:23   ` Jordan Crouse
  2018-03-19 19:41 ` [PATCH v2 3/3] drm/msm/dsi: replace version checks with " Sibi S
  2018-03-23 12:35 ` [PATCH v2 0/3] Cleanup excessive DSI host controller version checks Archit Taneja
  3 siblings, 1 reply; 7+ messages in thread
From: Sibi S @ 2018-03-19 19:41 UTC (permalink / raw)
  To: architt, robdclark, jcrouse; +Cc: linux-arm-msm, Sibi S, dri-devel

Add dsi host helper function implementation for DSI v2
DSI 6G 1.x and DSI 6G v2.0+ controllers

Signed-off-by: Sibi S <sibis@codeaurora.org>
---
 drivers/gpu/drm/msm/dsi/dsi.h      |  15 +++
 drivers/gpu/drm/msm/dsi/dsi_cfg.c  |  56 +++++++--
 drivers/gpu/drm/msm/dsi/dsi_host.c | 236 ++++++++++++++++++++++++++++++++++++-
 3 files changed, 296 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/msm/dsi/dsi.h b/drivers/gpu/drm/msm/dsi/dsi.h
index 80be83e8fdec..dfa049d876bd 100644
--- a/drivers/gpu/drm/msm/dsi/dsi.h
+++ b/drivers/gpu/drm/msm/dsi/dsi.h
@@ -183,6 +183,21 @@ int msm_dsi_host_modeset_init(struct mipi_dsi_host *host,
 int msm_dsi_host_init(struct msm_dsi *msm_dsi);
 int msm_dsi_runtime_suspend(struct device *dev);
 int msm_dsi_runtime_resume(struct device *dev);
+int dsi_link_clk_enable_6g(struct msm_dsi_host *msm_host);
+int dsi_link_clk_enable_v2(struct msm_dsi_host *msm_host);
+void dsi_link_clk_disable_6g(struct msm_dsi_host *msm_host);
+void dsi_link_clk_disable_v2(struct msm_dsi_host *msm_host);
+int dsi_tx_buf_alloc_6g(struct msm_dsi_host *msm_host, int size);
+int dsi_tx_buf_alloc_v2(struct msm_dsi_host *msm_host, int size);
+void *dsi_tx_buf_get_6g(struct msm_dsi_host *msm_host);
+void *dsi_tx_buf_get_v2(struct msm_dsi_host *msm_host);
+void dsi_tx_buf_put_6g(struct msm_dsi_host *msm_host);
+int dsi_dma_base_get_6g(struct msm_dsi_host *msm_host, uint64_t *iova);
+int dsi_dma_base_get_v2(struct msm_dsi_host *msm_host, uint64_t *iova);
+int dsi_clk_init_v2(struct msm_dsi_host *msm_host);
+int dsi_clk_init_6g_v2(struct msm_dsi_host *msm_host);
+int dsi_calc_clk_rate_v2(struct msm_dsi_host *msm_host);
+int dsi_calc_clk_rate_6g(struct msm_dsi_host *msm_host);
 
 /* dsi phy */
 struct msm_dsi_phy;
diff --git a/drivers/gpu/drm/msm/dsi/dsi_cfg.c b/drivers/gpu/drm/msm/dsi/dsi_cfg.c
index 0327bb54b01b..dcdfb1bb54f9 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_cfg.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_cfg.c
@@ -136,20 +136,58 @@ static const struct msm_dsi_config sdm845_dsi_cfg = {
 	.num_dsi = 2,
 };
 
+const static struct msm_dsi_host_cfg_ops msm_dsi_v2_host_ops = {
+	.link_clk_enable = dsi_link_clk_enable_v2,
+	.link_clk_disable = dsi_link_clk_disable_v2,
+	.clk_init_ver = dsi_clk_init_v2,
+	.tx_buf_alloc = dsi_tx_buf_alloc_v2,
+	.tx_buf_get = dsi_tx_buf_get_v2,
+	.tx_buf_put = NULL,
+	.dma_base_get = dsi_dma_base_get_v2,
+	.calc_clk_rate = dsi_calc_clk_rate_v2,
+};
+
+const static struct msm_dsi_host_cfg_ops msm_dsi_6g_host_ops = {
+	.link_clk_enable = dsi_link_clk_enable_6g,
+	.link_clk_disable = dsi_link_clk_disable_6g,
+	.clk_init_ver = NULL,
+	.tx_buf_alloc = dsi_tx_buf_alloc_6g,
+	.tx_buf_get = dsi_tx_buf_get_6g,
+	.tx_buf_put = dsi_tx_buf_put_6g,
+	.dma_base_get = dsi_dma_base_get_6g,
+	.calc_clk_rate = dsi_calc_clk_rate_6g,
+};
+
+const static struct msm_dsi_host_cfg_ops msm_dsi_6g_v2_host_ops = {
+	.link_clk_enable = dsi_link_clk_enable_6g,
+	.link_clk_disable = dsi_link_clk_disable_6g,
+	.clk_init_ver = dsi_clk_init_6g_v2,
+	.tx_buf_alloc = dsi_tx_buf_alloc_6g,
+	.tx_buf_get = dsi_tx_buf_get_6g,
+	.tx_buf_put = dsi_tx_buf_put_6g,
+	.dma_base_get = dsi_dma_base_get_6g,
+	.calc_clk_rate = dsi_calc_clk_rate_6g,
+};
+
 static const struct msm_dsi_cfg_handler dsi_cfg_handlers[] = {
-	{MSM_DSI_VER_MAJOR_V2, MSM_DSI_V2_VER_MINOR_8064, &apq8064_dsi_cfg},
+	{MSM_DSI_VER_MAJOR_V2, MSM_DSI_V2_VER_MINOR_8064,
+		&apq8064_dsi_cfg, &msm_dsi_v2_host_ops},
 	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_0,
-						&msm8974_apq8084_dsi_cfg},
+		&msm8974_apq8084_dsi_cfg, &msm_dsi_6g_host_ops},
 	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_1,
-						&msm8974_apq8084_dsi_cfg},
+		&msm8974_apq8084_dsi_cfg, &msm_dsi_6g_host_ops},
 	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_1_1,
-						&msm8974_apq8084_dsi_cfg},
+		&msm8974_apq8084_dsi_cfg, &msm_dsi_6g_host_ops},
 	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_2,
-						&msm8974_apq8084_dsi_cfg},
-	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_3, &msm8994_dsi_cfg},
-	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_3_1, &msm8916_dsi_cfg},
-	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_4_1, &msm8996_dsi_cfg},
-	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_2_1, &sdm845_dsi_cfg},
+		&msm8974_apq8084_dsi_cfg, &msm_dsi_6g_host_ops},
+	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_3,
+		&msm8994_dsi_cfg, &msm_dsi_6g_host_ops},
+	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_3_1,
+		&msm8916_dsi_cfg, &msm_dsi_6g_host_ops},
+	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_4_1,
+		&msm8996_dsi_cfg, &msm_dsi_6g_host_ops},
+	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_2_1,
+		&sdm845_dsi_cfg, &msm_dsi_6g_v2_host_ops},
 };
 
 const struct msm_dsi_cfg_handler *msm_dsi_cfg_get(u32 major, u32 minor)
diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c
index 7a03a9489708..78ea4540f0ee 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_host.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_host.c
@@ -331,6 +331,54 @@ static int dsi_regulator_init(struct msm_dsi_host *msm_host)
 	return 0;
 }
 
+int dsi_clk_init_v2(struct msm_dsi_host *msm_host)
+{
+	struct platform_device *pdev = msm_host->pdev;
+	int ret = 0;
+
+	msm_host->src_clk = msm_clk_get(pdev, "src");
+
+	if (IS_ERR(msm_host->src_clk)) {
+		ret = PTR_ERR(msm_host->src_clk);
+		pr_err("%s: can't find src clock. ret=%d\n",
+			__func__, ret);
+		msm_host->src_clk = NULL;
+		return ret;
+	}
+
+	msm_host->esc_clk_src = clk_get_parent(msm_host->esc_clk);
+	if (!msm_host->esc_clk_src) {
+		ret = -ENODEV;
+		pr_err("%s: can't get esc clock parent. ret=%d\n",
+			__func__, ret);
+		return ret;
+	}
+
+	msm_host->dsi_clk_src = clk_get_parent(msm_host->src_clk);
+	if (!msm_host->dsi_clk_src) {
+		ret = -ENODEV;
+		pr_err("%s: can't get src clock parent. ret=%d\n",
+			__func__, ret);
+	}
+
+	return ret;
+}
+
+int dsi_clk_init_6g_v2(struct msm_dsi_host *msm_host)
+{
+	struct platform_device *pdev = msm_host->pdev;
+	int ret = 0;
+
+	msm_host->byte_intf_clk = msm_clk_get(pdev, "byte_intf");
+	if (IS_ERR(msm_host->byte_intf_clk)) {
+		ret = PTR_ERR(msm_host->byte_intf_clk);
+		pr_err("%s: can't find byte_intf clock. ret=%d\n",
+			__func__, ret);
+	}
+
+	return ret;
+}
+
 static int dsi_clk_init(struct msm_dsi_host *msm_host)
 {
 	struct platform_device *pdev = msm_host->pdev;
@@ -497,7 +545,7 @@ int msm_dsi_runtime_resume(struct device *dev)
 	return dsi_bus_clk_enable(msm_host);
 }
 
-static int dsi_link_clk_enable_6g(struct msm_dsi_host *msm_host)
+int dsi_link_clk_enable_6g(struct msm_dsi_host *msm_host)
 {
 	int ret;
 
@@ -565,7 +613,7 @@ static int dsi_link_clk_enable_6g(struct msm_dsi_host *msm_host)
 	return ret;
 }
 
-static int dsi_link_clk_enable_v2(struct msm_dsi_host *msm_host)
+int dsi_link_clk_enable_v2(struct msm_dsi_host *msm_host)
 {
 	int ret;
 
@@ -643,6 +691,23 @@ static int dsi_link_clk_enable(struct msm_dsi_host *msm_host)
 		return dsi_link_clk_enable_v2(msm_host);
 }
 
+void dsi_link_clk_disable_6g(struct msm_dsi_host *msm_host)
+{
+	clk_disable_unprepare(msm_host->esc_clk);
+	clk_disable_unprepare(msm_host->pixel_clk);
+	if (msm_host->byte_intf_clk)
+		clk_disable_unprepare(msm_host->byte_intf_clk);
+	clk_disable_unprepare(msm_host->byte_clk);
+}
+
+void dsi_link_clk_disable_v2(struct msm_dsi_host *msm_host)
+{
+	clk_disable_unprepare(msm_host->pixel_clk);
+	clk_disable_unprepare(msm_host->src_clk);
+	clk_disable_unprepare(msm_host->esc_clk);
+	clk_disable_unprepare(msm_host->byte_clk);
+}
+
 static void dsi_link_clk_disable(struct msm_dsi_host *msm_host)
 {
 	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
@@ -661,6 +726,94 @@ static void dsi_link_clk_disable(struct msm_dsi_host *msm_host)
 	}
 }
 
+int dsi_calc_clk_rate_6g(struct msm_dsi_host *msm_host)
+{
+	struct drm_display_mode *mode = msm_host->mode;
+	u8 lanes = msm_host->lanes;
+	u32 bpp = dsi_get_bpp(msm_host->format);
+	u32 pclk_rate;
+
+	if (!mode) {
+		pr_err("%s: mode not set\n", __func__);
+		return -EINVAL;
+	}
+
+	pclk_rate = mode->clock * 1000;
+	if (lanes > 0) {
+		msm_host->byte_clk_rate = (pclk_rate * bpp) / (8 * lanes);
+	} else {
+		pr_err("%s: forcing mdss_dsi lanes to 1\n", __func__);
+		msm_host->byte_clk_rate = (pclk_rate * bpp) / 8;
+	}
+
+	DBG("pclk=%d, bclk=%d", pclk_rate, msm_host->byte_clk_rate);
+
+	msm_host->esc_clk_rate = clk_get_rate(msm_host->esc_clk);
+
+	return 0;
+}
+
+int dsi_calc_clk_rate_v2(struct msm_dsi_host *msm_host)
+{
+	struct drm_display_mode *mode = msm_host->mode;
+	u8 lanes = msm_host->lanes;
+	u32 bpp = dsi_get_bpp(msm_host->format);
+	u32 pclk_rate;
+	unsigned int esc_mhz, esc_div;
+	unsigned long byte_mhz;
+
+	if (!mode) {
+		pr_err("%s: mode not set\n", __func__);
+		return -EINVAL;
+	}
+
+	pclk_rate = mode->clock * 1000;
+	if (lanes > 0) {
+		msm_host->byte_clk_rate = (pclk_rate * bpp) / (8 * lanes);
+	} else {
+		pr_err("%s: forcing mdss_dsi lanes to 1\n", __func__);
+		msm_host->byte_clk_rate = (pclk_rate * bpp) / 8;
+	}
+
+	DBG("pclk=%d, bclk=%d", pclk_rate, msm_host->byte_clk_rate);
+
+	msm_host->src_clk_rate = (pclk_rate * bpp) / 8;
+
+	/*
+	 * esc clock is byte clock followed by a 4 bit divider,
+	 * we need to find an escape clock frequency within the
+	 * mipi DSI spec range within the maximum divider limit
+	 * We iterate here between an escape clock frequencey
+	 * between 20 Mhz to 5 Mhz and pick up the first one
+	 * that can be supported by our divider
+	 */
+
+	byte_mhz = msm_host->byte_clk_rate / 1000000;
+
+	for (esc_mhz = 20; esc_mhz >= 5; esc_mhz--) {
+		esc_div = DIV_ROUND_UP(byte_mhz, esc_mhz);
+
+		/*
+		 * TODO: Ideally, we shouldn't know what sort of divider
+		 * is available in mmss_cc, we're just assuming that
+		 * it'll always be a 4 bit divider. Need to come up with
+		 * a better way here.
+		 */
+		if (esc_div >= 1 && esc_div <= 16)
+			break;
+	}
+
+	if (esc_mhz < 5)
+		return -EINVAL;
+
+	msm_host->esc_clk_rate = msm_host->byte_clk_rate / esc_div;
+
+	DBG("esc=%d, src=%d", msm_host->esc_clk_rate,
+		msm_host->src_clk_rate);
+
+	return 0;
+}
+
 static int dsi_calc_clk_rate(struct msm_dsi_host *msm_host)
 {
 	struct drm_display_mode *mode = msm_host->mode;
@@ -1008,6 +1161,49 @@ static void dsi_wait4video_eng_busy(struct msm_dsi_host *msm_host)
 	}
 }
 
+int dsi_tx_buf_alloc_6g(struct msm_dsi_host *msm_host, int size)
+{
+	struct drm_device *dev = msm_host->dev;
+	struct msm_drm_private *priv = dev->dev_private;
+	int ret;
+	uint64_t iova;
+
+	msm_host->tx_gem_obj = msm_gem_new(dev, size, MSM_BO_UNCACHED);
+	if (IS_ERR(msm_host->tx_gem_obj)) {
+		ret = PTR_ERR(msm_host->tx_gem_obj);
+		pr_err("%s: failed to allocate gem, %d\n",
+			__func__, ret);
+		msm_host->tx_gem_obj = NULL;
+		return ret;
+	}
+
+	ret = msm_gem_get_iova(msm_host->tx_gem_obj,
+			priv->kms->aspace, &iova);
+	mutex_unlock(&dev->struct_mutex);
+	if (ret) {
+		pr_err("%s: failed to get iova, %d\n", __func__, ret);
+		return ret;
+	}
+
+	msm_host->tx_size = msm_host->tx_gem_obj->size;
+
+	return 0;
+}
+
+int dsi_tx_buf_alloc_v2(struct msm_dsi_host *msm_host, int size)
+{
+	struct drm_device *dev = msm_host->dev;
+
+	msm_host->tx_buf = dma_alloc_coherent(dev->dev, size,
+					&msm_host->tx_buf_paddr, GFP_KERNEL);
+	if (!msm_host->tx_buf)
+		return -ENOMEM;
+
+	msm_host->tx_size = size;
+
+	return 0;
+}
+
 /* dsi_cmd */
 static int dsi_tx_buf_alloc(struct msm_dsi_host *msm_host, int size)
 {
@@ -1072,6 +1268,21 @@ static void dsi_tx_buf_free(struct msm_dsi_host *msm_host)
 			msm_host->tx_buf_paddr);
 }
 
+void *dsi_tx_buf_get_6g(struct msm_dsi_host *msm_host)
+{
+	return msm_gem_get_vaddr(msm_host->tx_gem_obj);
+}
+
+void *dsi_tx_buf_get_v2(struct msm_dsi_host *msm_host)
+{
+	return msm_host->tx_buf;
+}
+
+void dsi_tx_buf_put_6g(struct msm_dsi_host *msm_host)
+{
+	msm_gem_put_vaddr(msm_host->tx_gem_obj);
+}
+
 /*
  * prepare cmd buffer to be txed
  */
@@ -1173,6 +1384,27 @@ static int dsi_long_read_resp(u8 *buf, const struct mipi_dsi_msg *msg)
 	return msg->rx_len;
 }
 
+int dsi_dma_base_get_6g(struct msm_dsi_host *msm_host, uint64_t *dma_base)
+{
+	struct drm_device *dev = msm_host->dev;
+	struct msm_drm_private *priv = dev->dev_private;
+
+	if (!dma_base)
+		return -EINVAL;
+
+	return msm_gem_get_iova(msm_host->tx_gem_obj,
+				priv->kms->aspace, dma_base);
+}
+
+int dsi_dma_base_get_v2(struct msm_dsi_host *msm_host, uint64_t *dma_base)
+{
+	if (!dma_base)
+		return -EINVAL;
+
+	*dma_base = msm_host->tx_buf_paddr;
+	return 0;
+}
+
 static int dsi_cmd_dma_tx(struct msm_dsi_host *msm_host, int len)
 {
 	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

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

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v2 3/3] drm/msm/dsi: replace version checks with helper functions
  2018-03-19 19:41 [PATCH v2 0/3] Cleanup excessive DSI host controller version checks Sibi S
  2018-03-19 19:41 ` [PATCH v2 1/3] drm/msm/dsi: add dsi host helper functions support Sibi S
  2018-03-19 19:41 ` [PATCH v2 2/3] drm/msm/dsi: add implementation for helper functions Sibi S
@ 2018-03-19 19:41 ` Sibi S
  2018-03-23 12:35 ` [PATCH v2 0/3] Cleanup excessive DSI host controller version checks Archit Taneja
  3 siblings, 0 replies; 7+ messages in thread
From: Sibi S @ 2018-03-19 19:41 UTC (permalink / raw)
  To: architt, robdclark, jcrouse; +Cc: linux-arm-msm, Sibi S, dri-devel

Replace version checks with the helper functions bound to
cfg_handler for DSI v2, DSI 6G 1.x and DSI 6G v2.0+ controllers

Signed-off-by: Sibi S <sibis@codeaurora.org>
---
 drivers/gpu/drm/msm/dsi/dsi_host.c | 242 +++++--------------------------------
 1 file changed, 29 insertions(+), 213 deletions(-)

diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c
index 78ea4540f0ee..bf8581a5e67c 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_host.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_host.c
@@ -426,19 +426,6 @@ static int dsi_clk_init(struct msm_dsi_host *msm_host)
 		goto exit;
 	}
 
-	if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G &&
-	    cfg_hnd->minor >= MSM_DSI_6G_VER_MINOR_V2_2_1) {
-		msm_host->byte_intf_clk = msm_clk_get(pdev, "byte_intf");
-		if (IS_ERR(msm_host->byte_intf_clk)) {
-			ret = PTR_ERR(msm_host->byte_intf_clk);
-			pr_err("%s: can't find byte_intf clock. ret=%d\n",
-			        __func__, ret);
-			goto exit;
-		}
-	} else {
-		msm_host->byte_intf_clk = NULL;
-	}
-
 	msm_host->byte_clk_src = clk_get_parent(msm_host->byte_clk);
 	if (!msm_host->byte_clk_src) {
 		ret = -ENODEV;
@@ -453,31 +440,8 @@ static int dsi_clk_init(struct msm_dsi_host *msm_host)
 		goto exit;
 	}
 
-	if (cfg_hnd->major == MSM_DSI_VER_MAJOR_V2) {
-		msm_host->src_clk = msm_clk_get(pdev, "src");
-		if (IS_ERR(msm_host->src_clk)) {
-			ret = PTR_ERR(msm_host->src_clk);
-			pr_err("%s: can't find src clock. ret=%d\n",
-				__func__, ret);
-			msm_host->src_clk = NULL;
-			goto exit;
-		}
-
-		msm_host->esc_clk_src = clk_get_parent(msm_host->esc_clk);
-		if (!msm_host->esc_clk_src) {
-			ret = -ENODEV;
-			pr_err("%s: can't get esc clock parent. ret=%d\n",
-				__func__, ret);
-			goto exit;
-		}
-
-		msm_host->dsi_clk_src = clk_get_parent(msm_host->src_clk);
-		if (!msm_host->dsi_clk_src) {
-			ret = -ENODEV;
-			pr_err("%s: can't get src clock parent. ret=%d\n",
-				__func__, ret);
-		}
-	}
+	if (cfg_hnd->ops->clk_init_ver)
+		ret = cfg_hnd->ops->clk_init_ver(msm_host);
 exit:
 	return ret;
 }
@@ -681,16 +645,6 @@ int dsi_link_clk_enable_v2(struct msm_dsi_host *msm_host)
 	return ret;
 }
 
-static int dsi_link_clk_enable(struct msm_dsi_host *msm_host)
-{
-	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
-
-	if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G)
-		return dsi_link_clk_enable_6g(msm_host);
-	else
-		return dsi_link_clk_enable_v2(msm_host);
-}
-
 void dsi_link_clk_disable_6g(struct msm_dsi_host *msm_host)
 {
 	clk_disable_unprepare(msm_host->esc_clk);
@@ -708,24 +662,6 @@ void dsi_link_clk_disable_v2(struct msm_dsi_host *msm_host)
 	clk_disable_unprepare(msm_host->byte_clk);
 }
 
-static void dsi_link_clk_disable(struct msm_dsi_host *msm_host)
-{
-	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
-
-	if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) {
-		clk_disable_unprepare(msm_host->esc_clk);
-		clk_disable_unprepare(msm_host->pixel_clk);
-		if (msm_host->byte_intf_clk)
-			clk_disable_unprepare(msm_host->byte_intf_clk);
-		clk_disable_unprepare(msm_host->byte_clk);
-	} else {
-		clk_disable_unprepare(msm_host->pixel_clk);
-		clk_disable_unprepare(msm_host->src_clk);
-		clk_disable_unprepare(msm_host->esc_clk);
-		clk_disable_unprepare(msm_host->byte_clk);
-	}
-}
-
 int dsi_calc_clk_rate_6g(struct msm_dsi_host *msm_host)
 {
 	struct drm_display_mode *mode = msm_host->mode;
@@ -814,73 +750,6 @@ int dsi_calc_clk_rate_v2(struct msm_dsi_host *msm_host)
 	return 0;
 }
 
-static int dsi_calc_clk_rate(struct msm_dsi_host *msm_host)
-{
-	struct drm_display_mode *mode = msm_host->mode;
-	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
-	u8 lanes = msm_host->lanes;
-	u32 bpp = dsi_get_bpp(msm_host->format);
-	u32 pclk_rate;
-
-	if (!mode) {
-		pr_err("%s: mode not set\n", __func__);
-		return -EINVAL;
-	}
-
-	pclk_rate = mode->clock * 1000;
-	if (lanes > 0) {
-		msm_host->byte_clk_rate = (pclk_rate * bpp) / (8 * lanes);
-	} else {
-		pr_err("%s: forcing mdss_dsi lanes to 1\n", __func__);
-		msm_host->byte_clk_rate = (pclk_rate * bpp) / 8;
-	}
-
-	DBG("pclk=%d, bclk=%d", pclk_rate, msm_host->byte_clk_rate);
-
-	msm_host->esc_clk_rate = clk_get_rate(msm_host->esc_clk);
-
-	if (cfg_hnd->major == MSM_DSI_VER_MAJOR_V2) {
-		unsigned int esc_mhz, esc_div;
-		unsigned long byte_mhz;
-
-		msm_host->src_clk_rate = (pclk_rate * bpp) / 8;
-
-		/*
-		 * esc clock is byte clock followed by a 4 bit divider,
-		 * we need to find an escape clock frequency within the
-		 * mipi DSI spec range within the maximum divider limit
-		 * We iterate here between an escape clock frequencey
-		 * between 20 Mhz to 5 Mhz and pick up the first one
-		 * that can be supported by our divider
-		 */
-
-		byte_mhz = msm_host->byte_clk_rate / 1000000;
-
-		for (esc_mhz = 20; esc_mhz >= 5; esc_mhz--) {
-			esc_div = DIV_ROUND_UP(byte_mhz, esc_mhz);
-
-			/*
-			 * TODO: Ideally, we shouldn't know what sort of divider
-			 * is available in mmss_cc, we're just assuming that
-			 * it'll always be a 4 bit divider. Need to come up with
-			 * a better way here.
-			 */
-			if (esc_div >= 1 && esc_div <= 16)
-				break;
-		}
-
-		if (esc_mhz < 5)
-			return -EINVAL;
-
-		msm_host->esc_clk_rate = msm_host->byte_clk_rate / esc_div;
-
-		DBG("esc=%d, src=%d", msm_host->esc_clk_rate,
-			msm_host->src_clk_rate);
-	}
-
-	return 0;
-}
-
 static void dsi_intr_ctrl(struct msm_dsi_host *msm_host, u32 mask, int enable)
 {
 	u32 intr;
@@ -1204,55 +1073,6 @@ int dsi_tx_buf_alloc_v2(struct msm_dsi_host *msm_host, int size)
 	return 0;
 }
 
-/* dsi_cmd */
-static int dsi_tx_buf_alloc(struct msm_dsi_host *msm_host, int size)
-{
-	struct drm_device *dev = msm_host->dev;
-	struct msm_drm_private *priv = dev->dev_private;
-	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
-	int ret;
-	uint64_t iova;
-
-	if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) {
-		msm_host->tx_gem_obj = msm_gem_new(dev, size, MSM_BO_UNCACHED);
-		if (IS_ERR(msm_host->tx_gem_obj)) {
-			ret = PTR_ERR(msm_host->tx_gem_obj);
-			pr_err("%s: failed to allocate gem, %d\n",
-				__func__, ret);
-			msm_host->tx_gem_obj = NULL;
-			return ret;
-		}
-
-		ret = msm_gem_get_iova(msm_host->tx_gem_obj,
-				priv->kms->aspace, &iova);
-		mutex_unlock(&dev->struct_mutex);
-		if (ret) {
-			pr_err("%s: failed to get iova, %d\n", __func__, ret);
-			return ret;
-		}
-
-		if (iova & 0x07) {
-			pr_err("%s: buf NOT 8 bytes aligned\n", __func__);
-			return -EINVAL;
-		}
-
-		msm_host->tx_size = msm_host->tx_gem_obj->size;
-	} else {
-		msm_host->tx_buf = dma_alloc_coherent(dev->dev, size,
-					&msm_host->tx_buf_paddr, GFP_KERNEL);
-		if (!msm_host->tx_buf) {
-			ret = -ENOMEM;
-			pr_err("%s: failed to allocate tx buf, %d\n",
-				__func__, ret);
-			return ret;
-		}
-
-		msm_host->tx_size = size;
-	}
-
-	return 0;
-}
-
 static void dsi_tx_buf_free(struct msm_dsi_host *msm_host)
 {
 	struct drm_device *dev = msm_host->dev;
@@ -1307,15 +1127,11 @@ static int dsi_cmd_dma_add(struct msm_dsi_host *msm_host,
 		return -EINVAL;
 	}
 
-	if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) {
-		data = msm_gem_get_vaddr(msm_host->tx_gem_obj);
-		if (IS_ERR(data)) {
-			ret = PTR_ERR(data);
-			pr_err("%s: get vaddr failed, %d\n", __func__, ret);
-			return ret;
-		}
-	} else {
-		data = msm_host->tx_buf;
+	data = cfg_hnd->ops->tx_buf_get(msm_host);
+	if (IS_ERR(data)) {
+		ret = PTR_ERR(data);
+		pr_err("%s: get vaddr failed, %d\n", __func__, ret);
+		return ret;
 	}
 
 	/* MSM specific command format in memory */
@@ -1336,8 +1152,8 @@ static int dsi_cmd_dma_add(struct msm_dsi_host *msm_host,
 	if (packet.size < len)
 		memset(data + packet.size, 0xff, len - packet.size);
 
-	if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G)
-		msm_gem_put_vaddr(msm_host->tx_gem_obj);
+	if (cfg_hnd->ops->tx_buf_put)
+		cfg_hnd->ops->tx_buf_put(msm_host);
 
 	return len;
 }
@@ -1408,21 +1224,14 @@ int dsi_dma_base_get_v2(struct msm_dsi_host *msm_host, uint64_t *dma_base)
 static int dsi_cmd_dma_tx(struct msm_dsi_host *msm_host, int len)
 {
 	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
-	struct drm_device *dev = msm_host->dev;
-	struct msm_drm_private *priv = dev->dev_private;
 	int ret;
 	uint64_t dma_base;
 	bool triggered;
 
-	if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) {
-		ret = msm_gem_get_iova(msm_host->tx_gem_obj,
-				priv->kms->aspace, &dma_base);
-		if (ret) {
-			pr_err("%s: failed to get iova: %d\n", __func__, ret);
-			return ret;
-		}
-	} else {
-		dma_base = msm_host->tx_buf_paddr;
+	ret = cfg_hnd->ops->dma_base_get(msm_host, &dma_base);
+	if (ret) {
+		pr_err("%s: failed to get iova: %d\n", __func__, ret);
+		return ret;
 	}
 
 	reinit_completion(&msm_host->dma_comp);
@@ -2060,6 +1869,7 @@ int msm_dsi_host_modeset_init(struct mipi_dsi_host *host,
 					struct drm_device *dev)
 {
 	struct msm_dsi_host *msm_host = to_msm_dsi_host(host);
+	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
 	struct platform_device *pdev = msm_host->pdev;
 	int ret;
 
@@ -2080,7 +1890,7 @@ int msm_dsi_host_modeset_init(struct mipi_dsi_host *host,
 	}
 
 	msm_host->dev = dev;
-	ret = dsi_tx_buf_alloc(msm_host, SZ_4K);
+	ret = cfg_hnd->ops->tx_buf_alloc(msm_host, SZ_4K);
 	if (ret) {
 		pr_err("%s: alloc tx gem obj failed, %d\n", __func__, ret);
 		return ret;
@@ -2138,6 +1948,7 @@ int msm_dsi_host_xfer_prepare(struct mipi_dsi_host *host,
 				const struct mipi_dsi_msg *msg)
 {
 	struct msm_dsi_host *msm_host = to_msm_dsi_host(host);
+	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
 
 	/* TODO: make sure dsi_cmd_mdp is idle.
 	 * Since DSI6G v1.2.0, we can set DSI_TRIG_CTRL.BLOCK_DMA_WITHIN_FRAME
@@ -2150,7 +1961,7 @@ int msm_dsi_host_xfer_prepare(struct mipi_dsi_host *host,
 	 * mdp clock need to be enabled to receive dsi interrupt
 	 */
 	pm_runtime_get_sync(&msm_host->pdev->dev);
-	dsi_link_clk_enable(msm_host);
+	cfg_hnd->ops->link_clk_enable(msm_host);
 
 	/* TODO: vote for bus bandwidth */
 
@@ -2171,6 +1982,7 @@ void msm_dsi_host_xfer_restore(struct mipi_dsi_host *host,
 				const struct mipi_dsi_msg *msg)
 {
 	struct msm_dsi_host *msm_host = to_msm_dsi_host(host);
+	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
 
 	dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_CMD_DMA_DONE, 0);
 	dsi_write(msm_host, REG_DSI_CTRL, msm_host->dma_cmd_ctrl_restore);
@@ -2180,7 +1992,7 @@ void msm_dsi_host_xfer_restore(struct mipi_dsi_host *host,
 
 	/* TODO: unvote for bus bandwidth */
 
-	dsi_link_clk_disable(msm_host);
+	cfg_hnd->ops->link_clk_disable(msm_host);
 	pm_runtime_put_autosuspend(&msm_host->pdev->dev);
 }
 
@@ -2344,7 +2156,6 @@ int msm_dsi_host_set_src_pll(struct mipi_dsi_host *host,
 	struct msm_dsi_pll *src_pll)
 {
 	struct msm_dsi_host *msm_host = to_msm_dsi_host(host);
-	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
 	struct clk *byte_clk_provider, *pixel_clk_provider;
 	int ret;
 
@@ -2370,14 +2181,16 @@ int msm_dsi_host_set_src_pll(struct mipi_dsi_host *host,
 		goto exit;
 	}
 
-	if (cfg_hnd->major == MSM_DSI_VER_MAJOR_V2) {
+	if (msm_host->dsi_clk_src) {
 		ret = clk_set_parent(msm_host->dsi_clk_src, pixel_clk_provider);
 		if (ret) {
 			pr_err("%s: can't set parent to dsi_clk_src. ret=%d\n",
 				__func__, ret);
 			goto exit;
 		}
+	}
 
+	if (msm_host->esc_clk_src) {
 		ret = clk_set_parent(msm_host->esc_clk_src, byte_clk_provider);
 		if (ret) {
 			pr_err("%s: can't set parent to esc_clk_src. ret=%d\n",
@@ -2407,9 +2220,10 @@ void msm_dsi_host_get_phy_clk_req(struct mipi_dsi_host *host,
 	struct msm_dsi_phy_clk_request *clk_req)
 {
 	struct msm_dsi_host *msm_host = to_msm_dsi_host(host);
+	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
 	int ret;
 
-	ret = dsi_calc_clk_rate(msm_host);
+	ret = cfg_hnd->ops->calc_clk_rate(msm_host);
 	if (ret) {
 		pr_err("%s: unable to calc clk rate, %d\n", __func__, ret);
 		return;
@@ -2473,6 +2287,7 @@ int msm_dsi_host_power_on(struct mipi_dsi_host *host,
 			struct msm_dsi_phy_shared_timings *phy_shared_timings)
 {
 	struct msm_dsi_host *msm_host = to_msm_dsi_host(host);
+	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
 	int ret = 0;
 
 	mutex_lock(&msm_host->dev_mutex);
@@ -2491,7 +2306,7 @@ int msm_dsi_host_power_on(struct mipi_dsi_host *host,
 	}
 
 	pm_runtime_get_sync(&msm_host->pdev->dev);
-	ret = dsi_link_clk_enable(msm_host);
+	ret = cfg_hnd->ops->link_clk_enable(msm_host);
 	if (ret) {
 		pr_err("%s: failed to enable link clocks. ret=%d\n",
 		       __func__, ret);
@@ -2518,7 +2333,7 @@ int msm_dsi_host_power_on(struct mipi_dsi_host *host,
 	return 0;
 
 fail_disable_clk:
-	dsi_link_clk_disable(msm_host);
+	cfg_hnd->ops->link_clk_disable(msm_host);
 	pm_runtime_put_autosuspend(&msm_host->pdev->dev);
 fail_disable_reg:
 	dsi_host_regulator_disable(msm_host);
@@ -2530,6 +2345,7 @@ int msm_dsi_host_power_on(struct mipi_dsi_host *host,
 int msm_dsi_host_power_off(struct mipi_dsi_host *host)
 {
 	struct msm_dsi_host *msm_host = to_msm_dsi_host(host);
+	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
 
 	mutex_lock(&msm_host->dev_mutex);
 	if (!msm_host->power_on) {
@@ -2544,7 +2360,7 @@ int msm_dsi_host_power_off(struct mipi_dsi_host *host)
 
 	pinctrl_pm_select_sleep_state(&msm_host->pdev->dev);
 
-	dsi_link_clk_disable(msm_host);
+	cfg_hnd->ops->link_clk_disable(msm_host);
 	pm_runtime_put_autosuspend(&msm_host->pdev->dev);
 
 	dsi_host_regulator_disable(msm_host);
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

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

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 2/3] drm/msm/dsi: add implementation for helper functions
  2018-03-19 19:41 ` [PATCH v2 2/3] drm/msm/dsi: add implementation for helper functions Sibi S
@ 2018-03-19 20:23   ` Jordan Crouse
  2018-03-26 17:16     ` Sibi S
  0 siblings, 1 reply; 7+ messages in thread
From: Jordan Crouse @ 2018-03-19 20:23 UTC (permalink / raw)
  To: Sibi S; +Cc: linux-arm-msm, dri-devel

On Tue, Mar 20, 2018 at 01:11:02AM +0530, Sibi S wrote:
> Add dsi host helper function implementation for DSI v2
> DSI 6G 1.x and DSI 6G v2.0+ controllers
> 
> Signed-off-by: Sibi S <sibis@codeaurora.org>
> ---
>  drivers/gpu/drm/msm/dsi/dsi.h      |  15 +++
>  drivers/gpu/drm/msm/dsi/dsi_cfg.c  |  56 +++++++--
>  drivers/gpu/drm/msm/dsi/dsi_host.c | 236 ++++++++++++++++++++++++++++++++++++-
>  3 files changed, 296 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/msm/dsi/dsi.h b/drivers/gpu/drm/msm/dsi/dsi.h
> index 80be83e8fdec..dfa049d876bd 100644
> --- a/drivers/gpu/drm/msm/dsi/dsi.h
> +++ b/drivers/gpu/drm/msm/dsi/dsi.h
> @@ -183,6 +183,21 @@ int msm_dsi_host_modeset_init(struct mipi_dsi_host *host,
>  int msm_dsi_host_init(struct msm_dsi *msm_dsi);
>  int msm_dsi_runtime_suspend(struct device *dev);
>  int msm_dsi_runtime_resume(struct device *dev);
> +int dsi_link_clk_enable_6g(struct msm_dsi_host *msm_host);
> +int dsi_link_clk_enable_v2(struct msm_dsi_host *msm_host);
> +void dsi_link_clk_disable_6g(struct msm_dsi_host *msm_host);
> +void dsi_link_clk_disable_v2(struct msm_dsi_host *msm_host);
> +int dsi_tx_buf_alloc_6g(struct msm_dsi_host *msm_host, int size);
> +int dsi_tx_buf_alloc_v2(struct msm_dsi_host *msm_host, int size);
> +void *dsi_tx_buf_get_6g(struct msm_dsi_host *msm_host);
> +void *dsi_tx_buf_get_v2(struct msm_dsi_host *msm_host);
> +void dsi_tx_buf_put_6g(struct msm_dsi_host *msm_host);
> +int dsi_dma_base_get_6g(struct msm_dsi_host *msm_host, uint64_t *iova);
> +int dsi_dma_base_get_v2(struct msm_dsi_host *msm_host, uint64_t *iova);
> +int dsi_clk_init_v2(struct msm_dsi_host *msm_host);
> +int dsi_clk_init_6g_v2(struct msm_dsi_host *msm_host);
> +int dsi_calc_clk_rate_v2(struct msm_dsi_host *msm_host);
> +int dsi_calc_clk_rate_6g(struct msm_dsi_host *msm_host);
>  
>  /* dsi phy */
>  struct msm_dsi_phy;
> diff --git a/drivers/gpu/drm/msm/dsi/dsi_cfg.c b/drivers/gpu/drm/msm/dsi/dsi_cfg.c
> index 0327bb54b01b..dcdfb1bb54f9 100644
> --- a/drivers/gpu/drm/msm/dsi/dsi_cfg.c
> +++ b/drivers/gpu/drm/msm/dsi/dsi_cfg.c
> @@ -136,20 +136,58 @@ static const struct msm_dsi_config sdm845_dsi_cfg = {
>  	.num_dsi = 2,
>  };
>  
> +const static struct msm_dsi_host_cfg_ops msm_dsi_v2_host_ops = {
> +	.link_clk_enable = dsi_link_clk_enable_v2,
> +	.link_clk_disable = dsi_link_clk_disable_v2,
> +	.clk_init_ver = dsi_clk_init_v2,
> +	.tx_buf_alloc = dsi_tx_buf_alloc_v2,
> +	.tx_buf_get = dsi_tx_buf_get_v2,
> +	.tx_buf_put = NULL,
> +	.dma_base_get = dsi_dma_base_get_v2,
> +	.calc_clk_rate = dsi_calc_clk_rate_v2,
> +};
> +
> +const static struct msm_dsi_host_cfg_ops msm_dsi_6g_host_ops = {
> +	.link_clk_enable = dsi_link_clk_enable_6g,
> +	.link_clk_disable = dsi_link_clk_disable_6g,
> +	.clk_init_ver = NULL,
> +	.tx_buf_alloc = dsi_tx_buf_alloc_6g,
> +	.tx_buf_get = dsi_tx_buf_get_6g,
> +	.tx_buf_put = dsi_tx_buf_put_6g,
> +	.dma_base_get = dsi_dma_base_get_6g,
> +	.calc_clk_rate = dsi_calc_clk_rate_6g,
> +};
> +
> +const static struct msm_dsi_host_cfg_ops msm_dsi_6g_v2_host_ops = {
> +	.link_clk_enable = dsi_link_clk_enable_6g,
> +	.link_clk_disable = dsi_link_clk_disable_6g,
> +	.clk_init_ver = dsi_clk_init_6g_v2,
> +	.tx_buf_alloc = dsi_tx_buf_alloc_6g,
> +	.tx_buf_get = dsi_tx_buf_get_6g,
> +	.tx_buf_put = dsi_tx_buf_put_6g,
> +	.dma_base_get = dsi_dma_base_get_6g,
> +	.calc_clk_rate = dsi_calc_clk_rate_6g,
> +};
> +
>  static const struct msm_dsi_cfg_handler dsi_cfg_handlers[] = {
> -	{MSM_DSI_VER_MAJOR_V2, MSM_DSI_V2_VER_MINOR_8064, &apq8064_dsi_cfg},
> +	{MSM_DSI_VER_MAJOR_V2, MSM_DSI_V2_VER_MINOR_8064,
> +		&apq8064_dsi_cfg, &msm_dsi_v2_host_ops},
>  	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_0,
> -						&msm8974_apq8084_dsi_cfg},
> +		&msm8974_apq8084_dsi_cfg, &msm_dsi_6g_host_ops},
>  	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_1,
> -						&msm8974_apq8084_dsi_cfg},
> +		&msm8974_apq8084_dsi_cfg, &msm_dsi_6g_host_ops},
>  	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_1_1,
> -						&msm8974_apq8084_dsi_cfg},
> +		&msm8974_apq8084_dsi_cfg, &msm_dsi_6g_host_ops},
>  	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_2,
> -						&msm8974_apq8084_dsi_cfg},
> -	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_3, &msm8994_dsi_cfg},
> -	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_3_1, &msm8916_dsi_cfg},
> -	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_4_1, &msm8996_dsi_cfg},
> -	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_2_1, &sdm845_dsi_cfg},
> +		&msm8974_apq8084_dsi_cfg, &msm_dsi_6g_host_ops},
> +	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_3,
> +		&msm8994_dsi_cfg, &msm_dsi_6g_host_ops},
> +	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_3_1,
> +		&msm8916_dsi_cfg, &msm_dsi_6g_host_ops},
> +	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_4_1,
> +		&msm8996_dsi_cfg, &msm_dsi_6g_host_ops},
> +	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_2_1,
> +		&sdm845_dsi_cfg, &msm_dsi_6g_v2_host_ops},
>  };
>  
>  const struct msm_dsi_cfg_handler *msm_dsi_cfg_get(u32 major, u32 minor)
> diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c
> index 7a03a9489708..78ea4540f0ee 100644
> --- a/drivers/gpu/drm/msm/dsi/dsi_host.c
> +++ b/drivers/gpu/drm/msm/dsi/dsi_host.c
> @@ -331,6 +331,54 @@ static int dsi_regulator_init(struct msm_dsi_host *msm_host)
>  	return 0;
>  }
>  
> +int dsi_clk_init_v2(struct msm_dsi_host *msm_host)
> +{
> +	struct platform_device *pdev = msm_host->pdev;
> +	int ret = 0;
> +
> +	msm_host->src_clk = msm_clk_get(pdev, "src");
> +
> +	if (IS_ERR(msm_host->src_clk)) {
> +		ret = PTR_ERR(msm_host->src_clk);
> +		pr_err("%s: can't find src clock. ret=%d\n",
> +			__func__, ret);
> +		msm_host->src_clk = NULL;
> +		return ret;
> +	}
> +
> +	msm_host->esc_clk_src = clk_get_parent(msm_host->esc_clk);
> +	if (!msm_host->esc_clk_src) {
> +		ret = -ENODEV;
> +		pr_err("%s: can't get esc clock parent. ret=%d\n",
> +			__func__, ret);
> +		return ret;
> +	}
> +
> +	msm_host->dsi_clk_src = clk_get_parent(msm_host->src_clk);
> +	if (!msm_host->dsi_clk_src) {
> +		ret = -ENODEV;
> +		pr_err("%s: can't get src clock parent. ret=%d\n",
> +			__func__, ret);
> +	}
> +
> +	return ret;
> +}
> +
> +int dsi_clk_init_6g_v2(struct msm_dsi_host *msm_host)
> +{
> +	struct platform_device *pdev = msm_host->pdev;
> +	int ret = 0;
> +
> +	msm_host->byte_intf_clk = msm_clk_get(pdev, "byte_intf");
> +	if (IS_ERR(msm_host->byte_intf_clk)) {
> +		ret = PTR_ERR(msm_host->byte_intf_clk);
> +		pr_err("%s: can't find byte_intf clock. ret=%d\n",
> +			__func__, ret);
> +	}
> +
> +	return ret;
> +}
> +
>  static int dsi_clk_init(struct msm_dsi_host *msm_host)
>  {
>  	struct platform_device *pdev = msm_host->pdev;
> @@ -497,7 +545,7 @@ int msm_dsi_runtime_resume(struct device *dev)
>  	return dsi_bus_clk_enable(msm_host);
>  }
>  
> -static int dsi_link_clk_enable_6g(struct msm_dsi_host *msm_host)
> +int dsi_link_clk_enable_6g(struct msm_dsi_host *msm_host)
>  {
>  	int ret;
>  
> @@ -565,7 +613,7 @@ static int dsi_link_clk_enable_6g(struct msm_dsi_host *msm_host)
>  	return ret;
>  }
>  
> -static int dsi_link_clk_enable_v2(struct msm_dsi_host *msm_host)
> +int dsi_link_clk_enable_v2(struct msm_dsi_host *msm_host)
>  {
>  	int ret;
>  
> @@ -643,6 +691,23 @@ static int dsi_link_clk_enable(struct msm_dsi_host *msm_host)
>  		return dsi_link_clk_enable_v2(msm_host);
>  }
>  
> +void dsi_link_clk_disable_6g(struct msm_dsi_host *msm_host)
> +{
> +	clk_disable_unprepare(msm_host->esc_clk);
> +	clk_disable_unprepare(msm_host->pixel_clk);
> +	if (msm_host->byte_intf_clk)
> +		clk_disable_unprepare(msm_host->byte_intf_clk);
> +	clk_disable_unprepare(msm_host->byte_clk);
> +}
> +
> +void dsi_link_clk_disable_v2(struct msm_dsi_host *msm_host)
> +{
> +	clk_disable_unprepare(msm_host->pixel_clk);
> +	clk_disable_unprepare(msm_host->src_clk);
> +	clk_disable_unprepare(msm_host->esc_clk);
> +	clk_disable_unprepare(msm_host->byte_clk);
> +}
> +
>  static void dsi_link_clk_disable(struct msm_dsi_host *msm_host)
>  {
>  	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
> @@ -661,6 +726,94 @@ static void dsi_link_clk_disable(struct msm_dsi_host *msm_host)
>  	}
>  }
>  
> +int dsi_calc_clk_rate_6g(struct msm_dsi_host *msm_host)
> +{
> +	struct drm_display_mode *mode = msm_host->mode;
> +	u8 lanes = msm_host->lanes;
> +	u32 bpp = dsi_get_bpp(msm_host->format);
> +	u32 pclk_rate;
> +
> +	if (!mode) {
> +		pr_err("%s: mode not set\n", __func__);
> +		return -EINVAL;
> +	}

As far as I can tell from patch 3/3 the calc_clk_rate() function hook is only
called once and mode_host is guaranteed to be not null. I don't think this check
is needed.

> +	pclk_rate = mode->clock * 1000;
> +	if (lanes > 0) {
> +		msm_host->byte_clk_rate = (pclk_rate * bpp) / (8 * lanes);
> +	} else {
> +		pr_err("%s: forcing mdss_dsi lanes to 1\n", __func__);
> +		msm_host->byte_clk_rate = (pclk_rate * bpp) / 8;
> +	}
> +
> +	DBG("pclk=%d, bclk=%d", pclk_rate, msm_host->byte_clk_rate);
> +
> +	msm_host->esc_clk_rate = clk_get_rate(msm_host->esc_clk);
> +
> +	return 0;
> +}
> +
> +int dsi_calc_clk_rate_v2(struct msm_dsi_host *msm_host)
> +{
> +	struct drm_display_mode *mode = msm_host->mode;
> +	u8 lanes = msm_host->lanes;
> +	u32 bpp = dsi_get_bpp(msm_host->format);
> +	u32 pclk_rate;
> +	unsigned int esc_mhz, esc_div;
> +	unsigned long byte_mhz;
> +
> +	if (!mode) {
> +		pr_err("%s: mode not set\n", __func__);
> +		return -EINVAL;
> +	}
>
Or this.

> +	pclk_rate = mode->clock * 1000;
> +	if (lanes > 0) {
> +		msm_host->byte_clk_rate = (pclk_rate * bpp) / (8 * lanes);
> +	} else {
> +		pr_err("%s: forcing mdss_dsi lanes to 1\n", __func__);
> +		msm_host->byte_clk_rate = (pclk_rate * bpp) / 8;
> +	}
> +
> +	DBG("pclk=%d, bclk=%d", pclk_rate, msm_host->byte_clk_rate);
> +
> +	msm_host->src_clk_rate = (pclk_rate * bpp) / 8;
> +
> +	/*
> +	 * esc clock is byte clock followed by a 4 bit divider,
> +	 * we need to find an escape clock frequency within the
> +	 * mipi DSI spec range within the maximum divider limit
> +	 * We iterate here between an escape clock frequencey
> +	 * between 20 Mhz to 5 Mhz and pick up the first one
> +	 * that can be supported by our divider
> +	 */
> +
> +	byte_mhz = msm_host->byte_clk_rate / 1000000;
> +
> +	for (esc_mhz = 20; esc_mhz >= 5; esc_mhz--) {
> +		esc_div = DIV_ROUND_UP(byte_mhz, esc_mhz);
> +
> +		/*
> +		 * TODO: Ideally, we shouldn't know what sort of divider
> +		 * is available in mmss_cc, we're just assuming that
> +		 * it'll always be a 4 bit divider. Need to come up with
> +		 * a better way here.
> +		 */
> +		if (esc_div >= 1 && esc_div <= 16)
> +			break;
> +	}
> +
> +	if (esc_mhz < 5)
> +		return -EINVAL;
> +
> +	msm_host->esc_clk_rate = msm_host->byte_clk_rate / esc_div;
> +
> +	DBG("esc=%d, src=%d", msm_host->esc_clk_rate,
> +		msm_host->src_clk_rate);
> +
> +	return 0;
> +}
> +
>  static int dsi_calc_clk_rate(struct msm_dsi_host *msm_host)
>  {
>  	struct drm_display_mode *mode = msm_host->mode;
> @@ -1008,6 +1161,49 @@ static void dsi_wait4video_eng_busy(struct msm_dsi_host *msm_host)
>  	}
>  }
>  
> +int dsi_tx_buf_alloc_6g(struct msm_dsi_host *msm_host, int size)
> +{
> +	struct drm_device *dev = msm_host->dev;
> +	struct msm_drm_private *priv = dev->dev_private;
> +	int ret;
> +	uint64_t iova;
> +
> +	msm_host->tx_gem_obj = msm_gem_new(dev, size, MSM_BO_UNCACHED);
> +	if (IS_ERR(msm_host->tx_gem_obj)) {
> +		ret = PTR_ERR(msm_host->tx_gem_obj);
> +		pr_err("%s: failed to allocate gem, %d\n",
> +			__func__, ret);
> +		msm_host->tx_gem_obj = NULL;
> +		return ret;
> +	}
> +
> +	ret = msm_gem_get_iova(msm_host->tx_gem_obj,
> +			priv->kms->aspace, &iova);
> +	mutex_unlock(&dev->struct_mutex);
> +	if (ret) {
> +		pr_err("%s: failed to get iova, %d\n", __func__, ret);
> +		return ret;
> +	}

I'm not sure if you also need to vmap this at some point, but we have a handy
helper function for in-kernel gem objects to automate a bit of this:

void *msm_gem_kernel_new(struct drm_device *dev, uint32_t size,
                uint32_t flags, struct msm_gem_address_space *aspace,
		struct drm_gem_object **bo, uint64_t *iova);

Jordan
-- 
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 0/3] Cleanup excessive DSI host controller version checks
  2018-03-19 19:41 [PATCH v2 0/3] Cleanup excessive DSI host controller version checks Sibi S
                   ` (2 preceding siblings ...)
  2018-03-19 19:41 ` [PATCH v2 3/3] drm/msm/dsi: replace version checks with " Sibi S
@ 2018-03-23 12:35 ` Archit Taneja
  3 siblings, 0 replies; 7+ messages in thread
From: Archit Taneja @ 2018-03-23 12:35 UTC (permalink / raw)
  To: Sibi S, robdclark, jcrouse; +Cc: linux-arm-msm, dri-devel



On Tuesday 20 March 2018 01:11 AM, Sibi S wrote:
> This patch series aims to create and bind dsi host controller helper
> functions to functionalities that vary across DSI v2, DSI 6G 1.x and
> DSI 6G v2.0+ controllers. These functionalities are currently under
> excessive version checks which is now replaced with the corresponding
> helper function.

Reviewed-by: Archit Taneja <architt@codeaurora.org>

> 
> V2:
>    Removes command broadcast support for DSI 6G v2.0+ controllers from
>    the patch series and incorporates all the suggested corrections
>    
> 
> Sibi S (3):
>    drm/msm/dsi: add dsi host helper functions support
>    drm/msm/dsi: add implementation for helper functions
>    drm/msm/dsi: replace version checks with helper functions
> 
>   drivers/gpu/drm/msm/dsi/dsi.h      |  16 ++
>   drivers/gpu/drm/msm/dsi/dsi_cfg.c  |  56 +++++-
>   drivers/gpu/drm/msm/dsi/dsi_cfg.h  |  12 ++
>   drivers/gpu/drm/msm/dsi/dsi_host.c | 362 +++++++++++++++++++++----------------
>   4 files changed, 280 insertions(+), 166 deletions(-)
> 
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v2 2/3] drm/msm/dsi: add implementation for helper functions
  2018-03-19 20:23   ` Jordan Crouse
@ 2018-03-26 17:16     ` Sibi S
  0 siblings, 0 replies; 7+ messages in thread
From: Sibi S @ 2018-03-26 17:16 UTC (permalink / raw)
  To: architt, robdclark, dri-devel, linux-arm-msm

Hi Jordan,
Thanks for the review.

On 03/20/2018 01:53 AM, Jordan Crouse wrote:
> On Tue, Mar 20, 2018 at 01:11:02AM +0530, Sibi S wrote:
>> Add dsi host helper function implementation for DSI v2
>> DSI 6G 1.x and DSI 6G v2.0+ controllers
>>
>> Signed-off-by: Sibi S <sibis@codeaurora.org>
>> ---
>>   drivers/gpu/drm/msm/dsi/dsi.h      |  15 +++
>>   drivers/gpu/drm/msm/dsi/dsi_cfg.c  |  56 +++++++--
>>   drivers/gpu/drm/msm/dsi/dsi_host.c | 236 ++++++++++++++++++++++++++++++++++++-
>>   3 files changed, 296 insertions(+), 11 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/msm/dsi/dsi.h b/drivers/gpu/drm/msm/dsi/dsi.h
>> index 80be83e8fdec..dfa049d876bd 100644
>> --- a/drivers/gpu/drm/msm/dsi/dsi.h
>> +++ b/drivers/gpu/drm/msm/dsi/dsi.h
>> @@ -183,6 +183,21 @@ int msm_dsi_host_modeset_init(struct mipi_dsi_host *host,
>>   int msm_dsi_host_init(struct msm_dsi *msm_dsi);
>>   int msm_dsi_runtime_suspend(struct device *dev);
>>   int msm_dsi_runtime_resume(struct device *dev);
>> +int dsi_link_clk_enable_6g(struct msm_dsi_host *msm_host);
>> +int dsi_link_clk_enable_v2(struct msm_dsi_host *msm_host);
>> +void dsi_link_clk_disable_6g(struct msm_dsi_host *msm_host);
>> +void dsi_link_clk_disable_v2(struct msm_dsi_host *msm_host);
>> +int dsi_tx_buf_alloc_6g(struct msm_dsi_host *msm_host, int size);
>> +int dsi_tx_buf_alloc_v2(struct msm_dsi_host *msm_host, int size);
>> +void *dsi_tx_buf_get_6g(struct msm_dsi_host *msm_host);
>> +void *dsi_tx_buf_get_v2(struct msm_dsi_host *msm_host);
>> +void dsi_tx_buf_put_6g(struct msm_dsi_host *msm_host);
>> +int dsi_dma_base_get_6g(struct msm_dsi_host *msm_host, uint64_t *iova);
>> +int dsi_dma_base_get_v2(struct msm_dsi_host *msm_host, uint64_t *iova);
>> +int dsi_clk_init_v2(struct msm_dsi_host *msm_host);
>> +int dsi_clk_init_6g_v2(struct msm_dsi_host *msm_host);
>> +int dsi_calc_clk_rate_v2(struct msm_dsi_host *msm_host);
>> +int dsi_calc_clk_rate_6g(struct msm_dsi_host *msm_host);
>>   
>>   /* dsi phy */
>>   struct msm_dsi_phy;
>> diff --git a/drivers/gpu/drm/msm/dsi/dsi_cfg.c b/drivers/gpu/drm/msm/dsi/dsi_cfg.c
>> index 0327bb54b01b..dcdfb1bb54f9 100644
>> --- a/drivers/gpu/drm/msm/dsi/dsi_cfg.c
>> +++ b/drivers/gpu/drm/msm/dsi/dsi_cfg.c
>> @@ -136,20 +136,58 @@ static const struct msm_dsi_config sdm845_dsi_cfg = {
>>   	.num_dsi = 2,
>>   };
>>   
>> +const static struct msm_dsi_host_cfg_ops msm_dsi_v2_host_ops = {
>> +	.link_clk_enable = dsi_link_clk_enable_v2,
>> +	.link_clk_disable = dsi_link_clk_disable_v2,
>> +	.clk_init_ver = dsi_clk_init_v2,
>> +	.tx_buf_alloc = dsi_tx_buf_alloc_v2,
>> +	.tx_buf_get = dsi_tx_buf_get_v2,
>> +	.tx_buf_put = NULL,
>> +	.dma_base_get = dsi_dma_base_get_v2,
>> +	.calc_clk_rate = dsi_calc_clk_rate_v2,
>> +};
>> +
>> +const static struct msm_dsi_host_cfg_ops msm_dsi_6g_host_ops = {
>> +	.link_clk_enable = dsi_link_clk_enable_6g,
>> +	.link_clk_disable = dsi_link_clk_disable_6g,
>> +	.clk_init_ver = NULL,
>> +	.tx_buf_alloc = dsi_tx_buf_alloc_6g,
>> +	.tx_buf_get = dsi_tx_buf_get_6g,
>> +	.tx_buf_put = dsi_tx_buf_put_6g,
>> +	.dma_base_get = dsi_dma_base_get_6g,
>> +	.calc_clk_rate = dsi_calc_clk_rate_6g,
>> +};
>> +
>> +const static struct msm_dsi_host_cfg_ops msm_dsi_6g_v2_host_ops = {
>> +	.link_clk_enable = dsi_link_clk_enable_6g,
>> +	.link_clk_disable = dsi_link_clk_disable_6g,
>> +	.clk_init_ver = dsi_clk_init_6g_v2,
>> +	.tx_buf_alloc = dsi_tx_buf_alloc_6g,
>> +	.tx_buf_get = dsi_tx_buf_get_6g,
>> +	.tx_buf_put = dsi_tx_buf_put_6g,
>> +	.dma_base_get = dsi_dma_base_get_6g,
>> +	.calc_clk_rate = dsi_calc_clk_rate_6g,
>> +};
>> +
>>   static const struct msm_dsi_cfg_handler dsi_cfg_handlers[] = {
>> -	{MSM_DSI_VER_MAJOR_V2, MSM_DSI_V2_VER_MINOR_8064, &apq8064_dsi_cfg},
>> +	{MSM_DSI_VER_MAJOR_V2, MSM_DSI_V2_VER_MINOR_8064,
>> +		&apq8064_dsi_cfg, &msm_dsi_v2_host_ops},
>>   	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_0,
>> -						&msm8974_apq8084_dsi_cfg},
>> +		&msm8974_apq8084_dsi_cfg, &msm_dsi_6g_host_ops},
>>   	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_1,
>> -						&msm8974_apq8084_dsi_cfg},
>> +		&msm8974_apq8084_dsi_cfg, &msm_dsi_6g_host_ops},
>>   	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_1_1,
>> -						&msm8974_apq8084_dsi_cfg},
>> +		&msm8974_apq8084_dsi_cfg, &msm_dsi_6g_host_ops},
>>   	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_2,
>> -						&msm8974_apq8084_dsi_cfg},
>> -	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_3, &msm8994_dsi_cfg},
>> -	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_3_1, &msm8916_dsi_cfg},
>> -	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_4_1, &msm8996_dsi_cfg},
>> -	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_2_1, &sdm845_dsi_cfg},
>> +		&msm8974_apq8084_dsi_cfg, &msm_dsi_6g_host_ops},
>> +	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_3,
>> +		&msm8994_dsi_cfg, &msm_dsi_6g_host_ops},
>> +	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_3_1,
>> +		&msm8916_dsi_cfg, &msm_dsi_6g_host_ops},
>> +	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V1_4_1,
>> +		&msm8996_dsi_cfg, &msm_dsi_6g_host_ops},
>> +	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_2_1,
>> +		&sdm845_dsi_cfg, &msm_dsi_6g_v2_host_ops},
>>   };
>>   
>>   const struct msm_dsi_cfg_handler *msm_dsi_cfg_get(u32 major, u32 minor)
>> diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c
>> index 7a03a9489708..78ea4540f0ee 100644
>> --- a/drivers/gpu/drm/msm/dsi/dsi_host.c
>> +++ b/drivers/gpu/drm/msm/dsi/dsi_host.c
>> @@ -331,6 +331,54 @@ static int dsi_regulator_init(struct msm_dsi_host *msm_host)
>>   	return 0;
>>   }
>>   
>> +int dsi_clk_init_v2(struct msm_dsi_host *msm_host)
>> +{
>> +	struct platform_device *pdev = msm_host->pdev;
>> +	int ret = 0;
>> +
>> +	msm_host->src_clk = msm_clk_get(pdev, "src");
>> +
>> +	if (IS_ERR(msm_host->src_clk)) {
>> +		ret = PTR_ERR(msm_host->src_clk);
>> +		pr_err("%s: can't find src clock. ret=%d\n",
>> +			__func__, ret);
>> +		msm_host->src_clk = NULL;
>> +		return ret;
>> +	}
>> +
>> +	msm_host->esc_clk_src = clk_get_parent(msm_host->esc_clk);
>> +	if (!msm_host->esc_clk_src) {
>> +		ret = -ENODEV;
>> +		pr_err("%s: can't get esc clock parent. ret=%d\n",
>> +			__func__, ret);
>> +		return ret;
>> +	}
>> +
>> +	msm_host->dsi_clk_src = clk_get_parent(msm_host->src_clk);
>> +	if (!msm_host->dsi_clk_src) {
>> +		ret = -ENODEV;
>> +		pr_err("%s: can't get src clock parent. ret=%d\n",
>> +			__func__, ret);
>> +	}
>> +
>> +	return ret;
>> +}
>> +
>> +int dsi_clk_init_6g_v2(struct msm_dsi_host *msm_host)
>> +{
>> +	struct platform_device *pdev = msm_host->pdev;
>> +	int ret = 0;
>> +
>> +	msm_host->byte_intf_clk = msm_clk_get(pdev, "byte_intf");
>> +	if (IS_ERR(msm_host->byte_intf_clk)) {
>> +		ret = PTR_ERR(msm_host->byte_intf_clk);
>> +		pr_err("%s: can't find byte_intf clock. ret=%d\n",
>> +			__func__, ret);
>> +	}
>> +
>> +	return ret;
>> +}
>> +
>>   static int dsi_clk_init(struct msm_dsi_host *msm_host)
>>   {
>>   	struct platform_device *pdev = msm_host->pdev;
>> @@ -497,7 +545,7 @@ int msm_dsi_runtime_resume(struct device *dev)
>>   	return dsi_bus_clk_enable(msm_host);
>>   }
>>   
>> -static int dsi_link_clk_enable_6g(struct msm_dsi_host *msm_host)
>> +int dsi_link_clk_enable_6g(struct msm_dsi_host *msm_host)
>>   {
>>   	int ret;
>>   
>> @@ -565,7 +613,7 @@ static int dsi_link_clk_enable_6g(struct msm_dsi_host *msm_host)
>>   	return ret;
>>   }
>>   
>> -static int dsi_link_clk_enable_v2(struct msm_dsi_host *msm_host)
>> +int dsi_link_clk_enable_v2(struct msm_dsi_host *msm_host)
>>   {
>>   	int ret;
>>   
>> @@ -643,6 +691,23 @@ static int dsi_link_clk_enable(struct msm_dsi_host *msm_host)
>>   		return dsi_link_clk_enable_v2(msm_host);
>>   }
>>   
>> +void dsi_link_clk_disable_6g(struct msm_dsi_host *msm_host)
>> +{
>> +	clk_disable_unprepare(msm_host->esc_clk);
>> +	clk_disable_unprepare(msm_host->pixel_clk);
>> +	if (msm_host->byte_intf_clk)
>> +		clk_disable_unprepare(msm_host->byte_intf_clk);
>> +	clk_disable_unprepare(msm_host->byte_clk);
>> +}
>> +
>> +void dsi_link_clk_disable_v2(struct msm_dsi_host *msm_host)
>> +{
>> +	clk_disable_unprepare(msm_host->pixel_clk);
>> +	clk_disable_unprepare(msm_host->src_clk);
>> +	clk_disable_unprepare(msm_host->esc_clk);
>> +	clk_disable_unprepare(msm_host->byte_clk);
>> +}
>> +
>>   static void dsi_link_clk_disable(struct msm_dsi_host *msm_host)
>>   {
>>   	const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd;
>> @@ -661,6 +726,94 @@ static void dsi_link_clk_disable(struct msm_dsi_host *msm_host)
>>   	}
>>   }
>>   
>> +int dsi_calc_clk_rate_6g(struct msm_dsi_host *msm_host)
>> +{
>> +	struct drm_display_mode *mode = msm_host->mode;
>> +	u8 lanes = msm_host->lanes;
>> +	u32 bpp = dsi_get_bpp(msm_host->format);
>> +	u32 pclk_rate;
>> +
>> +	if (!mode) {
>> +		pr_err("%s: mode not set\n", __func__);
>> +		return -EINVAL;
>> +	}
> 
> As far as I can tell from patch 3/3 the calc_clk_rate() function hook is only
> called once and mode_host is guaranteed to be not null. I don't think this check
> is needed.

yes should work fine

> 
>> +	pclk_rate = mode->clock * 1000;
>> +	if (lanes > 0) {
>> +		msm_host->byte_clk_rate = (pclk_rate * bpp) / (8 * lanes);
>> +	} else {
>> +		pr_err("%s: forcing mdss_dsi lanes to 1\n", __func__);
>> +		msm_host->byte_clk_rate = (pclk_rate * bpp) / 8;
>> +	}
>> +
>> +	DBG("pclk=%d, bclk=%d", pclk_rate, msm_host->byte_clk_rate);
>> +
>> +	msm_host->esc_clk_rate = clk_get_rate(msm_host->esc_clk);
>> +
>> +	return 0;
>> +}
>> +
>> +int dsi_calc_clk_rate_v2(struct msm_dsi_host *msm_host)
>> +{
>> +	struct drm_display_mode *mode = msm_host->mode;
>> +	u8 lanes = msm_host->lanes;
>> +	u32 bpp = dsi_get_bpp(msm_host->format);
>> +	u32 pclk_rate;
>> +	unsigned int esc_mhz, esc_div;
>> +	unsigned long byte_mhz;
>> +
>> +	if (!mode) {
>> +		pr_err("%s: mode not set\n", __func__);
>> +		return -EINVAL;
>> +	}
>>
> Or this.
> 
>> +	pclk_rate = mode->clock * 1000;
>> +	if (lanes > 0) {
>> +		msm_host->byte_clk_rate = (pclk_rate * bpp) / (8 * lanes);
>> +	} else {
>> +		pr_err("%s: forcing mdss_dsi lanes to 1\n", __func__);
>> +		msm_host->byte_clk_rate = (pclk_rate * bpp) / 8;
>> +	}
>> +
>> +	DBG("pclk=%d, bclk=%d", pclk_rate, msm_host->byte_clk_rate);
>> +
>> +	msm_host->src_clk_rate = (pclk_rate * bpp) / 8;
>> +
>> +	/*
>> +	 * esc clock is byte clock followed by a 4 bit divider,
>> +	 * we need to find an escape clock frequency within the
>> +	 * mipi DSI spec range within the maximum divider limit
>> +	 * We iterate here between an escape clock frequencey
>> +	 * between 20 Mhz to 5 Mhz and pick up the first one
>> +	 * that can be supported by our divider
>> +	 */
>> +
>> +	byte_mhz = msm_host->byte_clk_rate / 1000000;
>> +
>> +	for (esc_mhz = 20; esc_mhz >= 5; esc_mhz--) {
>> +		esc_div = DIV_ROUND_UP(byte_mhz, esc_mhz);
>> +
>> +		/*
>> +		 * TODO: Ideally, we shouldn't know what sort of divider
>> +		 * is available in mmss_cc, we're just assuming that
>> +		 * it'll always be a 4 bit divider. Need to come up with
>> +		 * a better way here.
>> +		 */
>> +		if (esc_div >= 1 && esc_div <= 16)
>> +			break;
>> +	}
>> +
>> +	if (esc_mhz < 5)
>> +		return -EINVAL;
>> +
>> +	msm_host->esc_clk_rate = msm_host->byte_clk_rate / esc_div;
>> +
>> +	DBG("esc=%d, src=%d", msm_host->esc_clk_rate,
>> +		msm_host->src_clk_rate);
>> +
>> +	return 0;
>> +}
>> +
>>   static int dsi_calc_clk_rate(struct msm_dsi_host *msm_host)
>>   {
>>   	struct drm_display_mode *mode = msm_host->mode;
>> @@ -1008,6 +1161,49 @@ static void dsi_wait4video_eng_busy(struct msm_dsi_host *msm_host)
>>   	}
>>   }
>>   
>> +int dsi_tx_buf_alloc_6g(struct msm_dsi_host *msm_host, int size)
>> +{
>> +	struct drm_device *dev = msm_host->dev;
>> +	struct msm_drm_private *priv = dev->dev_private;
>> +	int ret;
>> +	uint64_t iova;
>> +
>> +	msm_host->tx_gem_obj = msm_gem_new(dev, size, MSM_BO_UNCACHED);
>> +	if (IS_ERR(msm_host->tx_gem_obj)) {
>> +		ret = PTR_ERR(msm_host->tx_gem_obj);
>> +		pr_err("%s: failed to allocate gem, %d\n",
>> +			__func__, ret);
>> +		msm_host->tx_gem_obj = NULL;
>> +		return ret;
>> +	}
>> +
>> +	ret = msm_gem_get_iova(msm_host->tx_gem_obj,
>> +			priv->kms->aspace, &iova);
>> +	mutex_unlock(&dev->struct_mutex);

Seems like stuct_mutex unlock wasn't removed when they migrated to the 
new msm_gem_new and msm_gem_get_iova from the previous lock based functions?

>> +	if (ret) {
>> +		pr_err("%s: failed to get iova, %d\n", __func__, ret);
>> +		return ret;
>> +	}
> 
> I'm not sure if you also need to vmap this at some point, but we have a handy
> helper function for in-kernel gem objects to automate a bit of this:
> 

we eventually do a msm_gem_get_vaddr so msm_gem_kernel_new seems
like a good fit which will also help to remove one additional helper
function :)

> void *msm_gem_kernel_new(struct drm_device *dev, uint32_t size,
>                  uint32_t flags, struct msm_gem_address_space *aspace,
> 		struct drm_gem_object **bo, uint64_t *iova);
> 
> Jordan
> 

-- 
Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc, is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2018-03-26 17:16 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-19 19:41 [PATCH v2 0/3] Cleanup excessive DSI host controller version checks Sibi S
2018-03-19 19:41 ` [PATCH v2 1/3] drm/msm/dsi: add dsi host helper functions support Sibi S
2018-03-19 19:41 ` [PATCH v2 2/3] drm/msm/dsi: add implementation for helper functions Sibi S
2018-03-19 20:23   ` Jordan Crouse
2018-03-26 17:16     ` Sibi S
2018-03-19 19:41 ` [PATCH v2 3/3] drm/msm/dsi: replace version checks with " Sibi S
2018-03-23 12:35 ` [PATCH v2 0/3] Cleanup excessive DSI host controller version checks Archit Taneja

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.