aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2018-11-08 07:10:43 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2018-11-08 07:10:45 -0800
commit8348f04016aa52adbfd7955036a85803db781ce9 (patch)
treec05533382d2c0fbb087ea0a9885890b109fcdec2
parentf49d94fc9bf014c48227222ea54096d180ca1f75 (diff)
parent42564fd9b535ab1bdbac1303556c1c71ada0dffc (diff)
Merge "drm/msm: avoid memory allocation when sg table is imported" into kernel.lnx.4.9.r18-relLA.UM.6.8.r3-02600-SDM710.0
-rw-r--r--drivers/gpu/drm/msm/msm_gem.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c
index d9aad883dda3..f216c15f7933 100644
--- a/drivers/gpu/drm/msm/msm_gem.c
+++ b/drivers/gpu/drm/msm/msm_gem.c
@@ -80,6 +80,9 @@ static struct page **get_pages(struct drm_gem_object *obj)
{
struct msm_gem_object *msm_obj = to_msm_bo(obj);
+ if (obj->import_attach)
+ return msm_obj->pages;
+
if (!msm_obj->pages) {
struct drm_device *dev = obj->dev;
struct page **p;
@@ -567,8 +570,13 @@ void *msm_gem_get_vaddr_locked(struct drm_gem_object *obj)
struct page **pages = get_pages(obj);
if (IS_ERR(pages))
return ERR_CAST(pages);
- msm_obj->vaddr = vmap(pages, obj->size >> PAGE_SHIFT,
+ if (obj->import_attach)
+ msm_obj->vaddr = dma_buf_vmap(
+ obj->import_attach->dmabuf);
+ else
+ msm_obj->vaddr = vmap(pages, obj->size >> PAGE_SHIFT,
VM_MAP, pgprot_writecombine(PAGE_KERNEL));
+
if (msm_obj->vaddr == NULL)
return ERR_PTR(-ENOMEM);
}
@@ -654,7 +662,11 @@ void msm_gem_vunmap(struct drm_gem_object *obj)
if (!msm_obj->vaddr || WARN_ON(!is_vunmapable(msm_obj)))
return;
- vunmap(msm_obj->vaddr);
+ if (obj->import_attach)
+ dma_buf_vunmap(obj->import_attach->dmabuf, msm_obj->vaddr);
+ else
+ vunmap(msm_obj->vaddr);
+
msm_obj->vaddr = NULL;
}
@@ -1006,7 +1018,7 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev,
struct msm_gem_object *msm_obj;
struct drm_gem_object *obj = NULL;
uint32_t size;
- int ret, npages;
+ int ret;
/* if we don't have IOMMU, don't bother pretending we can import: */
if (!iommu_present(&platform_bus_type)) {
@@ -1027,19 +1039,9 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev,
drm_gem_private_object_init(dev, obj, size);
- npages = size / PAGE_SIZE;
-
msm_obj = to_msm_bo(obj);
msm_obj->sgt = sgt;
- msm_obj->pages = drm_malloc_ab(npages, sizeof(struct page *));
- if (!msm_obj->pages) {
- ret = -ENOMEM;
- goto fail;
- }
-
- ret = drm_prime_sg_to_page_addr_arrays(sgt, msm_obj->pages, NULL, npages);
- if (ret)
- goto fail;
+ msm_obj->pages = NULL;
return obj;