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