media: rockchip: ispp: fix build error for kernel 6.1

Change-Id: I967380bd5eefb217e2e3554e2ed8740b0310ac4f
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2023-05-31 15:34:31 +08:00
parent c70a37278b
commit 814cb480e7
5 changed files with 117 additions and 98 deletions

View File

@@ -3,6 +3,7 @@
#include <media/videobuf2-dma-contig.h>
#include <linux/delay.h>
#include <linux/iosys-map.h>
#include <linux/of_platform.h>
#include <linux/slab.h>
#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]);

View File

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

View File

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

View File

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

View File

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