From 34ea3eb4837475a21869c9d8d83e1ba8819bb14c Mon Sep 17 00:00:00 2001 From: Zefa Chen Date: Wed, 7 Dec 2022 19:09:36 +0800 Subject: [PATCH] media: rockchip: vicap: toisp mode add memory compact config if isp work in isp_unit mode and hdr mode and online mode, buffer addr for half frame of right side must 16 byte align, otherwise, the buffer to ddr need config to uncompact Signed-off-by: Zefa Chen Change-Id: I29792f2fbeed410d0c640b8bee27f741915086be --- drivers/media/platform/rockchip/cif/capture.c | 20 +++++++++++------- .../media/platform/rockchip/cif/cif-scale.c | 6 +++--- .../media/platform/rockchip/cif/cif-tools.c | 4 ++-- drivers/media/platform/rockchip/cif/dev.h | 3 +++ .../media/platform/rockchip/cif/subdev-itf.c | 21 +++++++++++++++++++ 5 files changed, 41 insertions(+), 13 deletions(-) diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 6ead58576621..eb916934a427 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -765,8 +765,8 @@ set_default: return NULL; } -static const struct -cif_output_fmt *find_output_fmt(struct rkcif_stream *stream, u32 pixelfmt) +const struct +cif_output_fmt *rkcif_find_output_fmt(struct rkcif_stream *stream, u32 pixelfmt) { const struct cif_output_fmt *fmt; u32 i; @@ -2770,7 +2770,7 @@ static int rkcif_csi_channel_init(struct rkcif_stream *stream, if (dev->sditf_cnt > 1 && dev->sditf_cnt <= RKCIF_MAX_SDITF) channel->height *= dev->sditf_cnt; - fmt = find_output_fmt(stream, stream->pixm.pixelformat); + fmt = rkcif_find_output_fmt(stream, stream->pixm.pixelformat); if (!fmt) { v4l2_err(&dev->v4l2_dev, "can not find output format: 0x%x", stream->pixm.pixelformat); @@ -3838,6 +3838,10 @@ int rkcif_init_rx_buf(struct rkcif_stream *stream, int buf_num) buf->dbufs.type = frm_type; list_add_tail(&buf->list, &stream->rx_buf_head); dummy->is_free = false; + if (stream->is_compact) + buf->dbufs.is_uncompact = false; + else + buf->dbufs.is_uncompact = true; if (priv && priv->mode.rdbk_mode == RKISP_VICAP_ONLINE && i == 0) { buf->dbufs.is_first = true; rkcif_s_rx_buffer(dev, &buf->dbufs); @@ -4908,7 +4912,7 @@ static int rkcif_stream_start(struct rkcif_stream *stream, unsigned int mode) if (dev->chip_id >= CHIP_RK3588_CIF) { val = stream->pixm.plane_fmt[0].bytesperline; } else { - fmt = find_output_fmt(stream, stream->pixm.pixelformat); + fmt = rkcif_find_output_fmt(stream, stream->pixm.pixelformat); if (fmt->fmt_type == CIF_FMT_TYPE_RAW && fmt->csi_fmt_val == CSI_WRDDR_TYPE_RAW8) val = ALIGN(stream->pixm.width * fmt->raw_bpp / 8, 256); @@ -5350,7 +5354,7 @@ int rkcif_set_fmt(struct rkcif_stream *stream, for (i = 0; i < RKCIF_MAX_PLANE; i++) memset(&pixm->plane_fmt[i], 0, sizeof(struct v4l2_plane_pix_format)); - fmt = find_output_fmt(stream, pixm->pixelformat); + fmt = rkcif_find_output_fmt(stream, pixm->pixelformat); if (!fmt) fmt = &out_fmts[0]; @@ -5703,7 +5707,7 @@ static int rkcif_enum_framesizes(struct file *file, void *prov, if (fsize->index != 0) return -EINVAL; - if (!find_output_fmt(stream, fsize->pixel_format)) + if (!rkcif_find_output_fmt(stream, fsize->pixel_format)) return -EINVAL; input_rect.width = RKCIF_DEFAULT_WIDTH; @@ -7051,7 +7055,7 @@ static void rkcif_cal_csi_crop_width_vwidth(struct rkcif_stream *stream, const struct cif_output_fmt *fmt; u32 fourcc; - fmt = find_output_fmt(stream, stream->pixm.pixelformat); + fmt = rkcif_find_output_fmt(stream, stream->pixm.pixelformat); if (!fmt) { v4l2_err(&dev->v4l2_dev, "can not find output format: 0x%x", stream->pixm.pixelformat); @@ -7152,7 +7156,7 @@ static void rkcif_dynamic_crop(struct rkcif_stream *stream) crop_y << CIF_CROP_Y_SHIFT | crop_x); if (stream->cif_fmt_in->fmt_type == CIF_FMT_TYPE_RAW) { - fmt = find_output_fmt(stream, stream->pixm.pixelformat); + fmt = rkcif_find_output_fmt(stream, stream->pixm.pixelformat); crop_vwidth = raw_width * rkcif_cal_raw_vir_line_ratio(stream, fmt); } rkcif_write_register(cif_dev, CIF_REG_DVP_VIR_LINE_WIDTH, crop_vwidth); diff --git a/drivers/media/platform/rockchip/cif/cif-scale.c b/drivers/media/platform/rockchip/cif/cif-scale.c index bf7e88c8a1aa..85bc9fe5fcb9 100644 --- a/drivers/media/platform/rockchip/cif/cif-scale.c +++ b/drivers/media/platform/rockchip/cif/cif-scale.c @@ -112,7 +112,7 @@ static u32 rkcif_scale_align_bits_per_pixel(struct rkcif_device *cif_dev, static const struct -cif_output_fmt *find_output_fmt(u32 pixelfmt) +cif_output_fmt *rkcif_scale_find_output_fmt(u32 pixelfmt) { const struct cif_output_fmt *fmt; u32 i; @@ -169,7 +169,7 @@ static int rkcif_scale_set_fmt(struct rkcif_scale_vdev *scale_vdev, scale_vdev->src_res.width = fmt_src.format.width; scale_vdev->src_res.height = fmt_src.format.height; } - fmt = find_output_fmt(pixm->pixelformat); + fmt = rkcif_scale_find_output_fmt(pixm->pixelformat); if (fmt == NULL) { v4l2_err(&scale_vdev->cifdev->v4l2_dev, "format of source channel are not bayer raw, not support scale\n"); @@ -355,7 +355,7 @@ static int rkcif_scale_enum_framesizes(struct file *file, void *prov, if (fsize->index >= RKCIF_SCALE_ENUM_SIZE_MAX) return -EINVAL; - if (!find_output_fmt(fsize->pixel_format)) + if (!rkcif_scale_find_output_fmt(fsize->pixel_format)) return -EINVAL; input_rect.width = RKCIF_DEFAULT_WIDTH; diff --git a/drivers/media/platform/rockchip/cif/cif-tools.c b/drivers/media/platform/rockchip/cif/cif-tools.c index c365d882f383..caf528c9323b 100644 --- a/drivers/media/platform/rockchip/cif/cif-tools.c +++ b/drivers/media/platform/rockchip/cif/cif-tools.c @@ -150,7 +150,7 @@ static int rkcif_tools_g_fmt_vid_cap_mplane(struct file *file, void *priv, } static const struct -cif_output_fmt *find_output_fmt(u32 pixelfmt) +cif_output_fmt *rkcif_tools_find_output_fmt(u32 pixelfmt) { const struct cif_output_fmt *fmt; u32 i; @@ -293,7 +293,7 @@ static int rkcif_tools_enum_framesizes(struct file *file, void *prov, if (fsize->index >= ARRAY_SIZE(tools_out_fmts)) return -EINVAL; - if (!find_output_fmt(fsize->pixel_format)) + if (!rkcif_tools_find_output_fmt(fsize->pixel_format)) return -EINVAL; input_rect.width = RKCIF_DEFAULT_WIDTH; diff --git a/drivers/media/platform/rockchip/cif/dev.h b/drivers/media/platform/rockchip/cif/dev.h index f4a686fb5759..8c3d0580889b 100644 --- a/drivers/media/platform/rockchip/cif/dev.h +++ b/drivers/media/platform/rockchip/cif/dev.h @@ -904,4 +904,7 @@ struct rkcif_rx_buffer *to_cif_rx_buf(struct rkisp_rx_buf *dbufs); int rkcif_clr_unready_dev(void); +const struct +cif_output_fmt *rkcif_find_output_fmt(struct rkcif_stream *stream, u32 pixelfmt); + #endif diff --git a/drivers/media/platform/rockchip/cif/subdev-itf.c b/drivers/media/platform/rockchip/cif/subdev-itf.c index d37a5a713689..13fa21a0469c 100644 --- a/drivers/media/platform/rockchip/cif/subdev-itf.c +++ b/drivers/media/platform/rockchip/cif/subdev-itf.c @@ -126,7 +126,9 @@ static int sditf_get_set_fmt(struct v4l2_subdev *sd, struct rkcif_device *cif_dev = priv->cif_dev; struct v4l2_subdev_selection input_sel; struct v4l2_pix_format_mplane pixm; + const struct cif_output_fmt *out_fmt; int ret = -EINVAL; + bool is_uncompact = false; if (!cif_dev->terminal_sensor.sd) rkcif_update_sensor_info(&cif_dev->stream[0]); @@ -157,6 +159,10 @@ static int sditf_get_set_fmt(struct v4l2_subdev *sd, pixm.pixelformat = rkcif_mbus_pixelcode_to_v4l2(fmt->format.code); pixm.width = priv->cap_info.width; pixm.height = priv->cap_info.height; + out_fmt = rkcif_find_output_fmt(NULL, pixm.pixelformat); + if (priv->toisp_inf.link_mode == TOISP_UNITE && + ((pixm.width / 2 - RKMOUDLE_UNITE_EXTEND_PIXEL) * out_fmt->raw_bpp / 8) & 0xf) + is_uncompact = true; v4l2_dbg(3, rkcif_debug, &cif_dev->v4l2_dev, "%s, width %d, height %d, hdr mode %d\n", __func__, fmt->format.width, fmt->format.height, priv->hdr_cfg.hdr_mode); @@ -164,9 +170,24 @@ static int sditf_get_set_fmt(struct v4l2_subdev *sd, priv->hdr_cfg.hdr_mode == HDR_COMPR) { rkcif_set_fmt(&cif_dev->stream[0], &pixm, false); } else if (priv->hdr_cfg.hdr_mode == HDR_X2) { + if (is_uncompact) { + cif_dev->stream[0].is_compact = false; + cif_dev->stream[0].is_high_align = true; + } else { + cif_dev->stream[0].is_compact = true; + } rkcif_set_fmt(&cif_dev->stream[0], &pixm, false); rkcif_set_fmt(&cif_dev->stream[1], &pixm, false); } else if (priv->hdr_cfg.hdr_mode == HDR_X3) { + if (is_uncompact) { + cif_dev->stream[0].is_compact = false; + cif_dev->stream[0].is_high_align = true; + cif_dev->stream[1].is_compact = false; + cif_dev->stream[1].is_high_align = true; + } else { + cif_dev->stream[0].is_compact = true; + cif_dev->stream[1].is_compact = true; + } rkcif_set_fmt(&cif_dev->stream[0], &pixm, false); rkcif_set_fmt(&cif_dev->stream[1], &pixm, false); rkcif_set_fmt(&cif_dev->stream[2], &pixm, false);