diff options
author | Gowtham Tammana | 2017-02-17 10:50:40 -0600 |
---|---|---|
committer | Praneeth Bajjuri | 2017-02-21 10:54:12 -0600 |
commit | 862436d35b0d5d88167c4abb6cf8746f6274f3ce (patch) | |
tree | 0df3a3b046e11b310b36ab60902a3485a41dab69 | |
parent | 37467f45993e1b7aae88a51c91a539950c48257c (diff) | |
download | kernel-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.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_gem.c | 21 | ||||
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c | 19 |
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); |
245 | int omap_gem_put_pages(struct drm_gem_object *obj); | 245 | int omap_gem_put_pages(struct drm_gem_object *obj); |
246 | struct sg_table *omap_gem_get_sgt(struct drm_gem_object *obj); | 246 | struct sg_table *omap_gem_get_sgt(struct drm_gem_object *obj); |
247 | void omap_gem_put_sgt(struct drm_gem_object *obj, struct sg_table *sg); | ||
247 | uint32_t omap_gem_flags(struct drm_gem_object *obj); | 248 | uint32_t omap_gem_flags(struct drm_gem_object *obj); |
248 | int omap_gem_rotated_paddr(struct drm_gem_object *obj, uint32_t orient, | 249 | int 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 | ||
855 | out: | ||
856 | return ERR_PTR(ret); | ||
847 | free: | 857 | free: |
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 | ||
863 | void 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; |
47 | out: | ||
48 | return ERR_PTR(ret); | ||
49 | } | 43 | } |
50 | 44 | ||
51 | static void omap_gem_unmap_dma_buf(struct dma_buf_attachment *attachment, | 45 | static 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 | } |