media: rockchip: vicap alloc only one dummy_buf for all dev

use the maximum resolution as the allocated size

Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
Change-Id: I41d263993245d168b6494bc4139b2e6dac0a6dc9
This commit is contained in:
Zefa Chen
2022-09-29 20:54:25 +08:00
parent a2bf1b64e8
commit 34849d327b
5 changed files with 71 additions and 66 deletions

View File

@@ -1308,7 +1308,7 @@ static int rkcif_assign_new_buffer_oneframe(struct rkcif_stream *stream,
enum rkcif_yuvaddr_state stat)
{
struct rkcif_device *dev = stream->cifdev;
struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf;
struct rkcif_dummy_buffer *dummy_buf = &dev->hw_dev->dummy_buf;
struct rkcif_buffer *buffer = NULL;
u32 frm_addr_y = CIF_REG_DVP_FRM0_ADDR_Y;
u32 frm_addr_uv = CIF_REG_DVP_FRM0_ADDR_UV;
@@ -1757,7 +1757,7 @@ static int rkcif_assign_new_buffer_update_toisp(struct rkcif_stream *stream,
goto out_get_buf;
if (stream->lack_buf_cnt < 2)
stream->lack_buf_cnt++;
if (dev->dummy_buf.vaddr) {
if (dev->hw_dev->dummy_buf.vaddr) {
if (stream->frame_phase == CIF_CSI_FRAME0_READY) {
active_buf = stream->curr_buf_toisp;
stream->curr_buf_toisp = NULL;
@@ -1793,7 +1793,7 @@ static int rkcif_assign_new_buffer_update_toisp(struct rkcif_stream *stream,
else
rkcif_rdbk_frame_end_toisp(stream, active_buf);
} else {
if (stream->cifdev->rdbk_debug && dev->dummy_buf.vaddr)
if (stream->cifdev->rdbk_debug && dev->hw_dev->dummy_buf.vaddr)
v4l2_info(&stream->cifdev->v4l2_dev,
"stream[%d] loss frame %d\n",
stream->id,
@@ -1813,10 +1813,10 @@ out_get_buf:
stream->id,
stream->frame_idx - 1,
frm_addr_y, (u32)buffer->dummy.dma_addr);
} else if (dev->dummy_buf.vaddr && priv &&
} else if (dev->hw_dev->dummy_buf.vaddr && priv &&
priv->mode.rdbk_mode == RKISP_VICAP_RDBK_AUTO) {
rkcif_write_register(dev, frm_addr_y,
dev->dummy_buf.dma_addr);
dev->hw_dev->dummy_buf.dma_addr);
}
spin_unlock_irqrestore(&stream->vbq_lock, flags);
return 0;
@@ -1954,7 +1954,7 @@ void rkcif_assign_check_buffer_update_toisp(struct rkcif_stream *stream)
stream->last_frame_idx = stream->frame_idx;
rkcif_s_rx_buffer(dev, &active_buf->dbufs);
}
if (dev->dummy_buf.vaddr)
if (dev->hw_dev->dummy_buf.vaddr)
return;
if (mbus_cfg->type == V4L2_MBUS_CSI2_DPHY ||
mbus_cfg->type == V4L2_MBUS_CSI2_CPHY ||
@@ -1984,7 +1984,7 @@ static void rkcif_assign_new_buffer_init(struct rkcif_stream *stream,
u32 frm0_addr_y, frm0_addr_uv;
u32 frm1_addr_y, frm1_addr_uv;
unsigned long flags;
struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf;
struct rkcif_dummy_buffer *dummy_buf = &dev->hw_dev->dummy_buf;
struct csi_channel_info *channel = &dev->channels[channel_id];
if (mbus_cfg->type == V4L2_MBUS_CSI2_DPHY ||
@@ -2108,7 +2108,7 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream,
int channel_id)
{
struct rkcif_device *dev = stream->cifdev;
struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf;
struct rkcif_dummy_buffer *dummy_buf = &dev->hw_dev->dummy_buf;
struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus;
struct rkcif_buffer *buffer = NULL;
u32 frm_addr_y, frm_addr_uv;
@@ -2348,7 +2348,7 @@ stop_dma:
static int rkcif_get_new_buffer_wake_up_mode(struct rkcif_stream *stream)
{
struct rkcif_device *dev = stream->cifdev;
struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf;
struct rkcif_dummy_buffer *dummy_buf = &dev->hw_dev->dummy_buf;
int ret = 0;
unsigned long flags;
@@ -2406,7 +2406,7 @@ static int rkcif_get_new_buffer_wake_up_mode(struct rkcif_stream *stream)
static int rkcif_update_new_buffer_wake_up_mode(struct rkcif_stream *stream)
{
struct rkcif_device *dev = stream->cifdev;
struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf;
struct rkcif_dummy_buffer *dummy_buf = &dev->hw_dev->dummy_buf;
struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus;
struct rkcif_buffer *buffer = NULL;
u32 frm_addr_y, frm_addr_uv;
@@ -2549,7 +2549,7 @@ static void rkcif_assign_dummy_buffer(struct rkcif_stream *stream)
{
struct rkcif_device *dev = stream->cifdev;
struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus;
struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf;
struct rkcif_dummy_buffer *dummy_buf = &dev->hw_dev->dummy_buf;
unsigned long flags;
spin_lock_irqsave(&stream->vbq_lock, flags);
@@ -3512,7 +3512,7 @@ static void rkcif_check_buffer_update_pingpong(struct rkcif_stream *stream,
struct rkcif_device *dev = stream->cifdev;
struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus;
struct rkcif_buffer *buffer = NULL;
struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf;
struct rkcif_dummy_buffer *dummy_buf = &dev->hw_dev->dummy_buf;
u32 frm_addr_y, frm_addr_uv;
unsigned long flags;
int frame_phase = 0;
@@ -3849,35 +3849,42 @@ int rkcif_init_rx_buf(struct rkcif_stream *stream, int buf_num)
static int rkcif_create_dummy_buf(struct rkcif_stream *stream)
{
u32 fourcc;
struct rkcif_device *dev = stream->cifdev;
struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf;
struct rkcif_hw *hw = dev->hw_dev;
struct rkcif_dummy_buffer *dummy_buf = &hw->dummy_buf;
struct rkcif_device *tmp_dev = NULL;
struct rkcif_stream *tmp_stream = NULL;
struct v4l2_rect rect;
struct csi_channel_info csi_info;
const struct cif_input_fmt *input_fmt;
u32 max_size = 0;
u32 size = 0;
int ret = 0;
u32 height = 0;
int i, j;
if (stream->crop_enable)
height = stream->crop[CROP_SRC_ACT].height;
else
height = stream->pixm.height;
if (dev->sditf_cnt > 1 && dev->sditf_cnt <= RKCIF_MAX_SDITF)
height *= dev->sditf_cnt;
/* get a maximum plane size */
dummy_buf->size = max3(stream->pixm.plane_fmt[0].bytesperline *
height,
stream->pixm.plane_fmt[1].sizeimage,
stream->pixm.plane_fmt[2].sizeimage);
/*
* rk cif don't support output yuyv fmt data
* if user request yuyv fmt, the input mode must be RAW8
* and the width is double Because the real input fmt is
* yuyv
*/
fourcc = stream->cif_fmt_out->fourcc;
if (fourcc == V4L2_PIX_FMT_YUYV || fourcc == V4L2_PIX_FMT_YVYU ||
fourcc == V4L2_PIX_FMT_UYVY || fourcc == V4L2_PIX_FMT_VYUY)
dummy_buf->size *= 2;
for (i = 0; i < hw->dev_num; i++) {
tmp_dev = hw->cif_dev[i];
for (j = 0; j < tmp_dev->num_channels; j++) {
tmp_stream = &tmp_dev->stream[j];
if (tmp_stream) {
if (!tmp_dev->terminal_sensor.sd)
rkcif_update_sensor_info(tmp_stream);
if (tmp_dev->terminal_sensor.sd) {
input_fmt = get_input_fmt(tmp_dev->terminal_sensor.sd,
&rect, i, &csi_info);
if (input_fmt && input_fmt->mbus_code == MEDIA_BUS_FMT_RGB888_1X24)
size = rect.width * rect.height * 3;
else
size = rect.width * rect.height * 2;
if (size > max_size)
max_size = size;
} else {
continue;
}
}
}
}
dummy_buf->size = max_size;
dummy_buf->is_need_vaddr = true;
dummy_buf->is_need_dbuf = true;
@@ -3897,7 +3904,7 @@ static int rkcif_create_dummy_buf(struct rkcif_stream *stream)
static void rkcif_destroy_dummy_buf(struct rkcif_stream *stream)
{
struct rkcif_device *dev = stream->cifdev;
struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf;
struct rkcif_dummy_buffer *dummy_buf = &dev->hw_dev->dummy_buf;
if (dummy_buf->vaddr)
rkcif_free_buffer(dev, dummy_buf);
@@ -4175,7 +4182,7 @@ void rkcif_do_stop_stream(struct rkcif_stream *stream,
stream->is_line_wake_up = false;
}
}
if (!atomic_read(&dev->pipe.stream_cnt) && dev->dummy_buf.vaddr)
if (can_reset && hw_dev->dummy_buf.vaddr)
rkcif_destroy_dummy_buf(stream);
stream->cur_stream_mode &= ~mode;
v4l2_info(&dev->v4l2_dev, "stream[%d] stopping finished, dma_en 0x%x\n", stream->id, stream->dma_en);
@@ -5149,7 +5156,7 @@ int rkcif_do_start_stream(struct rkcif_stream *stream, unsigned int mode)
if (((dev->active_sensor && dev->active_sensor->mbus.type == V4L2_MBUS_BT656) ||
dev->is_use_dummybuf) &&
(!dev->dummy_buf.vaddr) &&
(!dev->hw_dev->dummy_buf.vaddr) &&
mode == RKCIF_STREAM_MODE_CAPTURE) {
ret = rkcif_create_dummy_buf(stream);
if (ret < 0) {
@@ -6277,7 +6284,7 @@ int rkcif_register_stream_vdevs(struct rkcif_device *dev,
if (ret < 0)
goto err;
}
dev->num_channels = stream_num;
return 0;
err:
for (j = 0; j < i; j++) {

View File

@@ -189,21 +189,6 @@ struct rkcif_buffer {
struct dma_buf *dbuf;
};
struct rkcif_dummy_buffer {
struct list_head list;
struct dma_buf *dbuf;
dma_addr_t dma_addr;
struct page **pages;
void *mem_priv;
void *vaddr;
u32 size;
int dma_fd;
bool is_need_vaddr;
bool is_need_dbuf;
bool is_need_dmafd;
bool is_free;
};
struct rkcif_tools_buffer {
struct vb2_v4l2_buffer *vb;
struct list_head list;
@@ -816,7 +801,6 @@ struct rkcif_device {
unsigned int wait_line;
unsigned int wait_line_bak;
unsigned int wait_line_cache;
struct rkcif_dummy_buffer dummy_buf;
struct completion cmpl_ntf;
struct csi2_dphy_hw *dphy_hw;
phys_addr_t resmem_pa;

View File

@@ -27,7 +27,6 @@
#include <linux/io.h>
#include <linux/mfd/syscon.h>
#include <soc/rockchip/rockchip_iommu.h>
#include "dev.h"
#include "common.h"
static const struct cif_reg px30_cif_regs[] = {

View File

@@ -18,6 +18,7 @@
#include <linux/rk-camera-module.h>
#include "regs.h"
#include "version.h"
#include "dev.h"
#define RKCIF_DEV_MAX 7
#define RKCIF_HW_DRIVER_NAME "rkcifhw"
@@ -70,6 +71,21 @@ struct rkcif_multi_sync_config {
bool is_attach;
};
struct rkcif_dummy_buffer {
struct list_head list;
struct dma_buf *dbuf;
dma_addr_t dma_addr;
struct page **pages;
void *mem_priv;
void *vaddr;
u32 size;
int dma_fd;
bool is_need_vaddr;
bool is_need_dbuf;
bool is_need_dmafd;
bool is_free;
};
/*
* add new chip id in tail in time order
* by increasing to distinguish cif version
@@ -116,20 +132,20 @@ struct rkcif_hw {
int chip_id;
const struct cif_reg *cif_regs;
const struct vb2_mem_ops *mem_ops;
bool iommu_en;
bool can_be_reset;
bool is_dma_sg_ops;
bool is_dma_contig;
struct rkcif_device *cif_dev[RKCIF_DEV_MAX];
int dev_num;
atomic_t power_cnt;
const struct rkcif_hw_match_data *match_data;
struct mutex dev_lock;
struct rkcif_multi_sync_config sync_config;
spinlock_t group_lock;
bool adapt_to_usbcamerahal;
struct notifier_block reset_notifier; /* reset for mipi csi crc err */
struct rkcif_dummy_buffer dummy_buf;
bool iommu_en;
bool can_be_reset;
bool is_dma_sg_ops;
bool is_dma_contig;
bool adapt_to_usbcamerahal;
};
void rkcif_hw_soft_reset(struct rkcif_hw *cif_hw, bool is_rst_iommu);

View File

@@ -8,7 +8,6 @@
#include <linux/spinlock.h>
#include <linux/v4l2-mediabus.h>
#include "hw.h"
#include "dev.h"
#include "procfs.h"