diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c index c0b9cac65a40af42ef1cbabe9d293eb3a6339c6c..525bb979e657ed3311193a2557548b2da2094328 100644 --- a/drivers/gpu/drm/panfrost/panfrost_drv.c +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c @@ -264,7 +264,7 @@ static struct drm_driver panfrost_drm_driver = { .gem_create_object = panfrost_gem_create_object, .prime_handle_to_fd = drm_gem_prime_handle_to_fd, .prime_fd_to_handle = drm_gem_prime_fd_to_handle, - .gem_prime_import_sg_table = drm_gem_shmem_prime_import_sg_table, + .gem_prime_import_sg_table = panfrost_gem_prime_import_sg_table, .gem_prime_mmap = drm_gem_prime_mmap, }; diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.c b/drivers/gpu/drm/panfrost/panfrost_gem.c index 3b208173e656aa2c992ecca9b979173d55e18993..6ca69a4966f89e5adabc374baba83594481d7656 100644 --- a/drivers/gpu/drm/panfrost/panfrost_gem.c +++ b/drivers/gpu/drm/panfrost/panfrost_gem.c @@ -36,10 +36,11 @@ void panfrost_gem_free_object(struct drm_gem_object *obj) struct panfrost_gem_object *bo = to_panfrost_bo(obj); struct panfrost_device *pfdev = obj->dev->dev_private; - drm_gem_shmem_put_pages(&bo->base); panfrost_mmu_unmap(bo); - //panfrost_mmu_remove_ptes(bo); + if (!obj->import_attach) + drm_gem_shmem_put_pages(&bo->base); + spin_lock(&pfdev->mm_lock); drm_mm_remove_node(&bo->node); spin_unlock(&pfdev->mm_lock); @@ -92,6 +93,20 @@ struct drm_gem_object *panfrost_gem_create_object(struct drm_device *dev, size_t return ERR_PTR(ret); } +struct drm_gem_object * +panfrost_gem_prime_import_sg_table(struct drm_device *dev, + struct dma_buf_attachment *attach, + struct sg_table *sgt) +{ + struct drm_gem_object *obj; + + obj = drm_gem_shmem_prime_import_sg_table(dev, attach, sgt); + + panfrost_mmu_map(to_panfrost_bo(obj)); + + return obj; +} + int panfrost_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *timeout) { bool write = !!(op & ETNA_PREP_WRITE); diff --git a/drivers/gpu/drm/panfrost/panfrost_gem.h b/drivers/gpu/drm/panfrost/panfrost_gem.h index 6ea0d12fe24ae903d3f0be7654ffd5423f078e53..e90a39a060b5323459bec75c9627d0c043b03350 100644 --- a/drivers/gpu/drm/panfrost/panfrost_gem.h +++ b/drivers/gpu/drm/panfrost/panfrost_gem.h @@ -80,6 +80,11 @@ struct panfrost_gem_submit { struct drm_gem_object *panfrost_gem_create_object(struct drm_device *dev, size_t size); +struct drm_gem_object * +panfrost_gem_prime_import_sg_table(struct drm_device *dev, + struct dma_buf_attachment *attach, + struct sg_table *sgt); + void panfrost_submit_put(struct panfrost_gem_submit * submit); int panfrost_gem_wait_bo(struct panfrost_gpu *gpu, struct drm_gem_object *obj,