From d15d6373482e8927adaf2e23d5b4956a866c6b30 Mon Sep 17 00:00:00 2001 From: yuyz Date: Wed, 12 Jul 2023 09:46:41 +0800 Subject: [PATCH 1/7] ARM: dts: rockchip: Add core dtsi for RV1106G3 Signed-off-by: yuyz Change-Id: Ic6d78f2abb6cb73ecbf4045250aa235e49e267da --- arch/arm/boot/dts/rv1106g3.dtsi | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 arch/arm/boot/dts/rv1106g3.dtsi diff --git a/arch/arm/boot/dts/rv1106g3.dtsi b/arch/arm/boot/dts/rv1106g3.dtsi new file mode 100644 index 000000000000..89a83185bd17 --- /dev/null +++ b/arch/arm/boot/dts/rv1106g3.dtsi @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2023 Rockchip Electronics Co., Ltd. + */ + +#include "rv1106.dtsi" + +/ { + compatible = "rockchip,rv1106g3"; + +}; + +&cru { + assigned-clocks = + <&cru PLL_GPLL>, <&cru PLL_CPLL>, + <&cru ARMCLK>, + <&cru ACLK_PERI_ROOT>, <&cru HCLK_PERI_ROOT>, + <&cru PCLK_PERI_ROOT>, <&cru ACLK_BUS_ROOT>, + <&cru PCLK_TOP_ROOT>, <&cru PCLK_PMU_ROOT>, + <&cru HCLK_PMU_ROOT>, <&cru CLK_500M_SRC>; + assigned-clock-rates = + <1188000000>, <700000000>, + <1104000000>, + <400000000>, <200000000>, + <100000000>, <300000000>, + <100000000>, <100000000>, + <200000000>, <700000000>; +}; + +&npu { + assigned-clock-rates = <700000000>; +}; From bc09999632a46932534b6f9d3273bf727c5724b8 Mon Sep 17 00:00:00 2001 From: Sugar Zhang Date: Mon, 29 Jan 2024 10:09:01 +0800 Subject: [PATCH 2/7] ASoC: rockchip: trcm: Fix sleeping function called in atomic context BUG: sleeping function called from invalid context at include/linux/dmaengine.h:1158 in_atomic(): 1, irqs_disabled(): 128, non_block: 0, pid: 824, name: HwBinder:714_2 CPU: 3 PID: 824 Comm: HwBinder:714_2 Tainted: G W 5.10.198 #1023 Hardware name: Rockchip RK3588 EVB1 LP4 V10 Board (DT) Call trace: dump_backtrace+0x0/0x1dc show_stack+0x18/0x24 dump_stack_lvl+0xe4/0x12c dump_stack+0x18/0x3c ___might_sleep+0x110/0x120 __might_sleep+0x50/0x88 dmaengine_trcm_trigger+0x9c/0x2c4 snd_soc_pcm_component_trigger+0x70/0xd8 soc_pcm_trigger+0x90/0xb0 snd_pcm_stop+0xa0/0x140 snd_pcm_release_substream+0x8c/0x194 snd_pcm_release+0x40/0xa0 __fput+0xf0/0x260 ____fput+0x10/0x1c task_work_run+0x98/0xf8 do_notify_resume+0x120/0x21c work_pending+0xc/0x730 Signed-off-by: Sugar Zhang Change-Id: I368e3497287f497c7838c18ac28a967a802dd49b --- sound/soc/rockchip/rockchip_trcm.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sound/soc/rockchip/rockchip_trcm.c b/sound/soc/rockchip/rockchip_trcm.c index f9e9424a91f8..c2c5d8b28d2b 100644 --- a/sound/soc/rockchip/rockchip_trcm.c +++ b/sound/soc/rockchip/rockchip_trcm.c @@ -272,7 +272,7 @@ int dmaengine_trcm_dma_guard_ctrl(struct snd_soc_component *component, return 0; if (!en) - return dmaengine_terminate_sync(chan); + return dmaengine_terminate_async(chan); direction = stream ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV; @@ -304,7 +304,7 @@ static int dmaengine_trcm_trigger(struct snd_soc_component *component, switch (cmd) { case SNDRV_PCM_TRIGGER_START: - dmaengine_terminate_sync(prtd->dma_chan); + dmaengine_terminate_async(prtd->dma_chan); ret = dmaengine_trcm_prepare_and_submit(substream); if (ret) return ret; @@ -318,13 +318,13 @@ static int dmaengine_trcm_trigger(struct snd_soc_component *component, if (runtime->info & SNDRV_PCM_INFO_PAUSE) dmaengine_pause(prtd->dma_chan); else - dmaengine_terminate_sync(prtd->dma_chan); + dmaengine_terminate_async(prtd->dma_chan); break; case SNDRV_PCM_TRIGGER_PAUSE_PUSH: dmaengine_pause(prtd->dma_chan); break; case SNDRV_PCM_TRIGGER_STOP: - dmaengine_terminate_sync(prtd->dma_chan); + dmaengine_terminate_async(prtd->dma_chan); dmaengine_trcm_dma_guard_ctrl(component, substream->stream, 1); break; default: From b84a03e24ea88798a72547dcb21ef40234ed4b28 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Fri, 26 Jan 2024 10:31:04 +0800 Subject: [PATCH 3/7] media: rockchip: isp: fix isp stop to read stats buf Change-Id: Ieea391acda2ae44dfa0b26d063a057aec7162521 Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/isp_stats.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/isp_stats.c b/drivers/media/platform/rockchip/isp/isp_stats.c index d95315ee6d6d..5c223ae5045b 100644 --- a/drivers/media/platform/rockchip/isp/isp_stats.c +++ b/drivers/media/platform/rockchip/isp/isp_stats.c @@ -145,11 +145,12 @@ static void rkisp_stats_vb2_buf_queue(struct vb2_buffer *vb) struct rkisp_buffer *stats_buf = to_rkisp_buffer(vbuf); struct vb2_queue *vq = vb->vb2_queue; struct rkisp_isp_stats_vdev *stats_dev = vq->drv_priv; + struct rkisp_device *dev = stats_dev->dev; u32 size = stats_dev->vdev_fmt.fmt.meta.buffersize; unsigned long flags; stats_buf->vaddr[0] = vb2_plane_vaddr(vb, 0); - if (stats_dev->dev->isp_ver == ISP_V32) { + if (dev->isp_ver == ISP_V32) { struct sg_table *sgt = vb2_dma_sg_plane_desc(vb, 0); stats_buf->buff_addr[0] = sg_dma_address(sgt->sgl); @@ -157,11 +158,12 @@ static void rkisp_stats_vb2_buf_queue(struct vb2_buffer *vb) if (stats_buf->vaddr[0]) memset(stats_buf->vaddr[0], 0, size); spin_lock_irqsave(&stats_dev->rd_lock, flags); - if (stats_dev->dev->isp_ver == ISP_V32 && stats_dev->dev->is_pre_on) { + if (dev->isp_ver == ISP_V32 && dev->is_pre_on) { struct rkisp32_isp_stat_buffer *buf = stats_dev->stats_buf[0].vaddr; - if (buf && !buf->frame_id && buf->meas_type && stats_buf->vaddr[0]) { - dev_info(stats_dev->dev->dev, + if (dev->isp_state & ISP_START && stats_buf->vaddr[0] && + buf && !buf->frame_id && buf->meas_type) { + dev_info(dev->dev, "tb stat seq:%d meas_type:0x%x\n", buf->frame_id, buf->meas_type); memcpy(stats_buf->vaddr[0], buf, sizeof(struct rkisp32_isp_stat_buffer)); From dd09e02ea1e645a8ff4a8e78a933844f71a8ce95 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Tue, 9 Jan 2024 10:15:20 +0800 Subject: [PATCH 4/7] media: rockchip: isp: support multiple wrap Change-Id: Ic0388b6ff7595799164d1872c1303da4107397f2 Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/capture.c | 8 ++----- .../media/platform/rockchip/isp/capture_v32.c | 5 ----- .../media/platform/rockchip/isp/capture_v3x.h | 4 ++-- .../media/platform/rockchip/isp/isp_rockit.c | 21 ++++++++++++++++++- drivers/media/platform/rockchip/isp/rkisp.c | 4 ++++ 5 files changed, 28 insertions(+), 14 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/capture.c b/drivers/media/platform/rockchip/isp/capture.c index 99c26528fdfb..bad561885b92 100644 --- a/drivers/media/platform/rockchip/isp/capture.c +++ b/drivers/media/platform/rockchip/isp/capture.c @@ -1155,12 +1155,8 @@ static int rkisp_set_wrap_line(struct rkisp_stream *stream, struct rkisp_wrap_in { struct rkisp_device *dev = stream->ispdev; - if (dev->isp_ver != ISP_V32 || - dev->hw_dev->dev_link_num > 1 || - !stream->ops->set_wrap || - dev->hw_dev->unite) { - v4l2_err(&dev->v4l2_dev, - "wrap only support for single sensor and mainpath\n"); + if (!stream->ops->set_wrap) { + v4l2_err(&dev->v4l2_dev, "no support wrap\n"); return -EINVAL; } dev->cap_dev.wrap_width = arg->width; diff --git a/drivers/media/platform/rockchip/isp/capture_v32.c b/drivers/media/platform/rockchip/isp/capture_v32.c index 760414ab20fb..51e4b750ef7a 100644 --- a/drivers/media/platform/rockchip/isp/capture_v32.c +++ b/drivers/media/platform/rockchip/isp/capture_v32.c @@ -1364,11 +1364,6 @@ static int mi_frame_start(struct rkisp_stream *stream, u32 mis) unsigned long lock_flags = 0; u32 val; - if (stream->streaming && dev->isp_ver == ISP_V32) { - rkisp_rockit_buf_done(stream, ROCKIT_DVBM_START); - rkisp_rockit_ctrl_fps(stream); - } - /* readback start to update stream buf if null */ spin_lock_irqsave(&stream->vbq_lock, lock_flags); if (stream->streaming) { diff --git a/drivers/media/platform/rockchip/isp/capture_v3x.h b/drivers/media/platform/rockchip/isp/capture_v3x.h index 746290312de2..3071b11cc43a 100644 --- a/drivers/media/platform/rockchip/isp/capture_v3x.h +++ b/drivers/media/platform/rockchip/isp/capture_v3x.h @@ -30,7 +30,7 @@ void rkisp_rockit_buf_state_clear(struct rkisp_stream *stream); int rkisp_rockit_buf_free(struct rkisp_stream *stream); void rkisp_rockit_dev_init(struct rkisp_device *dev); void rkisp_rockit_dev_deinit(void); -bool rkisp_rockit_ctrl_fps(struct rkisp_stream *stream); +void rkisp_rockit_frame_start(struct rkisp_device *dev); int rkisp_rockit_fps_set(int *dst_fps, struct rkisp_stream *stream); int rkisp_rockit_fps_get(int *dst_fps, struct rkisp_stream *stream); int rkisp_rockit_buf_done(struct rkisp_stream *stream, int cmd); @@ -44,7 +44,7 @@ static inline void rkisp_rockit_buf_state_clear(struct rkisp_stream *stream) { r static inline int rkisp_rockit_buf_free(struct rkisp_stream *stream) { return -EINVAL; } static inline void rkisp_rockit_dev_init(struct rkisp_device *dev) { return; } static inline void rkisp_rockit_dev_deinit(void) {} -static inline bool rkisp_rockit_ctrl_fps(struct rkisp_stream *stream) { return false; } +static inline void rkisp_rockit_frame_start(struct rkisp_device *dev) {} static inline int rkisp_rockit_fps_set(int *dst_fps, struct rkisp_stream *stream) { return -EINVAL; } static inline int rkisp_rockit_fps_get(int *dst_fps, struct rkisp_stream *stream) { return -EINVAL; } static inline int rkisp_rockit_buf_done(struct rkisp_stream *stream, int cmd) { return -EINVAL; } diff --git a/drivers/media/platform/rockchip/isp/isp_rockit.c b/drivers/media/platform/rockchip/isp/isp_rockit.c index 67e7c615b0b2..6ff581044af9 100644 --- a/drivers/media/platform/rockchip/isp/isp_rockit.c +++ b/drivers/media/platform/rockchip/isp/isp_rockit.c @@ -598,7 +598,7 @@ int rkisp_rockit_fps_get(int *dst_fps, struct rkisp_stream *stream) return 0; } -bool rkisp_rockit_ctrl_fps(struct rkisp_stream *stream) +static bool rkisp_rockit_ctrl_fps(struct rkisp_stream *stream) { struct rkisp_device *dev = stream->ispdev; struct rkisp_sensor_info *sensor = NULL; @@ -676,6 +676,25 @@ bool rkisp_rockit_ctrl_fps(struct rkisp_stream *stream) return true; } +void rkisp_rockit_frame_start(struct rkisp_device *dev) +{ + struct rkisp_stream *stream; + int i; + + if (rockit_cfg == NULL) + return; + + for (i = 0; i < RKISP_MAX_STREAM; i++) { + if (i == RKISP_STREAM_VIR || i == RKISP_STREAM_LUMA) + continue; + stream = &dev->cap_dev.stream[i]; + if (!stream->streaming) + continue; + rkisp_rockit_buf_done(stream, ROCKIT_DVBM_START); + rkisp_rockit_ctrl_fps(stream); + } +} + void *rkisp_rockit_function_register(void *function, int cmd) { if (rockit_cfg == NULL) { diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index 73b170b2dfc6..b90a411b4622 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -724,6 +724,8 @@ void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, boo params_vdev->rdbk_times = dma2frm + 1; run_next: + if (!dev->sw_rd_cnt) + rkisp_rockit_frame_start(dev); rkisp_params_cfgsram(params_vdev, true); stats_vdev->rdbk_drop = false; if (dev->is_frame_double) { @@ -4191,6 +4193,7 @@ void rkisp_isp_isr(unsigned int isp_mis, dev->isp_sdev.frm_timestamp = rkisp_time_get_ns(dev); rkisp_isp_queue_event_sof(&dev->isp_sdev); rkisp_stream_frame_start(dev, isp_mis); + rkisp_rockit_frame_start(dev); } vs_skip: writel(CIF_ISP_V_START, base + CIF_ISP_ICR); @@ -4345,6 +4348,7 @@ vs_skip: dev->isp_sdev.frm_timestamp = rkisp_time_get_ns(dev); rkisp_isp_queue_event_sof(&dev->isp_sdev); rkisp_stream_frame_start(dev, isp_mis); + rkisp_rockit_frame_start(dev); } if (isp_mis & ISP3X_OUT_FRM_QUARTER) { From e601ffeb040b96b5616dbc3a91bcd13719935310 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Mon, 22 Jan 2024 15:44:16 +0800 Subject: [PATCH 5/7] media: rockchip: isp: dvbm buf support from rockit Change-Id: Icacd6c500b8e21830c0b44914e2d742f42e8cf75 Signed-off-by: Cai YiWei --- .../media/platform/rockchip/isp/capture_v32.c | 20 ++++++---- .../media/platform/rockchip/isp/isp_rockit.c | 39 +++++++++++++++---- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/capture_v32.c b/drivers/media/platform/rockchip/isp/capture_v32.c index 51e4b750ef7a..05de8743b707 100644 --- a/drivers/media/platform/rockchip/isp/capture_v32.c +++ b/drivers/media/platform/rockchip/isp/capture_v32.c @@ -752,7 +752,8 @@ static int mp_config_mi(struct rkisp_stream *stream) mi_frame_end_int_enable(stream); /* set up first buffer */ - mi_frame_end(stream, FRAME_INIT); + if (dev->cap_dev.wrap_line && stream->dummy_buf.mem_priv) + mi_frame_end(stream, FRAME_INIT); rkisp_unite_write(dev, stream->config->mi.y_offs_cnt_init, 0, false); rkisp_unite_write(dev, stream->config->mi.cb_offs_cnt_init, 0, false); @@ -1704,17 +1705,19 @@ static int rkisp_create_dummy_buf(struct rkisp_stream *stream) { struct rkisp_device *dev = stream->ispdev; struct rkisp_dummy_buffer *buf = &stream->dummy_buf; - int ret; + int ret = 0; /* mainpath for warp default */ if (!dev->cap_dev.wrap_line || stream->id != RKISP_STREAM_MP) return 0; - buf->size = dev->cap_dev.wrap_width * dev->cap_dev.wrap_line * 2; - if (stream->out_isp_fmt.output_format == ISP32_MI_OUTPUT_YUV420) - buf->size = buf->size - buf->size / 4; - buf->is_need_dbuf = true; - ret = rkisp_alloc_buffer(stream->ispdev, buf); + if (!buf->dma_addr) { + buf->size = dev->cap_dev.wrap_width * dev->cap_dev.wrap_line * 2; + if (stream->out_isp_fmt.output_format == ISP32_MI_OUTPUT_YUV420) + buf->size = buf->size - buf->size / 4; + buf->is_need_dbuf = true; + ret = rkisp_alloc_buffer(stream->ispdev, buf); + } if (ret == 0) { ret = rkisp_dvbm_init(stream); if (ret < 0) @@ -1732,6 +1735,7 @@ static void rkisp_destroy_dummy_buf(struct rkisp_stream *stream) return; rkisp_dvbm_deinit(); rkisp_free_buffer(dev, &stream->dummy_buf); + stream->dummy_buf.dma_addr = 0; } static void destroy_buf_queue(struct rkisp_stream *stream, @@ -2039,7 +2043,7 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count) goto buffer_done; if (dev->isp_ver == ISP_V32 && - count == 0 && !stream->dummy_buf.mem_priv && + count == 0 && !stream->dummy_buf.dma_addr && list_empty(&stream->buf_queue)) { v4l2_err(v4l2_dev, "no buf for %s\n", node->vdev.name); ret = -EINVAL; diff --git a/drivers/media/platform/rockchip/isp/isp_rockit.c b/drivers/media/platform/rockchip/isp/isp_rockit.c index 6ff581044af9..c8682492aaaf 100644 --- a/drivers/media/platform/rockchip/isp/isp_rockit.c +++ b/drivers/media/platform/rockchip/isp/isp_rockit.c @@ -90,6 +90,7 @@ int rkisp_rockit_buf_queue(struct rockit_cfg *input_rockit_cfg) void *mem = NULL; struct sg_table *sg_tbl; unsigned long lock_flags = 0; + u32 reg, val, bytesperline; if (!input_rockit_cfg) return -EINVAL; @@ -175,6 +176,20 @@ int rkisp_rockit_buf_queue(struct rockit_cfg *input_rockit_cfg) isprk_buf->isp_buf.buff_addr[i] = isprk_buf->buff_addr; } + if (ispdev->cap_dev.wrap_line && stream->id == RKISP_STREAM_MP && isprk_buf) { + val = isprk_buf->buff_addr; + reg = stream->config->mi.y_base_ad_init; + rkisp_write(ispdev, reg, val, false); + + bytesperline = stream->out_fmt.plane_fmt[0].bytesperline; + val += bytesperline * ispdev->cap_dev.wrap_line; + reg = stream->config->mi.cb_base_ad_init; + rkisp_write(ispdev, reg, val, false); + stream->dummy_buf.dma_addr = isprk_buf->buff_addr; + v4l2_info(&ispdev->v4l2_dev, "rockit wrap buf:0x%x\n", isprk_buf->buff_addr); + return -EINVAL; + } + if (stream_cfg->is_discard && stream->streaming) return -EINVAL; @@ -195,8 +210,8 @@ int rkisp_rockit_buf_queue(struct rockit_cfg *input_rockit_cfg) if (stream->out_isp_fmt.mplanes == 1) { for (i = 0; i < stream->out_isp_fmt.cplanes - 1; i++) { height = stream->out_fmt.height; - offset = (i == 0) ? - stream->out_fmt.plane_fmt[i].bytesperline * height : + bytesperline = stream->out_fmt.plane_fmt[i].bytesperline; + offset = (i == 0) ? bytesperline * height : stream->out_fmt.plane_fmt[i].sizeimage; isprk_buf->isp_buf.buff_addr[i + 1] = isprk_buf->isp_buf.buff_addr[i] + offset; @@ -331,6 +346,7 @@ int rkisp_rockit_config_stream(struct rockit_cfg *input_rockit_cfg, struct rkisp_buffer *isp_buf, *buf_temp; int offset, i, ret; unsigned long lock_flags = 0; + u32 reg, val, bytesperline; stream = rkisp_rockit_get_stream(input_rockit_cfg); @@ -347,8 +363,18 @@ int rkisp_rockit_config_stream(struct rockit_cfg *input_rockit_cfg, pr_err("stream id %d config failed\n", stream->id); return -EINVAL; } - if (stream->ispdev->cap_dev.wrap_line && stream->id == RKISP_STREAM_MP) + if (stream->ispdev->cap_dev.wrap_line && stream->id == RKISP_STREAM_MP) { rkisp_dvbm_init(stream); + if (!stream->dummy_buf.mem_priv && stream->dummy_buf.dma_addr) { + bytesperline = stream->out_fmt.plane_fmt[0].bytesperline; + val = stream->dummy_buf.dma_addr; + reg = stream->config->mi.y_base_ad_init; + rkisp_write(stream->ispdev, reg, val, false); + val += bytesperline * stream->ispdev->cap_dev.wrap_line; + reg = stream->config->mi.cb_base_ad_init; + rkisp_write(stream->ispdev, reg, val, false); + } + } spin_lock_irqsave(&stream->vbq_lock, lock_flags); if (stream->curr_buf) { @@ -365,11 +391,10 @@ int rkisp_rockit_config_stream(struct rockit_cfg *input_rockit_cfg, if (stream->out_isp_fmt.mplanes == 1) { for (i = 0; i < stream->out_isp_fmt.cplanes - 1; i++) { height = stream->out_fmt.height; - offset = (i == 0) ? - stream->out_fmt.plane_fmt[i].bytesperline * height : + bytesperline = stream->out_fmt.plane_fmt[i].bytesperline; + offset = (i == 0) ? bytesperline * height : stream->out_fmt.plane_fmt[i].sizeimage; - isp_buf->buff_addr[i + 1] = - isp_buf->buff_addr[i] + offset; + isp_buf->buff_addr[i + 1] = isp_buf->buff_addr[i] + offset; } } } From 14e857ea061292cf1e6a4fdc14f8bce8849284c8 Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Mon, 29 Jan 2024 14:33:20 +0800 Subject: [PATCH 6/7] video: rockchip: rga3: Add debug log when assign cores Change-Id: I9e601fa14da96224acb68ced88ac4580b32b6822 Signed-off-by: Yu Qiaowei --- drivers/video/rockchip/rga3/rga3_reg_info.c | 12 +- drivers/video/rockchip/rga3/rga_policy.c | 153 +++++++++++--------- 2 files changed, 92 insertions(+), 73 deletions(-) diff --git a/drivers/video/rockchip/rga3/rga3_reg_info.c b/drivers/video/rockchip/rga3/rga3_reg_info.c index 2b61833aa4a3..0ea4e8b2f6dd 100644 --- a/drivers/video/rockchip/rga3/rga3_reg_info.c +++ b/drivers/video/rockchip/rga3/rga3_reg_info.c @@ -1761,11 +1761,13 @@ static int rga3_scale_check(const struct rga3_req *req) win0_dah = req->win0.dst_act_h; if (((win0_saw >> 3) > win0_daw) || ((win0_sah >> 3) > win0_dah)) { - pr_info("win0 unsupported to scaling less than 1/8 times.\n"); + pr_info("win0 unsupported to scaling less than 1/8 times. src[%d, %d], dst[%d, %d]\n", + win0_saw, win0_sah, win0_daw, win0_dah); return -EINVAL; } if (((win0_daw >> 3) > win0_saw) || ((win0_dah >> 3) > win0_sah)) { - pr_info("win0 unsupported to scaling more than 8 times.\n"); + pr_info("win0 unsupported to scaling more than 8 times. src[%d, %d], dst[%d, %d]\n", + win0_saw, win0_sah, win0_daw, win0_dah); return -EINVAL; } @@ -1776,11 +1778,13 @@ static int rga3_scale_check(const struct rga3_req *req) win1_dah = req->win1.dst_act_h; if (((win1_saw >> 3) > win1_daw) || ((win1_sah >> 3) > win1_dah)) { - pr_info("win1 unsupported to scaling less than 1/8 times.\n"); + pr_info("win1 unsupported to scaling less than 1/8 times. src[%d, %d], dst[%d, %d]\n", + win1_saw, win1_sah, win1_daw, win1_dah); return -EINVAL; } if (((win1_daw >> 3) > win1_saw) || ((win1_dah >> 3) > win1_sah)) { - pr_info("win1 unsupported to scaling more than 8 times.\n"); + pr_info("win1 unsupported to scaling more than 8 times. src[%d, %d], dst[%d, %d]\n", + win1_saw, win1_sah, win1_daw, win1_dah); return -EINVAL; } } diff --git a/drivers/video/rockchip/rga3/rga_policy.c b/drivers/video/rockchip/rga3/rga_policy.c index c87ce1881cff..5aaeda5bbbf1 100644 --- a/drivers/video/rockchip/rga3/rga_policy.c +++ b/drivers/video/rockchip/rga3/rga_policy.c @@ -161,65 +161,55 @@ static bool rga_check_align(uint32_t byte_stride_align, uint32_t format, uint16_ return false; } -static bool rga_check_src0(const struct rga_hw_data *data, - struct rga_img_info_t *src0) +static bool rga_check_channel(const struct rga_hw_data *data, + struct rga_img_info_t *img, + const char *name, int input, int win_num) { - if (!rga_check_resolution(&data->input_range, src0->act_w, src0->act_h)) + const struct rga_rect_range *range; + + if (input) + range = &data->input_range; + else + range = &data->output_range; + + if (!rga_check_resolution(range, img->act_w, img->act_h)) { + if (DEBUGGER_EN(MSG)) + pr_info("%s resolution check error, input range[%dx%d ~ %dx%d], [w,h] = [%d, %d]\n", + name, + data->input_range.min.width, data->input_range.min.height, + data->input_range.max.width, data->input_range.max.height, + img->act_w, img->act_h); + return false; + } if (data == &rga3_data && !rga_check_resolution(&data->input_range, - src0->act_w + src0->x_offset, - src0->act_h + src0->y_offset)) + img->act_w + img->x_offset, + img->act_h + img->y_offset)) { + if (DEBUGGER_EN(MSG)) + pr_info("%s RGA3 resolution check error, input range[%dx%d ~ %dx%d], [w+x,h+y] = [%d, %d]\n", + name, + data->input_range.min.width, data->input_range.min.height, + data->input_range.max.width, data->input_range.max.height, + img->act_w + img->x_offset, + img->act_h + img->y_offset); return false; + } - if (!rga_check_format(data, src0->rd_mode, src0->format, 0)) + if (!rga_check_format(data, img->rd_mode, img->format, win_num)) { + if (DEBUGGER_EN(MSG)) + pr_info("%s format check error, mode = %#x, format = %#x\n", + name, img->rd_mode, img->format); return false; + } - if (!rga_check_align(data->byte_stride_align, src0->format, src0->vir_w)) - return false; - - return true; -} - -static bool rga_check_src1(const struct rga_hw_data *data, - struct rga_img_info_t *src1) -{ - if (!rga_check_resolution(&data->input_range, src1->act_w, src1->act_h)) - return false; - - if (data == &rga3_data && - !rga_check_resolution(&data->input_range, - src1->act_w + src1->x_offset, - src1->act_h + src1->y_offset)) - return false; - - if (!rga_check_format(data, src1->rd_mode, src1->format, 1)) - return false; - - if (!rga_check_align(data->byte_stride_align, src1->format, src1->vir_w)) - return false; - - return true; -} - -static bool rga_check_dst(const struct rga_hw_data *data, - struct rga_img_info_t *dst) -{ - if (!rga_check_resolution(&data->output_range, dst->act_w, dst->act_h)) - return false; - - if (data == &rga3_data && - !rga_check_resolution(&data->output_range, - dst->act_w + dst->x_offset, - dst->act_h + dst->y_offset)) - return false; - - if (!rga_check_format(data, dst->rd_mode, dst->format, 2)) - return false; - - if (!rga_check_align(data->byte_stride_align, dst->format, dst->vir_w)) + if (!rga_check_align(data->byte_stride_align, img->format, img->vir_w)) { + if (DEBUGGER_EN(MSG)) + pr_info("%s align check error, byte_stride_align[%d], format[%#x], vir_w[%d]\n", + name, data->byte_stride_align, img->format, img->vir_w); return false; + } return true; } @@ -247,21 +237,28 @@ static bool rga_check_scale(const struct rga_hw_data *data, if (sw > dw) { if ((sw >> data->max_downscale_factor) > dw) - return false; + goto check_error; } else if (sw < dw) { if ((sw << data->max_upscale_factor) < dw) - return false; + goto check_error; } if (sh > dh) { if ((sh >> data->max_downscale_factor) > dh) - return false; + goto check_error; } else if (sh < dh) { if ((sh << data->max_upscale_factor) < dh) - return false; + goto check_error; } return true; +check_error: + if (DEBUGGER_EN(MSG)) + pr_info("scale check error, scale limit[1/%d ~ %d], src[%d, %d], dst[%d, %d]\n", + (1 << data->max_downscale_factor), (1 << data->max_upscale_factor), + sw, sh, dw, dh); + + return false; } int rga_job_assign(struct rga_job *job) @@ -315,7 +312,7 @@ int rga_job_assign(struct rga_job *job) if (feature > 0) { if (!(feature & data->feature)) { if (DEBUGGER_EN(MSG)) - pr_info("core = %d, break on feature", + pr_info("core = %d, break on feature\n", scheduler->core); continue; } @@ -324,20 +321,38 @@ int rga_job_assign(struct rga_job *job) /* only colorfill need single win (colorpalette?) */ if (!(feature & 1)) { if (src1->yrgb_addr > 0) { - if ((!(src0->rd_mode & data->win[0].rd_mode)) || - (!(src1->rd_mode & data->win[1].rd_mode)) || - (!(dst->rd_mode & data->win[2].rd_mode))) { + if (!(src0->rd_mode & data->win[0].rd_mode)) { if (DEBUGGER_EN(MSG)) - pr_info("core = %d, ABC break on rd_mode", - scheduler->core); + pr_info("core[%#x], src0 break on rd_mode[%#x]\n", + scheduler->core, src0->rd_mode); + continue; + } + + if (!(src1->rd_mode & data->win[1].rd_mode)) { + if (DEBUGGER_EN(MSG)) + pr_info("core[%#x], src1 break on rd_mode[%#x]\n", + scheduler->core, src1->rd_mode); + continue; + } + + if (!(dst->rd_mode & data->win[2].rd_mode)) { + if (DEBUGGER_EN(MSG)) + pr_info("core[%#x], dst break on rd_mode[%#x]\n", + scheduler->core, dst->rd_mode); continue; } } else { - if ((!(src0->rd_mode & data->win[0].rd_mode)) || - (!(dst->rd_mode & data->win[2].rd_mode))) { + if (!(src0->rd_mode & data->win[0].rd_mode)) { if (DEBUGGER_EN(MSG)) - pr_info("core = %d, ABB break on rd_mode", - scheduler->core); + pr_info("core[%#x], src break on rd_mode[%#x]\n", + scheduler->core, src0->rd_mode); + continue; + } + + if (!(dst->rd_mode & data->win[2].rd_mode)) { + if (DEBUGGER_EN(MSG)) + pr_info("core[%#x], dst break on rd_mode[%#x]\n", + scheduler->core, dst->rd_mode); continue; } } @@ -349,26 +364,26 @@ int rga_job_assign(struct rga_job *job) continue; } - if (!rga_check_src0(data, src0)) { + if (!rga_check_channel(data, src0, "src0", true, 0)) { if (DEBUGGER_EN(MSG)) - pr_info("core = %d, break on rga_check_src0", + pr_info("core = %d, break on src0", scheduler->core); continue; } if (src1->yrgb_addr > 0) { - if (!rga_check_src1(data, src1)) { + if (!rga_check_channel(data, src1, "src1", true, 1)) { if (DEBUGGER_EN(MSG)) - pr_info("core = %d, break on rga_check_src1", + pr_info("core = %d, break on src1", scheduler->core); continue; } } } - if (!rga_check_dst(data, dst)) { + if (!rga_check_channel(data, dst, "dst", false, 2)) { if (DEBUGGER_EN(MSG)) - pr_info("core = %d, break on rga_check_dst", + pr_info("core = %d, break on dst", scheduler->core); continue; } From 0b97d73d8e712e12e7fdea55e59bc0a21bf50b4c Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Mon, 29 Jan 2024 15:32:09 +0800 Subject: [PATCH 7/7] video: rockchip: rga3: fix the wrong check of resolution in RGA3 rotating Change-Id: If135f3cbb80f30e0a7de18ce293b188318603fde Signed-off-by: Yu Qiaowei --- drivers/video/rockchip/rga3/rga3_reg_info.c | 53 +++++++++++++++++---- drivers/video/rockchip/rga3/rga_policy.c | 11 +---- 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/drivers/video/rockchip/rga3/rga3_reg_info.c b/drivers/video/rockchip/rga3/rga3_reg_info.c index 0ea4e8b2f6dd..1de0632187c3 100644 --- a/drivers/video/rockchip/rga3/rga3_reg_info.c +++ b/drivers/video/rockchip/rga3/rga3_reg_info.c @@ -1755,10 +1755,50 @@ static int rga3_scale_check(const struct rga3_req *req) u32 win0_saw, win0_sah, win0_daw, win0_dah; u32 win1_saw, win1_sah, win1_daw, win1_dah; - win0_saw = req->win0.src_act_w; - win0_sah = req->win0.src_act_h; - win0_daw = req->win0.dst_act_w; - win0_dah = req->win0.dst_act_h; + if (req->rotate_mode & RGA3_ROT_BIT_ROT_90) { + if (req->win1.yrgb_addr != 0) { + /* ABB */ + if (req->win0.yrgb_addr == req->wr.yrgb_addr) { + /* win0 do not need rotate, but net equal to wr */ + win0_saw = req->win0.src_act_h; + win0_sah = req->win0.src_act_w; + win0_daw = req->win0.dst_act_h; + win0_dah = req->win0.dst_act_w; + + win1_saw = req->win1.dst_act_w; + win1_sah = req->win1.dst_act_h; + win1_daw = req->win1.dst_act_h; + win1_dah = req->win1.dst_act_w; + } else { + win0_saw = req->win0.src_act_w; + win0_sah = req->win0.src_act_h; + win0_daw = req->win0.dst_act_w; + win0_dah = req->win0.dst_act_h; + + win1_saw = req->win1.src_act_w; + win1_sah = req->win1.src_act_h; + win1_daw = req->win1.dst_act_w; + win1_dah = req->win1.dst_act_h; + } + } else { + win0_saw = req->win0.src_act_w; + win0_sah = req->win0.src_act_h; + win0_daw = req->win0.dst_act_h; + win0_dah = req->win0.dst_act_w; + } + } else { + win0_saw = req->win0.src_act_w; + win0_sah = req->win0.src_act_h; + win0_daw = req->win0.dst_act_w; + win0_dah = req->win0.dst_act_h; + + if (req->win1.yrgb_addr != 0) { + win1_saw = req->win1.src_act_w; + win1_sah = req->win1.src_act_h; + win1_daw = req->win1.dst_act_w; + win1_dah = req->win1.dst_act_h; + } + } if (((win0_saw >> 3) > win0_daw) || ((win0_sah >> 3) > win0_dah)) { pr_info("win0 unsupported to scaling less than 1/8 times. src[%d, %d], dst[%d, %d]\n", @@ -1772,11 +1812,6 @@ static int rga3_scale_check(const struct rga3_req *req) } if (req->win1.yrgb_addr != 0) { - win1_saw = req->win1.src_act_w; - win1_sah = req->win1.src_act_h; - win1_daw = req->win1.dst_act_w; - win1_dah = req->win1.dst_act_h; - if (((win1_saw >> 3) > win1_daw) || ((win1_sah >> 3) > win1_dah)) { pr_info("win1 unsupported to scaling less than 1/8 times. src[%d, %d], dst[%d, %d]\n", win1_saw, win1_sah, win1_daw, win1_dah); diff --git a/drivers/video/rockchip/rga3/rga_policy.c b/drivers/video/rockchip/rga3/rga_policy.c index 5aaeda5bbbf1..fe13808cb5d7 100644 --- a/drivers/video/rockchip/rga3/rga_policy.c +++ b/drivers/video/rockchip/rga3/rga_policy.c @@ -225,15 +225,8 @@ static bool rga_check_scale(const struct rga_hw_data *data, sw = src0->act_w; sh = src0->act_h; - - if ((rga_base->sina == 65536 && rga_base->cosa == 0) - || (rga_base->sina == -65536 && rga_base->cosa == 0)) { - dw = dst->act_h; - dh = dst->act_w; - } else { - dw = dst->act_w; - dh = dst->act_h; - } + dw = dst->act_w; + dh = dst->act_h; if (sw > dw) { if ((sw >> data->max_downscale_factor) > dw)