From 814cb480e7ab369d83d0e48c0a34a6a5fa52f863 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Wed, 31 May 2023 15:34:31 +0800 Subject: [PATCH] media: rockchip: ispp: fix build error for kernel 6.1 Change-Id: I967380bd5eefb217e2e3554e2ed8740b0310ac4f Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/ispp/common.c | 84 ++++++++++++------- drivers/media/platform/rockchip/ispp/common.h | 5 +- drivers/media/platform/rockchip/ispp/fec.c | 83 +++++++++--------- drivers/media/platform/rockchip/ispp/hw.c | 41 ++++----- drivers/media/platform/rockchip/ispp/regs.h | 2 +- 5 files changed, 117 insertions(+), 98 deletions(-) diff --git a/drivers/media/platform/rockchip/ispp/common.c b/drivers/media/platform/rockchip/ispp/common.c index 8e4b10508083..3ae45edf49f1 100644 --- a/drivers/media/platform/rockchip/ispp/common.c +++ b/drivers/media/platform/rockchip/ispp/common.c @@ -3,6 +3,7 @@ #include #include +#include #include #include #include "dev.h" @@ -62,10 +63,24 @@ void rkispp_update_regs(struct rkispp_device *dev, u32 start, u32 end) } } +static void rkispp_init_dummy_vb2(struct rkispp_device *dev, + struct rkispp_dummy_buffer *buf) +{ + unsigned long attrs = buf->is_need_vaddr ? 0 : DMA_ATTR_NO_KERNEL_MAPPING; + + memset(&buf->vb2_queue, 0, sizeof(buf->vb2_queue)); + memset(&buf->vb, 0, sizeof(buf->vb)); + buf->vb2_queue.gfp_flags = GFP_KERNEL | GFP_DMA32; + buf->vb2_queue.dma_dir = DMA_BIDIRECTIONAL; + if (dev->hw_dev->is_dma_contig) + attrs |= DMA_ATTR_FORCE_CONTIGUOUS; + buf->vb2_queue.dma_attrs = attrs; + buf->vb.vb2_queue = &buf->vb2_queue; +} + int rkispp_allow_buffer(struct rkispp_device *dev, struct rkispp_dummy_buffer *buf) { - unsigned long attrs = buf->is_need_vaddr ? 0 : DMA_ATTR_NO_KERNEL_MAPPING; const struct vb2_mem_ops *g_ops = dev->hw_dev->mem_ops; struct sg_table *sg_tbl; void *mem_priv; @@ -75,12 +90,9 @@ int rkispp_allow_buffer(struct rkispp_device *dev, ret = -EINVAL; goto err; } - - if (dev->hw_dev->is_dma_contig) - attrs |= DMA_ATTR_FORCE_CONTIGUOUS; + rkispp_init_dummy_vb2(dev, buf); buf->size = PAGE_ALIGN(buf->size); - mem_priv = g_ops->alloc(dev->hw_dev->dev, attrs, buf->size, - DMA_BIDIRECTIONAL, GFP_KERNEL | GFP_DMA32); + mem_priv = g_ops->alloc(&buf->vb, dev->hw_dev->dev, buf->size); if (IS_ERR_OR_NULL(mem_priv)) { ret = -ENOMEM; goto err; @@ -88,16 +100,16 @@ int rkispp_allow_buffer(struct rkispp_device *dev, buf->mem_priv = mem_priv; if (dev->hw_dev->is_dma_sg_ops) { - sg_tbl = (struct sg_table *)g_ops->cookie(mem_priv); + sg_tbl = (struct sg_table *)g_ops->cookie(&buf->vb, mem_priv); buf->dma_addr = sg_dma_address(sg_tbl->sgl); g_ops->prepare(mem_priv); } else { - buf->dma_addr = *((dma_addr_t *)g_ops->cookie(mem_priv)); + buf->dma_addr = *((dma_addr_t *)g_ops->cookie(&buf->vb, mem_priv)); } if (buf->is_need_vaddr) - buf->vaddr = g_ops->vaddr(mem_priv); + buf->vaddr = g_ops->vaddr(&buf->vb, mem_priv); if (buf->is_need_dbuf) { - buf->dbuf = g_ops->get_dmabuf(mem_priv, O_RDWR); + buf->dbuf = g_ops->get_dmabuf(&buf->vb, mem_priv, O_RDWR); if (buf->is_need_dmafd) { buf->dma_fd = dma_buf_fd(buf->dbuf, O_CLOEXEC); if (buf->dma_fd < 0) { @@ -255,7 +267,6 @@ static int rkispp_find_regbuf_by_stat(struct rkispp_hw_dev *hw, struct rkisp_isp static void rkispp_free_pool(struct rkispp_hw_dev *hw) { - const struct vb2_mem_ops *g_ops = hw->mem_ops; struct rkispp_isp_buf_pool *buf; int i, j; @@ -270,12 +281,23 @@ static void rkispp_free_pool(struct rkispp_hw_dev *hw) dev_info(hw->dev, "%s dbufs[%d]:0x%p\n", __func__, i, buf->dbufs); for (j = 0; j < hw->pool[0].group_buf_max; j++) { - if (buf->mem_priv[j]) { - g_ops->unmap_dmabuf(buf->mem_priv[j]); - g_ops->detach_dmabuf(buf->mem_priv[j]); - dma_buf_put(buf->dbufs->dbuf[j]); - buf->mem_priv[j] = NULL; + if (!buf->dba[j]) + continue; + if (buf->vaddr[j]) { + struct iosys_map map = IOSYS_MAP_INIT_VADDR(buf->vaddr[j]); + + dma_buf_vunmap(buf->dbufs->dbuf[j], &map); + buf->vaddr[j] = NULL; } + if (buf->sgt[j]) { + dma_buf_unmap_attachment(buf->dba[j], + buf->sgt[j], + DMA_BIDIRECTIONAL); + buf->sgt[j] = NULL; + } + dma_buf_detach(buf->dbufs->dbuf[j], buf->dba[j]); + dma_buf_put(buf->dbufs->dbuf[j]); + buf->dba[j] = NULL; } buf->dbufs = NULL; } @@ -286,11 +308,11 @@ static void rkispp_free_pool(struct rkispp_hw_dev *hw) static int rkispp_init_pool(struct rkispp_hw_dev *hw, struct rkisp_ispp_buf *dbufs) { - const struct vb2_mem_ops *g_ops = hw->mem_ops; struct rkispp_isp_buf_pool *pool; - struct sg_table *sg_tbl; + struct dma_buf_attachment *dba; + struct sg_table *sgt; + struct iosys_map map; int i, ret = 0; - void *mem; INIT_LIST_HEAD(&hw->list); /* init dma buf pool */ @@ -305,24 +327,22 @@ static int rkispp_init_pool(struct rkispp_hw_dev *hw, struct rkisp_ispp_buf *dbu dev_info(hw->dev, "%s dbufs[%d]:0x%p\n", __func__, i, dbufs); for (i = 0; i < hw->pool[0].group_buf_max; i++) { - mem = g_ops->attach_dmabuf(hw->dev, dbufs->dbuf[i], - dbufs->dbuf[i]->size, DMA_BIDIRECTIONAL); - if (IS_ERR(mem)) { - ret = PTR_ERR(mem); + dba = dma_buf_attach(dbufs->dbuf[i], hw->dev); + if (IS_ERR(dba)) { + ret = PTR_ERR(dba); goto err; } - pool->mem_priv[i] = mem; - ret = g_ops->map_dmabuf(mem); - if (ret) + pool->dba[i] = dba; + sgt = dma_buf_map_attachment(dba, DMA_BIDIRECTIONAL); + if (IS_ERR(sgt)) { + ret = PTR_ERR(sgt); goto err; - if (hw->is_dma_sg_ops) { - sg_tbl = (struct sg_table *)g_ops->cookie(mem); - pool->dma[i] = sg_dma_address(sg_tbl->sgl); - } else { - pool->dma[i] = *((dma_addr_t *)g_ops->cookie(mem)); } + pool->sgt[i] = sgt; + pool->dma[i] = sg_dma_address(sgt->sgl); get_dma_buf(dbufs->dbuf[i]); - pool->vaddr[i] = g_ops->vaddr(mem); + ret = dma_buf_vmap(dbufs->dbuf[i], &map); + pool->vaddr[i] = ret ? NULL : map.vaddr; if (rkispp_debug) dev_info(hw->dev, "%s dma[%d]:0x%x\n", __func__, i, (u32)pool->dma[i]); diff --git a/drivers/media/platform/rockchip/ispp/common.h b/drivers/media/platform/rockchip/ispp/common.h index 0d24cbb6c2d0..fb36a4e0b514 100644 --- a/drivers/media/platform/rockchip/ispp/common.h +++ b/drivers/media/platform/rockchip/ispp/common.h @@ -47,7 +47,8 @@ enum rkispp_event_cmd { struct rkispp_isp_buf_pool { struct rkisp_ispp_buf *dbufs; - void *mem_priv[GROUP_BUF_MAX]; + struct dma_buf_attachment *dba[GROUP_BUF_MAX]; + struct sg_table *sgt[GROUP_BUF_MAX]; dma_addr_t dma[GROUP_BUF_MAX]; void *vaddr[GROUP_BUF_MAX]; u8 group_buf_max; @@ -70,6 +71,8 @@ struct rkispp_buffer { }; struct rkispp_dummy_buffer { + struct vb2_buffer vb; + struct vb2_queue vb2_queue; struct list_head list; struct dma_buf *dbuf; dma_addr_t dma_addr; diff --git a/drivers/media/platform/rockchip/ispp/fec.c b/drivers/media/platform/rockchip/ispp/fec.c index 8004f3c5d577..bb16d557e5e6 100644 --- a/drivers/media/platform/rockchip/ispp/fec.c +++ b/drivers/media/platform/rockchip/ispp/fec.c @@ -23,17 +23,17 @@ struct rkispp_fec_buf { struct file *file; int fd; struct dma_buf *dbuf; - void *mem; + struct dma_buf_attachment *dba; + struct sg_table *sgt; }; -static const struct vb2_mem_ops *g_ops = &vb2_dma_contig_memops; - -static void *fec_buf_add(struct file *file, int fd, int size) +static struct sg_table *fec_buf_add(struct file *file, int fd, int size) { struct rkispp_fec_dev *fec = video_drvdata(file); struct rkispp_fec_buf *buf = NULL; - struct dma_buf *dbuf; - void *mem = NULL; + struct dma_buf *dbuf = NULL; + struct dma_buf_attachment *dba = NULL; + struct sg_table *sgt = NULL; bool is_add = true; dbuf = dma_buf_get(fd); @@ -41,13 +41,13 @@ static void *fec_buf_add(struct file *file, int fd, int size) "%s file:%p fd:%d dbuf:%p\n", __func__, file, fd, dbuf); if (IS_ERR_OR_NULL(dbuf)) { v4l2_err(&fec->v4l2_dev, "invalid dmabuf fd:%d for in picture", fd); - return mem; + return sgt; } if (size && dbuf->size < size) { v4l2_err(&fec->v4l2_dev, "input fd:%d size error:%zu < %u\n", fd, dbuf->size, size); dma_buf_put(dbuf); - return mem; + return sgt; } mutex_lock(&fec->hw->dev_lock); @@ -59,39 +59,39 @@ static void *fec_buf_add(struct file *file, int fd, int size) } if (is_add) { - mem = g_ops->attach_dmabuf(fec->hw->dev, dbuf, dbuf->size, DMA_BIDIRECTIONAL); - if (IS_ERR(mem)) { + dba = dma_buf_attach(dbuf, fec->hw->dev); + if (IS_ERR(dba)) { v4l2_err(&fec->v4l2_dev, "failed to attach dmabuf, fd:%d\n", fd); dma_buf_put(dbuf); goto end; } - if (g_ops->map_dmabuf(mem)) { + sgt = dma_buf_map_attachment(dba, DMA_BIDIRECTIONAL); + if (IS_ERR(sgt)) { v4l2_err(&fec->v4l2_dev, "failed to map, fd:%d\n", fd); - g_ops->detach_dmabuf(mem); + dma_buf_detach(dbuf, dba); dma_buf_put(dbuf); - mem = NULL; goto end; } buf = kzalloc(sizeof(struct rkispp_fec_buf), GFP_KERNEL); if (!buf) { - g_ops->unmap_dmabuf(mem); - g_ops->detach_dmabuf(mem); + dma_buf_unmap_attachment(dba, sgt, DMA_BIDIRECTIONAL); + dma_buf_detach(dbuf, dba); dma_buf_put(dbuf); - mem = NULL; goto end; } buf->fd = fd; buf->file = file; buf->dbuf = dbuf; - buf->mem = mem; + buf->dba = dba; + buf->sgt = sgt; list_add_tail(&buf->list, &fec->list); } else { dma_buf_put(dbuf); - mem = buf->mem; + sgt = buf->sgt; } end: mutex_unlock(&fec->hw->dev_lock); - return mem; + return sgt; } static void fec_buf_del(struct file *file, int fd, bool is_all) @@ -105,11 +105,12 @@ static void fec_buf_del(struct file *file, int fd, bool is_all) v4l2_dbg(4, rkispp_debug, &fec->v4l2_dev, "%s file:%p fd:%d dbuf:%p\n", __func__, file, buf->fd, buf->dbuf); - g_ops->unmap_dmabuf(buf->mem); - g_ops->detach_dmabuf(buf->mem); + dma_buf_unmap_attachment(buf->dba, buf->sgt, DMA_BIDIRECTIONAL); + dma_buf_detach(buf->dbuf, buf->dba); dma_buf_put(buf->dbuf); buf->file = NULL; - buf->mem = NULL; + buf->dba = NULL; + buf->sgt = NULL; buf->dbuf = NULL; buf->fd = -1; list_del(&buf->list); @@ -128,7 +129,7 @@ static int fec_running(struct file *file, struct rkispp_fec_in_out *buf) u32 out_w = buf->out_width, out_h = buf->out_height; u32 density, mesh_size; void __iomem *base = fec->hw->base_addr; - void *mem; + struct sg_table *sgt; int ret = -EINVAL; ktime_t t = 0; s64 us = 0; @@ -215,49 +216,49 @@ static int fec_running(struct file *file, struct rkispp_fec_in_out *buf) out_w * out_h * 2 : out_w * out_h * 3 / 2; /* input picture buf */ - mem = fec_buf_add(file, buf->in_pic_fd, in_size); - if (!mem) + sgt = fec_buf_add(file, buf->in_pic_fd, in_size); + if (!sgt) goto free_buf; - val = *((dma_addr_t *)g_ops->cookie(mem)); + val = sg_dma_address(sgt->sgl); writel(val, base + RKISPP_FEC_RD_Y_BASE); val += in_offs; writel(val, base + RKISPP_FEC_RD_UV_BASE); /* output picture buf */ - mem = fec_buf_add(file, buf->out_pic_fd, out_size); - if (!mem) + sgt = fec_buf_add(file, buf->out_pic_fd, out_size); + if (!sgt) goto free_buf; - val = *((dma_addr_t *)g_ops->cookie(mem)); + val = sg_dma_address(sgt->sgl); writel(val, base + RKISPP_FEC_WR_Y_BASE); val += out_offs; writel(val, base + RKISPP_FEC_WR_UV_BASE); /* mesh xint buf */ - mem = fec_buf_add(file, buf->mesh_xint_fd, mesh_size * 2); - if (!mem) + sgt = fec_buf_add(file, buf->mesh_xint_fd, mesh_size * 2); + if (!sgt) goto free_buf; - val = *((dma_addr_t *)g_ops->cookie(mem)); + val = sg_dma_address(sgt->sgl); writel(val, base + RKISPP_FEC_MESH_XINT_BASE); /* mesh xfra buf */ - mem = fec_buf_add(file, buf->mesh_xfra_fd, mesh_size); - if (!mem) + sgt = fec_buf_add(file, buf->mesh_xfra_fd, mesh_size); + if (!sgt) goto free_buf; - val = *((dma_addr_t *)g_ops->cookie(mem)); + val = sg_dma_address(sgt->sgl); writel(val, base + RKISPP_FEC_MESH_XFRA_BASE); /* mesh yint buf */ - mem = fec_buf_add(file, buf->mesh_yint_fd, mesh_size * 2); - if (!mem) + sgt = fec_buf_add(file, buf->mesh_yint_fd, mesh_size * 2); + if (!sgt) goto free_buf; - val = *((dma_addr_t *)g_ops->cookie(mem)); + val = sg_dma_address(sgt->sgl); writel(val, base + RKISPP_FEC_MESH_YINT_BASE); /* mesh yfra buf */ - mem = fec_buf_add(file, buf->mesh_yfra_fd, mesh_size); - if (!mem) + sgt = fec_buf_add(file, buf->mesh_yfra_fd, mesh_size); + if (!sgt) goto free_buf; - val = *((dma_addr_t *)g_ops->cookie(mem)); + val = sg_dma_address(sgt->sgl); writel(val, base + RKISPP_FEC_MESH_YFRA_BASE); val = out_fmt << 4 | in_fmt; diff --git a/drivers/media/platform/rockchip/ispp/hw.c b/drivers/media/platform/rockchip/ispp/hw.c index 10545fd23e6c..e132610936ad 100644 --- a/drivers/media/platform/rockchip/ispp/hw.c +++ b/drivers/media/platform/rockchip/ispp/hw.c @@ -339,29 +339,24 @@ static int rkispp_hw_probe(struct platform_device *pdev) } rkispp_monitor = device_property_read_bool(dev, "rockchip,restart-monitor-en"); - res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, - match_data->irqs[0].name); - if (res) { - /* there are irq names in dts */ - for (i = 0; i < match_data->num_irqs; i++) { - irq = platform_get_irq_byname(pdev, - match_data->irqs[i].name); - if (irq < 0) { - dev_err(dev, "no irq %s in dts\n", - match_data->irqs[i].name); - ret = irq; - goto err; - } - ret = devm_request_irq(dev, irq, - match_data->irqs[i].irq_hdl, - IRQF_SHARED, - dev_driver_string(dev), - dev); - if (ret < 0) { - dev_err(dev, "request %s failed: %d\n", - match_data->irqs[i].name, ret); - goto err; - } + /* there are irq names in dts */ + for (i = 0; i < match_data->num_irqs; i++) { + irq = platform_get_irq_byname(pdev, match_data->irqs[i].name); + if (irq < 0) { + dev_err(dev, "no irq %s in dts\n", + match_data->irqs[i].name); + ret = irq; + goto err; + } + ret = devm_request_irq(dev, irq, + match_data->irqs[i].irq_hdl, + IRQF_SHARED, + dev_driver_string(dev), + dev); + if (ret < 0) { + dev_err(dev, "request %s failed: %d\n", + match_data->irqs[i].name, ret); + goto err; } } diff --git a/drivers/media/platform/rockchip/ispp/regs.h b/drivers/media/platform/rockchip/ispp/regs.h index 4a4eb91fc122..b9afecd67d13 100644 --- a/drivers/media/platform/rockchip/ispp/regs.h +++ b/drivers/media/platform/rockchip/ispp/regs.h @@ -365,7 +365,7 @@ #define GLB_SOFT_RST_NR BIT(9) #define GLB_SOFT_RST_TNR BIT(8) #define RST_PROTECT_DIS BIT(1) -#define GLB_SOFT_RST_ALL BIT(0) +#define GLB_SOFT_RST_ALL ((u32)BIT(0)) /* ISPP_CLKGATE */ #define GATE_DIS_ALL 0xff