aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGowtham Tammana2017-02-17 10:50:40 -0600
committerPraneeth Bajjuri2017-02-21 10:54:12 -0600
commit862436d35b0d5d88167c4abb6cf8746f6274f3ce (patch)
tree0df3a3b046e11b310b36ab60902a3485a41dab69
parent37467f45993e1b7aae88a51c91a539950c48257c (diff)
downloadkernel-omap-862436d35b0d5d88167c4abb6cf8746f6274f3ce.tar.gz
kernel-omap-862436d35b0d5d88167c4abb6cf8746f6274f3ce.tar.xz
kernel-omap-862436d35b0d5d88167c4abb6cf8746f6274f3ce.zip
omapdrm: Decrement tiler refcount only if pinned
Ability to import a dmabuf with sg list of page table entries was enabled After commit 991709bacfdc ("omapdrm: Pin pages to TILER-1D only on SCANOUT flag") For corresponding unmap requests don't decrement tiler pin refcount. JIRA: ANDSDK-1541 Change-Id: I2792303d73e0b31bd08e308d35d9dcce782875d0 Signed-off-by: Gowtham Tammana <g-tammana@ti.com>
-rw-r--r--drivers/gpu/drm/omapdrm/omap_drv.h1
-rw-r--r--drivers/gpu/drm/omapdrm/omap_gem.c21
-rw-r--r--drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c19
3 files changed, 28 insertions, 13 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
index 5c516d2ee8f3..de5e8add5590 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.h
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
@@ -244,6 +244,7 @@ int omap_gem_get_pages(struct drm_gem_object *obj, struct page ***pages,
244 bool remap); 244 bool remap);
245int omap_gem_put_pages(struct drm_gem_object *obj); 245int omap_gem_put_pages(struct drm_gem_object *obj);
246struct sg_table *omap_gem_get_sgt(struct drm_gem_object *obj); 246struct sg_table *omap_gem_get_sgt(struct drm_gem_object *obj);
247void omap_gem_put_sgt(struct drm_gem_object *obj, struct sg_table *sg);
247uint32_t omap_gem_flags(struct drm_gem_object *obj); 248uint32_t omap_gem_flags(struct drm_gem_object *obj);
248int omap_gem_rotated_paddr(struct drm_gem_object *obj, uint32_t orient, 249int omap_gem_rotated_paddr(struct drm_gem_object *obj, uint32_t orient,
249 int x, int y, dma_addr_t *paddr); 250 int x, int y, dma_addr_t *paddr);
diff --git a/drivers/gpu/drm/omapdrm/omap_gem.c b/drivers/gpu/drm/omapdrm/omap_gem.c
index 122f856bb041..3e805836e069 100644
--- a/drivers/gpu/drm/omapdrm/omap_gem.c
+++ b/drivers/gpu/drm/omapdrm/omap_gem.c
@@ -811,7 +811,14 @@ struct sg_table *omap_gem_get_sgt(struct drm_gem_object *obj)
811{ 811{
812 struct omap_gem_object *omap_obj = to_omap_bo(obj); 812 struct omap_gem_object *omap_obj = to_omap_bo(obj);
813 struct sg_table *sg; 813 struct sg_table *sg;
814 int npages = obj->size >> PAGE_SHIFT; 814 dma_addr_t paddr;
815 int ret;
816 bool remap;
817
818 remap = omap_obj->flags & OMAP_BO_SCANOUT;
819 ret = omap_gem_get_paddr(obj, &paddr, remap);
820 if (ret)
821 goto out;
815 822
816 sg = kmalloc(sizeof(*sg), GFP_KERNEL); 823 sg = kmalloc(sizeof(*sg), GFP_KERNEL);
817 if (!sg) 824 if (!sg)
@@ -829,6 +836,7 @@ struct sg_table *omap_gem_get_sgt(struct drm_gem_object *obj)
829 } else if (omap_obj->pages) { 836 } else if (omap_obj->pages) {
830 struct scatterlist *sgl; 837 struct scatterlist *sgl;
831 unsigned int i = 0; 838 unsigned int i = 0;
839 int npages = obj->size >> PAGE_SHIFT;
832 840
833 if (sg_alloc_table(sg, npages, GFP_KERNEL)) 841 if (sg_alloc_table(sg, npages, GFP_KERNEL))
834 goto free; 842 goto free;
@@ -844,12 +852,23 @@ struct sg_table *omap_gem_get_sgt(struct drm_gem_object *obj)
844 } 852 }
845 return sg; 853 return sg;
846 854
855out:
856 return ERR_PTR(ret);
847free: 857free:
848 sg_free_table(sg); 858 sg_free_table(sg);
849 kfree(sg); 859 kfree(sg);
850 return NULL; 860 return NULL;
851} 861}
852 862
863void omap_gem_put_sgt(struct drm_gem_object *obj, struct sg_table *sg)
864{
865 struct omap_gem_object *omap_obj = to_omap_bo(obj);
866 bool remap = omap_obj->flags & OMAP_BO_SCANOUT;
867
868 if (remap)
869 omap_gem_put_paddr(obj);
870}
871
853/* Get physical address for DMA.. if 'remap' is true, and the buffer is not 872/* Get physical address for DMA.. if 'remap' is true, and the buffer is not
854 * already contiguous, remap it to pin in physically contiguous memory.. (ie. 873 * already contiguous, remap it to pin in physically contiguous memory.. (ie.
855 * map in TILER) 874 * map in TILER)
diff --git a/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c b/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c
index f53bbc50e382..f418a7d07205 100644
--- a/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c
+++ b/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c
@@ -30,29 +30,24 @@ static struct sg_table *omap_gem_map_dma_buf(
30 enum dma_data_direction dir) 30 enum dma_data_direction dir)
31{ 31{
32 struct drm_gem_object *obj = attachment->dmabuf->priv; 32 struct drm_gem_object *obj = attachment->dmabuf->priv;
33 dma_addr_t paddr; 33 struct sg_table *sg;
34 int ret;
35 34
36 /* camera, etc, need physically contiguous.. but we need a 35 sg = omap_gem_get_sgt(obj);
37 * better way to know this.. 36 if (IS_ERR(sg))
38 */ 37 return sg;
39 ret = omap_gem_get_paddr(obj, &paddr, false);
40 if (ret)
41 goto out;
42 38
43 /* this should be after _get_paddr() to ensure we have pages attached */ 39 /* this should be after _get_paddr() to ensure we have pages attached */
44 omap_gem_dma_sync(obj, dir); 40 omap_gem_dma_sync(obj, dir);
45 41
46 return omap_gem_get_sgt(obj); 42 return sg;
47out:
48 return ERR_PTR(ret);
49} 43}
50 44
51static void omap_gem_unmap_dma_buf(struct dma_buf_attachment *attachment, 45static void omap_gem_unmap_dma_buf(struct dma_buf_attachment *attachment,
52 struct sg_table *sg, enum dma_data_direction dir) 46 struct sg_table *sg, enum dma_data_direction dir)
53{ 47{
54 struct drm_gem_object *obj = attachment->dmabuf->priv; 48 struct drm_gem_object *obj = attachment->dmabuf->priv;
55 omap_gem_put_paddr(obj); 49
50 omap_gem_put_sgt(obj, sg);
56 sg_free_table(sg); 51 sg_free_table(sg);
57 kfree(sg); 52 kfree(sg);
58} 53}