From f7fb9e42a9fec81c1155c3c697a2d84b15fcfb04 Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Thu, 8 Apr 2021 19:10:53 +0800 Subject: [PATCH] media: rockchip: ispp: optimize first frame memory copy Change-Id: I38803f1b8cb5bbe6fe53856037eb9214c0e85cbe Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/ispp/hw.c | 1 + drivers/media/platform/rockchip/ispp/hw.h | 1 + drivers/media/platform/rockchip/ispp/stream.c | 11 ++++++----- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/media/platform/rockchip/ispp/hw.c b/drivers/media/platform/rockchip/ispp/hw.c index 61569d45f368..bf707a156b90 100644 --- a/drivers/media/platform/rockchip/ispp/hw.c +++ b/drivers/media/platform/rockchip/ispp/hw.c @@ -327,6 +327,7 @@ static int rkispp_hw_probe(struct platform_device *pdev) hw_dev->is_dma_contig = true; hw_dev->is_shutdown = false; hw_dev->is_first = true; + hw_dev->first_frame_dma = -1; hw_dev->is_mmu = is_iommu_enable(dev); ret = of_reserved_mem_device_init(dev); if (ret) { diff --git a/drivers/media/platform/rockchip/ispp/hw.h b/drivers/media/platform/rockchip/ispp/hw.h index c31c16588861..8b79039ce3e8 100644 --- a/drivers/media/platform/rockchip/ispp/hw.h +++ b/drivers/media/platform/rockchip/ispp/hw.h @@ -53,6 +53,7 @@ struct rkispp_hw_dev { atomic_t refcnt; const struct vb2_mem_ops *mem_ops; struct rkisp_ispp_reg *reg_buf; + u32 first_frame_dma; bool is_mmu; bool is_idle; bool is_single; diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c index fbecd4360818..d3201b7ce01e 100644 --- a/drivers/media/platform/rockchip/ispp/stream.c +++ b/drivers/media/platform/rockchip/ispp/stream.c @@ -2537,6 +2537,10 @@ static void nr_work_event(struct rkispp_device *dev, dbuf = vdev->nr.cur_rd->dbuf[GROUP_BUF_PIC]; dummy = dbuf_to_dummy(dbuf, &vdev->tnr.buf.iir, size); val = dummy->dma_addr; + if (dev->hw_dev->is_first && dev->hw_dev->first_frame_dma != -1) { + val = dev->hw_dev->first_frame_dma; + dev->hw_dev->first_frame_dma = -1; + } rkispp_write(dev, RKISPP_NR_ADDR_BASE_Y, val); val += vdev->nr.uv_offset; rkispp_write(dev, RKISPP_NR_ADDR_BASE_UV, val); @@ -2718,13 +2722,10 @@ static void tnr_work_event(struct rkispp_device *dev, if (!buf_rd && !buf_wr && is_isr) { vdev->tnr.is_end = true; - if (dev->hw_dev->is_first && vdev->tnr.nxt_rd && vdev->tnr.cur_wr) { + if (dev->hw_dev->is_first && vdev->tnr.nxt_rd) { struct rkispp_isp_buf_pool *tbuf = get_pool_buf(dev, vdev->tnr.nxt_rd); - dbuf = vdev->tnr.cur_wr->dbuf[GROUP_BUF_PIC]; - dummy = dbuf_to_dummy(dbuf, &vdev->tnr.buf.iir, size); - memcpy(dummy->vaddr, tbuf->vaddr[GROUP_BUF_PIC], dummy->size); - rkispp_prepare_buffer(dev, dummy); + dev->hw_dev->first_frame_dma = tbuf->dma[GROUP_BUF_PIC]; } if (vdev->tnr.cur_rd) {