diff options
| author | Sachin Bhayare <sachin.bhayare@codeaurora.org> | 2016-02-29 19:13:43 +0530 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-25 16:03:09 -0700 |
| commit | 540e6e3089aaaf0beb855eac2914574b0f90fa04 (patch) | |
| tree | 82bed6372ae8bd27f268ae520b17ceacc4a21c31 | |
| parent | 97ea6d4a5273f37e8c0bd851858de6f55029c313 (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.c | 33 |
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); |
