video/rockchip: rga2: using common dma_buf api for ion dma fd

Change-Id: Iea8e6104f06341a5cadecec84ebdbd01d0512af1
Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
This commit is contained in:
Mark Yao
2017-09-26 10:08:07 +08:00
committed by Huang, Tao
parent aec25fa538
commit 2d604c4ebc

View File

@@ -690,72 +690,49 @@ static void rga2_del_running_list_timeout(void)
static int rga2_get_img_info(rga_img_info_t *img,
u8 mmu_flag,
u8 buf_gem_type_dma,
struct sg_table **psgt,
struct dma_buf_attachment **pattach)
{
struct dma_buf_attachment *attach = NULL;
struct ion_client *ion_client = NULL;
struct ion_handle *hdl = NULL;
struct device *rga_dev = NULL;
struct sg_table *sgt = NULL;
struct dma_buf *dma_buf = NULL;
u32 vir_w, vir_h;
ion_phys_addr_t phy_addr;
size_t len = 0;
int yrgb_addr = -1;
int ret = 0;
ion_client = rga2_drvdata->ion_client;
rga_dev = rga2_drvdata->dev;
yrgb_addr = (int)img->yrgb_addr;
vir_w = img->vir_w;
vir_h = img->vir_h;
if (yrgb_addr > 0) {
if (buf_gem_type_dma) {
dma_buf = dma_buf_get(img->yrgb_addr);
if (IS_ERR(dma_buf)) {
ret = -EINVAL;
pr_err("dma_buf_get fail fd[%d]\n", yrgb_addr);
return ret;
}
dma_buf = dma_buf_get(img->yrgb_addr);
if (IS_ERR(dma_buf)) {
ret = -EINVAL;
pr_err("dma_buf_get fail fd[%d]\n", yrgb_addr);
return ret;
}
attach = dma_buf_attach(dma_buf, rga_dev);
if (IS_ERR(attach)) {
dma_buf_put(dma_buf);
ret = -EINVAL;
pr_err("Failed to attach dma_buf\n");
return ret;
}
attach = dma_buf_attach(dma_buf, rga_dev);
if (IS_ERR(attach)) {
dma_buf_put(dma_buf);
ret = -EINVAL;
pr_err("Failed to attach dma_buf\n");
return ret;
}
*pattach = attach;
sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL);
if (IS_ERR(sgt)) {
ret = -EINVAL;
pr_err("Failed to map src attachment\n");
goto err_get_sg;
}
if (!mmu_flag) {
ret = -EINVAL;
pr_err("Fix it please enable iommu flag\n");
goto err_get_sg;
}
} else {
hdl = ion_import_dma_buf(ion_client, img->yrgb_addr);
if (IS_ERR(hdl)) {
ret = -EINVAL;
pr_err("RGA2 ERROR ion buf handle\n");
return ret;
}
if (mmu_flag) {
sgt = ion_sg_table(ion_client, hdl);
if (IS_ERR(sgt)) {
ret = -EINVAL;
pr_err("Fail map src attachment\n");
goto err_get_sg;
}
}
*pattach = attach;
sgt = dma_buf_map_attachment(attach, DMA_BIDIRECTIONAL);
if (IS_ERR(sgt)) {
ret = -EINVAL;
pr_err("Failed to map src attachment\n");
goto err_get_sg;
}
if (!mmu_flag) {
ret = -EINVAL;
pr_err("Fix it please enable iommu flag\n");
goto err_get_sg;
}
if (mmu_flag) {
@@ -763,11 +740,6 @@ static int rga2_get_img_info(rga_img_info_t *img,
img->yrgb_addr = img->uv_addr;
img->uv_addr = img->yrgb_addr + (vir_w * vir_h);
img->v_addr = img->uv_addr + (vir_w * vir_h) / 4;
} else {
ion_phys(ion_client, hdl, &phy_addr, &len);
img->yrgb_addr = phy_addr;
img->uv_addr = img->yrgb_addr + (vir_w * vir_h);
img->v_addr = img->uv_addr + (vir_w * vir_h) / 4;
}
} else {
img->yrgb_addr = img->uv_addr;
@@ -775,15 +747,10 @@ static int rga2_get_img_info(rga_img_info_t *img,
img->v_addr = img->uv_addr + (vir_w * vir_h) / 4;
}
if (hdl)
ion_free(ion_client, hdl);
return ret;
err_get_sg:
if (hdl)
ion_free(ion_client, hdl);
if (sgt && buf_gem_type_dma)
if (sgt)
dma_buf_unmap_attachment(attach, sgt, DMA_BIDIRECTIONAL);
if (attach) {
dma_buf = attach->dmabuf;
@@ -797,11 +764,9 @@ err_get_sg:
static int rga2_get_dma_buf(struct rga2_req *req)
{
struct dma_buf *dma_buf = NULL;
u8 buf_gem_type_dma = 0;
u8 mmu_flag = 0;
int ret = 0;
buf_gem_type_dma = req->buf_type & RGA_BUF_GEM_TYPE_DMA;
req->sg_src0 = NULL;
req->sg_src1 = NULL;
req->sg_dst = NULL;
@@ -810,24 +775,24 @@ static int rga2_get_dma_buf(struct rga2_req *req)
req->attach_dst = NULL;
req->attach_src1 = NULL;
mmu_flag = req->mmu_info.src0_mmu_flag;
ret = rga2_get_img_info(&req->src, mmu_flag, buf_gem_type_dma,
&req->sg_src0, &req->attach_src0);
ret = rga2_get_img_info(&req->src, mmu_flag, &req->sg_src0,
&req->attach_src0);
if (ret) {
pr_err("src:rga2_get_img_info fail\n");
goto err_src;
}
mmu_flag = req->mmu_info.dst_mmu_flag;
ret = rga2_get_img_info(&req->dst, mmu_flag, buf_gem_type_dma,
&req->sg_dst, &req->attach_dst);
ret = rga2_get_img_info(&req->dst, mmu_flag, &req->sg_dst,
&req->attach_dst);
if (ret) {
pr_err("dst:rga2_get_img_info fail\n");
goto err_dst;
}
mmu_flag = req->mmu_info.src1_mmu_flag;
ret = rga2_get_img_info(&req->src1, mmu_flag, buf_gem_type_dma,
&req->sg_src1, &req->attach_src1);
ret = rga2_get_img_info(&req->src1, mmu_flag, &req->sg_src1,
&req->attach_src1);
if (ret) {
pr_err("src1:rga2_get_img_info fail\n");
goto err_src1;
@@ -836,7 +801,7 @@ static int rga2_get_dma_buf(struct rga2_req *req)
return ret;
err_src1:
if (buf_gem_type_dma && req->sg_dst && req->attach_dst) {
if (req->sg_dst && req->attach_dst) {
dma_buf_unmap_attachment(req->attach_dst,
req->sg_dst, DMA_BIDIRECTIONAL);
dma_buf = req->attach_dst->dmabuf;
@@ -844,7 +809,7 @@ err_src1:
dma_buf_put(dma_buf);
}
err_dst:
if (buf_gem_type_dma && req->sg_src0 && req->attach_src0) {
if (req->sg_src0 && req->attach_src0) {
dma_buf_unmap_attachment(req->attach_src0,
req->sg_src0, DMA_BIDIRECTIONAL);
dma_buf = req->attach_src0->dmabuf;