fbdev: msm: Changes for mapping once during dsi on
SMMU buffer mapping/unmapping is done at DSI ON/OFF
instead of doing it during mdss_dsi_cmd_dma_tx to
avoid smmu page faults and NOC errors.
Change-Id: Ie8a80b3076f58eb5918630e603430c4871d6d24f
Signed-off-by: Rashi Bindra <rbindra@codeaurora.org>
Signed-off-by: raghavendra ambadas <rambad@codeaurora.org>
diff --git a/drivers/video/fbdev/msm/mdss_dsi.c b/drivers/video/fbdev/msm/mdss_dsi.c
index 1164e6f..234a903 100644
--- a/drivers/video/fbdev/msm/mdss_dsi.c
+++ b/drivers/video/fbdev/msm/mdss_dsi.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2019, 2021, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -35,6 +35,7 @@
#include "mdss_debug.h"
#include "mdss_dsi_phy.h"
#include "mdss_dba_utils.h"
+#include "mdss_smmu.h"
#define XO_CLK_RATE 19200000
#define CMDLINE_DSI_CTL_NUM_STRING_LEN 2
@@ -1338,6 +1339,8 @@
int ret = 0;
struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
struct mdss_panel_info *panel_info = NULL;
+ struct platform_device *pdev;
+ struct dsi_buf *tp;
if (pdata == NULL) {
pr_err("%s: Invalid input data\n", __func__);
@@ -1349,6 +1352,16 @@
panel_info = &ctrl_pdata->panel_data.panel_info;
+ pdev = mdss_res->pdev;
+ tp = &ctrl_pdata->tx_buf;
+ mdss_smmu_dma_free_coherent(&pdev->dev, SZ_4K, tp->start, tp->dmap,
+ ctrl_pdata->dma_addr, MDSS_IOMMU_DOMAIN_UNSECURE);
+ tp->end = NULL;
+ tp->size = 0;
+ ctrl_pdata->dma_addr = 0;
+ tp->start = NULL;
+ tp->dmap = 0;
+
pr_debug("%s+: ctrl=%pK ndx=%d power_state=%d\n",
__func__, ctrl_pdata, ctrl_pdata->ndx, power_state);
@@ -1517,6 +1530,8 @@
struct mipi_panel_info *mipi;
struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
int cur_power_state;
+ struct platform_device *pdev;
+ struct dsi_buf *tp;
if (pdata == NULL) {
pr_err("%s: Invalid input data\n", __func__);
@@ -1526,6 +1541,20 @@
ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
panel_data);
+ pdev = mdss_res->pdev;
+ tp = &ctrl_pdata->tx_buf;
+ if (!ctrl_pdata->mdss_util->iommu_attached())
+ pr_err("%s : iommu not attached\n", __func__);
+
+ ret = mdss_smmu_dma_alloc_coherent(&pdev->dev, SZ_4K, &tp->dmap,
+ &ctrl_pdata->dma_addr, (void *)&tp->start, GFP_KERNEL,
+ MDSS_IOMMU_DOMAIN_UNSECURE);
+ if (IS_ERR_VALUE((unsigned long)ret))
+ pr_err("%s : mdss_smmu_dma_alloc_coherent failed\n", __func__);
+
+ tp->end = tp->start + SZ_4K;
+ tp->size = SZ_4K;
+
if (ctrl_pdata->debugfs_info)
mdss_dsi_validate_debugfs_info(ctrl_pdata);
diff --git a/drivers/video/fbdev/msm/mdss_dsi_host.c b/drivers/video/fbdev/msm/mdss_dsi_host.c
index 25a2600..14f14ec 100644
--- a/drivers/video/fbdev/msm/mdss_dsi_host.c
+++ b/drivers/video/fbdev/msm/mdss_dsi_host.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2018, 2021, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -121,7 +121,6 @@
mutex_init(&ctrl->cmd_mutex);
mutex_init(&ctrl->clk_lane_mutex);
mutex_init(&ctrl->cmdlist_mutex);
- mdss_dsi_buf_alloc(ctrl_dev, &ctrl->tx_buf, SZ_4K);
mdss_dsi_buf_alloc(ctrl_dev, &ctrl->rx_buf, SZ_4K);
mdss_dsi_buf_alloc(ctrl_dev, &ctrl->status_buf, SZ_4K);
ctrl->cmdlist_commit = mdss_dsi_cmdlist_commit;
@@ -2145,7 +2144,6 @@
struct dsi_buf *tp)
{
int len, ret = 0;
- int domain = MDSS_IOMMU_DOMAIN_UNSECURE;
char *bp;
struct mdss_dsi_ctrl_pdata *mctrl = NULL;
int ignored = 0; /* overflow ignored */
@@ -2155,20 +2153,6 @@
len = ALIGN(tp->len, 4);
ctrl->dma_size = ALIGN(tp->len, SZ_4K);
- ctrl->mdss_util->iommu_lock();
- if (ctrl->mdss_util->iommu_attached()) {
- ret = mdss_smmu_dsi_map_buffer(tp->dmap, domain, ctrl->dma_size,
- &(ctrl->dma_addr), tp->start, DMA_TO_DEVICE);
- if (IS_ERR_VALUE((unsigned long)ret)) {
- pr_err("unable to map dma memory to iommu(%d)\n", ret);
- ctrl->mdss_util->iommu_unlock();
- return -ENOMEM;
- }
- ctrl->dmap_iommu_map = true;
- } else {
- ctrl->dma_addr = tp->dmap;
- }
-
reinit_completion(&ctrl->dma_comp);
if (ctrl->panel_mode == DSI_VIDEO_MODE)
@@ -2177,7 +2161,7 @@
if (mdss_dsi_sync_wait_trigger(ctrl)) {
/* broadcast same cmd to other panel */
mctrl = mdss_dsi_get_other_ctrl(ctrl);
- if (mctrl && mctrl->dma_addr == 0) {
+ if (mctrl) {
if (ignored) {
/* mask out overflow isr */
mdss_dsi_set_reg(mctrl, 0x10c,
@@ -2229,6 +2213,7 @@
pr_warn("%s: dma tx done but irq not triggered\n",
__func__);
} else {
+ MDSS_XLOG(0x909, status);
ret = -ETIMEDOUT;
}
}
@@ -2245,19 +2230,6 @@
if (!(data & BIT(5)))
mdss_dsi_set_reg(mctrl, 0x10c, 0x0f0000, 0);
}
- if (mctrl->dmap_iommu_map) {
- mdss_smmu_dsi_unmap_buffer(mctrl->dma_addr, domain,
- mctrl->dma_size, DMA_TO_DEVICE);
- mctrl->dmap_iommu_map = false;
- }
- mctrl->dma_addr = 0;
- mctrl->dma_size = 0;
- }
-
- if (ctrl->dmap_iommu_map) {
- mdss_smmu_dsi_unmap_buffer(ctrl->dma_addr, domain,
- ctrl->dma_size, DMA_TO_DEVICE);
- ctrl->dmap_iommu_map = false;
}
if (ignored) {
@@ -2268,10 +2240,9 @@
if (!(data & BIT(5)))
mdss_dsi_set_reg(ctrl, 0x10c, 0x0f0000, 0);
}
- ctrl->dma_addr = 0;
- ctrl->dma_size = 0;
+ MDSS_XLOG(ret);
+
end:
- ctrl->mdss_util->iommu_unlock();
return ret;
}
diff --git a/drivers/video/fbdev/msm/mdss_mdp_intf_video.c b/drivers/video/fbdev/msm/mdss_mdp_intf_video.c
index ed98df6..d9fa4e9 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_intf_video.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_intf_video.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2018, 2021, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -1499,6 +1499,11 @@
MDSS_XLOG(ctl->num, ctl->underrun_cnt);
if (!ctx->timegen_en) {
+ rc = mdss_iommu_ctrl(1);
+ if (IS_ERR_VALUE((unsigned long)rc)) {
+ pr_err("IOMMU attach failed\n");
+ return rc;
+ }
rc = mdss_mdp_ctl_intf_event(ctl, MDSS_EVENT_LINK_READY, NULL,
CTL_INTF_EVENT_FLAG_DEFAULT);
if (rc) {
@@ -1521,12 +1526,6 @@
usecs_to_jiffies(VSYNC_TIMEOUT_US));
}
- rc = mdss_iommu_ctrl(1);
- if (IS_ERR_VALUE((unsigned long)rc)) {
- pr_err("IOMMU attach failed\n");
- return rc;
- }
-
mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON);
mdss_mdp_irq_enable(MDSS_MDP_IRQ_TYPE_INTF_UNDER_RUN,