summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVeera Sundaram Sankaran <veeras@codeaurora.org>2015-06-19 16:35:58 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:43:26 -0700
commit56f473ee353d0b0483de1d6619d67c410d64ea66 (patch)
treeaae41a252eb8616d03512701298ba45f8dec1cf3
parent9040e63de821bea9a8b1085c07bdd2c8767de073 (diff)
msm: mdss: fix smmu buffer mapping in recovery mode
When booting up in recovery mode, mmap is called without iommu attach. This would result in device panic as iommu fails when buffer mapping is done without attaching the respective iommu domain. Fix the issue by delaying the mapping to a later point, during the commit. Change-Id: Idbe4f6ca5557774b5add56c064ea6b05a67d530f Signed-off-by: Veera Sundaram Sankaran <veeras@codeaurora.org>
-rw-r--r--drivers/video/fbdev/msm/mdss_fb.c18
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp.h1
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_overlay.c22
-rw-r--r--drivers/video/fbdev/msm/mdss_mdp_util.c14
4 files changed, 19 insertions, 36 deletions
diff --git a/drivers/video/fbdev/msm/mdss_fb.c b/drivers/video/fbdev/msm/mdss_fb.c
index b6f83a9fa1a4..d90bef3b0739 100644
--- a/drivers/video/fbdev/msm/mdss_fb.c
+++ b/drivers/video/fbdev/msm/mdss_fb.c
@@ -1670,9 +1670,6 @@ void mdss_fb_free_fb_ion_memory(struct msm_fb_data_type *mfd)
ion_unmap_kernel(mfd->fb_ion_client, mfd->fb_ion_handle);
if (mfd->mdp.fb_mem_get_iommu_domain) {
- mdss_smmu_unmap_dma_buf(mfd->fb_table,
- mfd->mdp.fb_mem_get_iommu_domain(),
- DMA_BIDIRECTIONAL, mfd->fbmem_buf);
dma_buf_unmap_attachment(mfd->fb_attachment, mfd->fb_table,
DMA_BIDIRECTIONAL);
dma_buf_detach(mfd->fbmem_buf, mfd->fb_attachment);
@@ -1685,7 +1682,6 @@ void mdss_fb_free_fb_ion_memory(struct msm_fb_data_type *mfd)
int mdss_fb_alloc_fb_ion_memory(struct msm_fb_data_type *mfd, size_t fb_size)
{
- unsigned long buf_size;
int rc;
void *vaddr;
int domain;
@@ -1735,14 +1731,6 @@ int mdss_fb_alloc_fb_ion_memory(struct msm_fb_data_type *mfd, size_t fb_size)
rc = PTR_ERR(mfd->fb_table);
goto err_detach;
}
-
- rc = mdss_smmu_map_dma_buf(mfd->fbmem_buf, mfd->fb_table,
- domain, &mfd->iova, &buf_size,
- DMA_BIDIRECTIONAL);
- if (rc) {
- pr_err("Cannot map fb_mem to IOMMU. rc=%d\n", rc);
- goto err_unmap;
- }
} else {
pr_err("No IOMMU Domain\n");
rc = -EINVAL;
@@ -1755,12 +1743,10 @@ int mdss_fb_alloc_fb_ion_memory(struct msm_fb_data_type *mfd, size_t fb_size)
rc = PTR_ERR(vaddr);
goto err_unmap;
}
-
- pr_debug("alloc 0x%zuB vaddr = %p (%pa iova) for fb%d\n", fb_size,
- vaddr, &mfd->iova, mfd->index);
+ pr_debug("alloc 0x%zuB vaddr = %p for fb%d\n", fb_size,
+ vaddr, mfd->index);
mfd->fbi->screen_base = (char *) vaddr;
- mfd->fbi->fix.smem_start = (unsigned int) mfd->iova;
mfd->fbi->fix.smem_len = fb_size;
return rc;
diff --git a/drivers/video/fbdev/msm/mdss_mdp.h b/drivers/video/fbdev/msm/mdss_mdp.h
index e4dbea3bf4a0..9f34abbab7c5 100644
--- a/drivers/video/fbdev/msm/mdss_mdp.h
+++ b/drivers/video/fbdev/msm/mdss_mdp.h
@@ -384,6 +384,7 @@ struct mdss_mdp_img_data {
u32 offset;
u32 flags;
bool mapped;
+ bool skip_detach;
struct fd srcp_f;
struct dma_buf *srcp_dma_buf;
struct dma_buf_attachment *srcp_attachment;
diff --git a/drivers/video/fbdev/msm/mdss_mdp_overlay.c b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
index a6aea1023128..0c6c84050dbc 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_overlay.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_overlay.c
@@ -2323,7 +2323,7 @@ static void mdss_mdp_overlay_pan_display(struct msm_fb_data_type *mfd)
if (!mdp5_data || !mdp5_data->ctl)
return;
- if (!fbi->fix.smem_start || fbi->fix.smem_len == 0 ||
+ if (fbi->fix.smem_len == 0 ||
mdp5_data->borderfill_enable) {
mfd->mdp.kickoff_fnc(mfd, NULL);
return;
@@ -2382,19 +2382,13 @@ static void mdss_mdp_overlay_pan_display(struct msm_fb_data_type *mfd)
goto pan_display_error;
}
- if (mdata->mdss_util->iommu_attached()) {
- if (!mfd->iova) {
- pr_err("mfd iova is zero\n");
- mdss_mdp_pipe_unmap(pipe);
- goto pan_display_error;
- }
- buf_l->p[0].addr = mfd->iova;
- } else {
- buf_l->p[0].addr = fbi->fix.smem_start;
- }
-
- buf_l->p[0].addr += offset;
- buf_l->p[0].len = fbi->fix.smem_len - offset;
+ buf_l->p[0].srcp_table = mfd->fb_table;
+ buf_l->p[0].srcp_dma_buf = mfd->fbmem_buf;
+ buf_l->p[0].len = 0;
+ buf_l->p[0].addr = 0;
+ buf_l->p[0].offset = offset;
+ buf_l->p[0].skip_detach = true;
+ buf_l->p[0].mapped = false;
buf_l->num_planes = 1;
mdss_mdp_pipe_unmap(pipe);
diff --git a/drivers/video/fbdev/msm/mdss_mdp_util.c b/drivers/video/fbdev/msm/mdss_mdp_util.c
index 6012053c9818..3a6d75008c6d 100644
--- a/drivers/video/fbdev/msm/mdss_mdp_util.c
+++ b/drivers/video/fbdev/msm/mdss_mdp_util.c
@@ -836,12 +836,14 @@ static int mdss_mdp_put_img(struct mdss_mdp_img_data *data, bool rotator,
data->srcp_dma_buf);
data->mapped = false;
}
- dma_buf_unmap_attachment(data->srcp_attachment,
- data->srcp_table, dir);
- dma_buf_detach(data->srcp_dma_buf,
- data->srcp_attachment);
- dma_buf_put(data->srcp_dma_buf);
- data->srcp_dma_buf = NULL;
+ if (!data->skip_detach) {
+ dma_buf_unmap_attachment(data->srcp_attachment,
+ data->srcp_table, dir);
+ dma_buf_detach(data->srcp_dma_buf,
+ data->srcp_attachment);
+ dma_buf_put(data->srcp_dma_buf);
+ data->srcp_dma_buf = NULL;
+ }
}
} else {