Revert "drm/rockchip: gem: fix dma_free_attrs() parameter error"

This reverts commit 42256c1a8f 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 <hjc@rock-chips.com>
This commit is contained in:
Sandy Huang
2021-07-21 11:32:12 +08:00
parent 7884aefdda
commit f26aeace67
2 changed files with 10 additions and 8 deletions

View File

@@ -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)

View File

@@ -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;