summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSachin Bhayare <sachin.bhayare@codeaurora.org>2016-02-29 19:13:43 +0530
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-25 16:03:09 -0700
commit540e6e3089aaaf0beb855eac2914574b0f90fa04 (patch)
tree82bed6372ae8bd27f268ae520b17ceacc4a21c31
parent97ea6d4a5273f37e8c0bd851858de6f55029c313 (diff)
msm: mdss: map frame buffer in smmu for msm8909w pan display path
frame buffer allocated in recovery mode is not mapped for MDP3 pan display control path resulting in IOMMU fault. Add mdss_smmu_map_dma_buf call in mdp3_ctrl_pan_display and use mapped virtual address for DMA. Change-Id: I4d37ccb86eaea4690862bef76ee3762ff952892a Signed-off-by: Sachin Bhayare <sachin.bhayare@codeaurora.org>
-rw-r--r--drivers/video/fbdev/msm/mdp3_ctrl.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/drivers/video/fbdev/msm/mdp3_ctrl.c b/drivers/video/fbdev/msm/mdp3_ctrl.c
index fa12a98bc2d7..a7f5bb132f94 100644
--- a/drivers/video/fbdev/msm/mdp3_ctrl.c
+++ b/drivers/video/fbdev/msm/mdp3_ctrl.c
@@ -26,6 +26,7 @@
#include "mdp3_ctrl.h"
#include "mdp3.h"
#include "mdp3_ppp.h"
+#include "mdss_smmu.h"
#define VSYNC_EXPIRE_TICK 4
@@ -1155,6 +1156,33 @@ static int mdp3_ctrl_display_commit_kickoff(struct msm_fb_data_type *mfd,
return 0;
}
+static int mdp3_map_pan_buff_immediate(struct msm_fb_data_type *mfd)
+{
+ int rc = 0;
+ unsigned long length;
+ dma_addr_t addr;
+ int domain = mfd->mdp.fb_mem_get_iommu_domain();
+
+ rc = mdss_smmu_map_dma_buf(mfd->fbmem_buf, mfd->fb_table, domain,
+ &addr, &length, DMA_BIDIRECTIONAL);
+ if (IS_ERR_VALUE(rc))
+ goto err_unmap;
+ else
+ mfd->iova = addr;
+
+ pr_debug("%s : smmu map dma buf VA: (%llx) MFD->iova %llx\n",
+ __func__, (u64) addr, (u64) mfd->iova);
+ return rc;
+
+err_unmap:
+ pr_err("smmu map dma buf failed: (%d)\n", rc);
+ dma_buf_unmap_attachment(mfd->fb_attachment, mfd->fb_table,
+ mdss_smmu_dma_data_direction(DMA_BIDIRECTIONAL));
+ dma_buf_detach(mfd->fbmem_buf, mfd->fb_attachment);
+ dma_buf_put(mfd->fbmem_buf);
+ return rc;
+}
+
static void mdp3_ctrl_pan_display(struct msm_fb_data_type *mfd)
{
struct fb_info *fbi;
@@ -1208,6 +1236,11 @@ static void mdp3_ctrl_pan_display(struct msm_fb_data_type *mfd)
mdp3_ctrl_reset_countdown(mdp3_session, mfd);
mdp3_ctrl_notify(mdp3_session, MDP_NOTIFY_FRAME_BEGIN);
mdp3_ctrl_clk_enable(mfd, 1);
+ if (mdp3_session->first_commit) {
+ rc = mdp3_map_pan_buff_immediate(mfd);
+ if (IS_ERR_VALUE(rc))
+ goto pan_error;
+ }
rc = mdp3_session->dma->update(mdp3_session->dma,
(void *)(int)(mfd->iova + offset),
mdp3_session->intf, NULL);