drm: add gem import interface to support drm-hwc [1/1]
authorAo Xu <ao.xu@amlogic.com>
Mon, 19 Aug 2019 03:04:39 +0000 (11:04 +0800)
committerTao Zeng <tao.zeng@amlogic.com>
Thu, 22 Aug 2019 09:18:50 +0000 (02:18 -0700)
PD#SWPL-11320

Problem:
current gem driver have not implementted the import interface.
For drm-hwc in android, gralloc allocate the dumb buffer, it
should use the import interface to import the allocated buffer
to the drm driver.

Solution:
implement the gem import interface

Verify:
g12a-u200

Change-Id: I32f7705fd67853a1000875b2af69fcaf700330e1
Signed-off-by: Ao Xu <ao.xu@amlogic.com>
drivers/amlogic/drm/meson_drv.c
drivers/amlogic/drm/meson_gem.c
drivers/amlogic/drm/meson_gem.h

index be96432e8fb32a7c1cd9cb3dfbb104f01545d64a..bfa68937374d2b822a10015a2d76c869d6ff4400 100644 (file)
@@ -176,7 +176,7 @@ static struct drm_driver meson_driver = {
         * If gem_prime_import_sg_table is NULL,only buffer created
         * by meson driver can be imported ok.
         */
-       /*.gem_prime_import_sg_table = am_meson_gem_prime_import_sg_table,*/
+       .gem_prime_import_sg_table = am_meson_gem_prime_import_sg_table,
 
        .gem_prime_vmap         = am_meson_gem_prime_vmap,
        .gem_prime_vunmap       = am_meson_gem_prime_vunmap,
index 051cfceef4491339319b125d7b112ddc9cfa9d18..4c6ef32a2098b962caa442ec25fd7a5cbba4eee0 100644 (file)
@@ -133,7 +133,7 @@ void am_meson_gem_object_free(struct drm_gem_object *obj)
        if (obj->import_attach == false)
                am_meson_gem_free_ion_buf(obj->dev, meson_gem_obj);
        else
-               DRM_ERROR("Not support import buffer from other driver.\n");
+               drm_prime_gem_destroy(obj, meson_gem_obj->sg);
 
        drm_gem_free_mmap_offset(obj);
 
@@ -219,9 +219,8 @@ int am_meson_gem_object_get_phyaddr(
        int addr;
        size_t len;
 
-       if (!meson_gem->handle) {
-               DRM_INFO("%s handle null\n", __func__);
-               return -1;
+       if (meson_gem->sg) {
+               return meson_gem->addr;
        }
 
        ion_phys(drm->gem_client, meson_gem->handle,
@@ -439,7 +438,8 @@ struct drm_gem_object *am_meson_gem_prime_import_sg_table(
        }
 
        DRM_DEBUG("%s: %p, sg_table %p\n", __func__, meson_gem_obj, sgt);
-       /*meson_gem_obj->sgt = sgt;*/
+       meson_gem_obj->sg = sgt;
+       meson_gem_obj->addr = sg_dma_address(sgt->sgl);
        return &meson_gem_obj->base;
 }
 
index 212a6aa90eca0e6f3979838e5bc960ac59aab0ed..c644112bd8fc1868c98fe1cb376ea546c5a74068 100644 (file)
@@ -30,6 +30,10 @@ struct am_meson_gem_object {
        /*for buffer create from ion heap */
        struct ion_handle *handle;
        bool bscatter;
+
+       /* for buffer import form other driver */
+       phys_addr_t addr;
+       struct sg_table *sg;
 };
 
 /* GEM MANAGER CREATE*/