mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 20:07:46 +09:00
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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user