From f26aeace6701e1a7a508cd61388f14470c15e1d3 Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Wed, 21 Jul 2021 11:32:12 +0800 Subject: [PATCH] Revert "drm/rockchip: gem: fix dma_free_attrs() parameter error" This reverts commit 42256c1a8f6b612aeee9b456fe605ef3570dd6ae will lead to DMA buffer + IOMMU free buffer error: when we use DMA continue buffer, we have the following two use case: case 1: DMA + IOMMU, we have two addr alloc: dma_handle = dma_alloc_attrs() dma_addr = rockchip_gem_iommu_map() --> config to vop register free: rockchip_gem_iommu_unmap(dma_addr) dma_free_attrs(dma_handle) case 2: DMA + no IOMMU, we have one addr alloc: dma_handle = dma_alloc_attrs() dma_addr = dma_handle --> config to vop register free: dma_free_attrs(dma_handle) After convert this commit, we still fix the dma_free_attrs() parameter error at rockchip_gem_alloc_dma(), detail: ... dma_free_attrs(drm->dev, obj->size, rk_obj->kvaddr, old: rk_obj->dma_addr, rk_obj->dma_attrs); new: rk_obj->dma_handle, rk_obj->dma_attrs); ... Change-Id: I3c05d632b42e09b082d7e378dc7510548a794727 Signed-off-by: Sandy Huang --- drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 15 ++++++++------- drivers/gpu/drm/rockchip/rockchip_drm_gem.h | 3 ++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c index 01fb23a4ed87..f0850bf319c6 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c @@ -258,7 +258,7 @@ static int rockchip_gem_alloc_dma(struct rockchip_gem_object *rk_obj, rk_obj->dma_attrs |= DMA_ATTR_NO_KERNEL_MAPPING; rk_obj->kvaddr = dma_alloc_attrs(drm->dev, obj->size, - &rk_obj->dma_addr, GFP_KERNEL, + &rk_obj->dma_handle, GFP_KERNEL, rk_obj->dma_attrs); if (!rk_obj->kvaddr) { DRM_ERROR("failed to allocate %zu byte dma buffer", obj->size); @@ -272,7 +272,7 @@ static int rockchip_gem_alloc_dma(struct rockchip_gem_object *rk_obj, } ret = dma_get_sgtable_attrs(drm->dev, sgt, rk_obj->kvaddr, - rk_obj->dma_addr, obj->size, + rk_obj->dma_handle, obj->size, rk_obj->dma_attrs); if (ret) { DRM_ERROR("failed to allocate sgt, %d\n", ret); @@ -310,7 +310,7 @@ err_sgt_free: kfree(sgt); err_dma_free: dma_free_attrs(drm->dev, obj->size, rk_obj->kvaddr, - rk_obj->dma_addr, rk_obj->dma_attrs); + rk_obj->dma_handle, rk_obj->dma_attrs); return ret; } @@ -352,7 +352,7 @@ static int rockchip_gem_alloc_secure(struct rockchip_gem_object *rk_obj) return -ENOMEM; } - rk_obj->dma_addr = paddr; + rk_obj->dma_handle = paddr; rk_obj->num_pages = rk_obj->base.size >> PAGE_SHIFT; rk_obj->pages = drm_calloc_large(rk_obj->num_pages, @@ -396,7 +396,7 @@ static void rockchip_gem_free_secure(struct rockchip_gem_object *rk_obj) drm_free_large(rk_obj->pages); sg_free_table(rk_obj->sgt); kfree(rk_obj->sgt); - gen_pool_free(private->secure_buffer_pool, rk_obj->dma_addr, + gen_pool_free(private->secure_buffer_pool, rk_obj->dma_handle, rk_obj->base.size); } @@ -449,7 +449,8 @@ static int rockchip_gem_alloc_buf(struct rockchip_gem_object *rk_obj, if (ret < 0) goto err_free; } else { - WARN_ON(!rk_obj->dma_addr); + WARN_ON(!rk_obj->dma_handle); + rk_obj->dma_addr = rk_obj->dma_handle; } return 0; @@ -476,7 +477,7 @@ static void rockchip_gem_free_dma(struct rockchip_gem_object *rk_obj) sg_free_table(rk_obj->sgt); kfree(rk_obj->sgt); dma_free_attrs(drm->dev, obj->size, rk_obj->kvaddr, - rk_obj->dma_addr, rk_obj->dma_attrs); + rk_obj->dma_handle, rk_obj->dma_attrs); } static void rockchip_gem_free_buf(struct rockchip_gem_object *rk_obj) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h index 7469cbe62922..eb392ee8e315 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h @@ -30,7 +30,8 @@ struct rockchip_gem_object { void *kvaddr; void *cookie; - dma_addr_t dma_addr; + dma_addr_t dma_addr; /* iova if iommu enable, otherwise physical address */ + dma_addr_t dma_handle; /* physical address */ /* Used when IOMMU is disabled */ unsigned long dma_attrs;