From 93b52078a6e513590efa3222cfe0ae09c4b3ff9a Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Wed, 31 Mar 2021 14:04:15 +0800 Subject: [PATCH] media: rockchip: isp: update procfs info Change-Id: I48d64f9e579ca6eee1af5b707420a055e5b1b17f Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/capture.h | 2 + .../media/platform/rockchip/isp/capture_v20.c | 7 + .../media/platform/rockchip/isp/capture_v21.c | 7 + drivers/media/platform/rockchip/isp/csi.c | 1 + drivers/media/platform/rockchip/isp/hw.c | 85 +++--- drivers/media/platform/rockchip/isp/procfs.c | 266 +++++++++++++----- drivers/media/platform/rockchip/isp/rkisp.c | 12 +- drivers/media/platform/rockchip/isp/rkisp.h | 3 + 8 files changed, 271 insertions(+), 112 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/capture.h b/drivers/media/platform/rockchip/isp/capture.h index 17b5b3c70c55..96d552e76e92 100644 --- a/drivers/media/platform/rockchip/isp/capture.h +++ b/drivers/media/platform/rockchip/isp/capture.h @@ -38,6 +38,7 @@ #include "common.h" #include "capture_v1x.h" #include "capture_v2x.h" +#include "isp_ispp.h" #define RDBK_MAX 3 #define RDBK_L 0 @@ -223,6 +224,7 @@ struct rkisp_stream { wait_queue_head_t done; unsigned int burst; atomic_t sequence; + struct frame_debug_info dbg; union { struct rkisp_stream_sp sp; struct rkisp_stream_mp mp; diff --git a/drivers/media/platform/rockchip/isp/capture_v20.c b/drivers/media/platform/rockchip/isp/capture_v20.c index f7fd6b830455..4987edce1902 100644 --- a/drivers/media/platform/rockchip/isp/capture_v20.c +++ b/drivers/media/platform/rockchip/isp/capture_v20.c @@ -1385,6 +1385,13 @@ static int mi_frame_end(struct rkisp_stream *stream) ns = ktime_get_ns(); vb2_buf->timestamp = ns; + ns = ktime_get_ns(); + stream->dbg.interval = ns - stream->dbg.timestamp; + stream->dbg.timestamp = ns; + stream->dbg.id = stream->curr_buf->vb.sequence; + if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP) + stream->dbg.delay = ns - dev->isp_sdev.frm_timestamp; + if (is_rdbk_stream(stream) && dev->dmarx_dev.trigger == T_MANUAL) { if (stream->id == RKISP_STREAM_DMATX0) { diff --git a/drivers/media/platform/rockchip/isp/capture_v21.c b/drivers/media/platform/rockchip/isp/capture_v21.c index b6c71a240cb9..9c033e1b6b13 100644 --- a/drivers/media/platform/rockchip/isp/capture_v21.c +++ b/drivers/media/platform/rockchip/isp/capture_v21.c @@ -738,6 +738,13 @@ static int mi_frame_end(struct rkisp_stream *stream) ns = ktime_get_ns(); vb2_buf->timestamp = ns; + ns = ktime_get_ns(); + stream->dbg.interval = ns - stream->dbg.timestamp; + stream->dbg.timestamp = ns; + stream->dbg.id = stream->curr_buf->vb.sequence; + if (stream->id == RKISP_STREAM_MP || stream->id == RKISP_STREAM_SP) + stream->dbg.delay = ns - dev->isp_sdev.frm_timestamp; + if (is_rdbk_stream(stream) && dev->dmarx_dev.trigger == T_MANUAL) { if (stream->id == RKISP_STREAM_DMATX0) { diff --git a/drivers/media/platform/rockchip/isp/csi.c b/drivers/media/platform/rockchip/isp/csi.c index f949f392b5ce..6b533a6ed76f 100644 --- a/drivers/media/platform/rockchip/isp/csi.c +++ b/drivers/media/platform/rockchip/isp/csi.c @@ -658,6 +658,7 @@ static void rkisp_dev_trigger_handle(struct rkisp_device *dev, u32 cmd) isp->dmarx_dev.cur_frame.id = t.frame_id; isp->dmarx_dev.cur_frame.sof_timestamp = t.sof_timestamp; isp->dmarx_dev.cur_frame.timestamp = t.frame_timestamp; + isp->isp_sdev.frm_timestamp = t.sof_timestamp; mode = t.mode; times = t.times; hw->cur_dev_id = id; diff --git a/drivers/media/platform/rockchip/isp/hw.c b/drivers/media/platform/rockchip/isp/hw.c index 728bffd925c0..686de2f208e9 100644 --- a/drivers/media/platform/rockchip/isp/hw.c +++ b/drivers/media/platform/rockchip/isp/hw.c @@ -41,49 +41,52 @@ struct isp_irqs_data { /* using default value if reg no write for multi device */ static void default_sw_reg_flag(struct rkisp_device *dev) { - u32 reg[] = { - CTRL_VI_ISP_PATH, - IMG_EFF_CTRL, - SUPER_IMP_CTRL, - ISP_FLASH_CMD, - ISP_SHUTTER_CTRL, - ISP_CCM_CTRL, - CPROC_CTRL, - DUAL_CROP_CTRL, - ISP_GAMMA_OUT_CTRL, - ISP_GAMMA_OUT_CTRL, - ISP_LSC_CTRL, - ISP_DEBAYER_CONTROL, - ISP_WDR_CTRL, - ISP_GIC_CONTROL, - ISP_BLS_CTRL, - ISP_DPCC0_MODE, - ISP_DPCC1_MODE, - ISP_DPCC2_MODE, - ISP_HDRMGE_CTRL, - ISP_HDRTMO_CTRL, - ISP_RAWNR_CTRL, - ISP_LDCH_STS, - ISP_DHAZ_CTRL, - ISP_3DLUT_CTRL, - ISP_GAIN_CTRL, - ISP_AFM_CTRL, - ISP_HIST_HIST_CTRL, - RAWAE_BIG1_BASE, - RAWAE_BIG2_BASE, - RAWAE_BIG3_BASE, - ISP_RAWAE_LITE_CTRL, - ISP_RAWHIST_LITE_CTRL, - ISP_RAWHIST_BIG1_BASE, - ISP_RAWHIST_BIG2_BASE, - ISP_RAWHIST_BIG3_BASE, - ISP_YUVAE_CTRL, - ISP_RAWAF_CTRL, - ISP_RAWAWB_CTRL, + u32 v20_reg[] = { + CTRL_VI_ISP_PATH, IMG_EFF_CTRL, ISP_CCM_CTRL, + CPROC_CTRL, DUAL_CROP_CTRL, ISP_GAMMA_OUT_CTRL, + ISP_LSC_CTRL, ISP_DEBAYER_CONTROL, ISP_WDR_CTRL, + ISP_GIC_CONTROL, ISP_BLS_CTRL, ISP_DPCC0_MODE, + ISP_DPCC1_MODE, ISP_DPCC2_MODE, ISP_HDRMGE_CTRL, + ISP_HDRTMO_CTRL, ISP_RAWNR_CTRL, ISP_LDCH_STS, + ISP_DHAZ_CTRL, ISP_3DLUT_CTRL, ISP_GAIN_CTRL, + ISP_AFM_CTRL, ISP_HIST_HIST_CTRL, RAWAE_BIG1_BASE, + RAWAE_BIG2_BASE, RAWAE_BIG3_BASE, ISP_RAWAE_LITE_CTRL, + ISP_RAWHIST_LITE_CTRL, ISP_RAWHIST_BIG1_BASE, + ISP_RAWHIST_BIG2_BASE, ISP_RAWHIST_BIG3_BASE, + ISP_YUVAE_CTRL, ISP_RAWAF_CTRL, ISP_RAWAWB_CTRL, }; - u32 i, *flag; + u32 v21_reg[] = { + CTRL_VI_ISP_PATH, IMG_EFF_CTRL, ISP_CCM_CTRL, + CPROC_CTRL, DUAL_CROP_CTRL, ISP_GAMMA_OUT_CTRL, + SELF_RESIZE_CTRL, MAIN_RESIZE_CTRL, ISP_LSC_CTRL, + ISP_DEBAYER_CONTROL, ISP21_YNR_GLOBAL_CTRL, + ISP21_CNR_CTRL, ISP21_SHARP_SHARP_EN, ISP_GIC_CONTROL, + ISP_BLS_CTRL, ISP_DPCC0_MODE, ISP_DPCC1_MODE, + ISP_HDRMGE_CTRL, ISP21_DRC_CTRL0, ISP21_BAYNR_CTRL, + ISP21_BAY3D_CTRL, ISP_LDCH_STS, ISP21_DHAZ_CTRL, + ISP_3DLUT_CTRL, ISP_AFM_CTRL, ISP_HIST_HIST_CTRL, + RAWAE_BIG1_BASE, RAWAE_BIG2_BASE, RAWAE_BIG3_BASE, + ISP_RAWAE_LITE_CTRL, ISP_RAWHIST_LITE_CTRL, + ISP_RAWHIST_BIG1_BASE, ISP_RAWHIST_BIG2_BASE, + ISP_RAWHIST_BIG3_BASE, ISP_YUVAE_CTRL, ISP_RAWAF_CTRL, + ISP21_RAWAWB_CTRL, + }; + u32 i, *flag, *reg, size; - for (i = 0; i < ARRAY_SIZE(reg); i++) { + switch (dev->isp_ver) { + case ISP_V20: + reg = v20_reg; + size = ARRAY_SIZE(v20_reg); + break; + case ISP_V21: + reg = v21_reg; + size = ARRAY_SIZE(v21_reg); + break; + default: + return; + } + + for (i = 0; i < size; i++) { flag = dev->sw_base_addr + reg[i] + RKISP_ISP_SW_REG_SIZE; *flag = SW_REG_CACHE; } diff --git a/drivers/media/platform/rockchip/isp/procfs.c b/drivers/media/platform/rockchip/isp/procfs.c index 41aa0bf27abe..0200dac60dad 100644 --- a/drivers/media/platform/rockchip/isp/procfs.c +++ b/drivers/media/platform/rockchip/isp/procfs.c @@ -12,13 +12,10 @@ #include "regs_v2x.h" #ifdef CONFIG_PROC_FS -static int isp_show(struct seq_file *p, void *v) + +static void isp20_show(struct rkisp_device *dev, struct seq_file *p) { - struct rkisp_device *dev = p->private; - struct rkisp_isp_subdev *sdev = &dev->isp_sdev; - struct rkisp_sensor_info *sensor = dev->active_sensor; u32 full_range_flg = CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA | CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA; - u32 val = 0; static const char * const effect[] = { "BLACKWHITE", "NEGATIVE", @@ -29,70 +26,7 @@ static int isp_show(struct seq_file *p, void *v) "SHARPEN", "RKSHARPEN" }; - - seq_printf(p, "%-10s Version:v%02x.%02x.%02x\n", - dev->name, - RKISP_DRIVER_VERSION >> 16, - (RKISP_DRIVER_VERSION & 0xff00) >> 8, - RKISP_DRIVER_VERSION & 0x00ff); - for (val = 0; val < dev->hw_dev->num_clks; val++) { - seq_printf(p, "%-10s %ld\n", - dev->hw_dev->match_data->clks[val], - clk_get_rate(dev->hw_dev->clks[val])); - } - if (!(dev->isp_state & ISP_START)) - return 0; - - seq_printf(p, "%-10s Cnt:%d ErrCnt:%d\n", - "Interrupt", - dev->isp_isr_cnt, - dev->isp_err_cnt); - - if (sensor && sensor->fi.interval.numerator) - val = sensor->fi.interval.denominator / sensor->fi.interval.numerator; - seq_printf(p, "%-10s %s Format:%s Size:%dx%d@%dfps Offset(%d,%d)\n", - "Input", - sensor ? sensor->sd->name : NULL, - sdev->in_fmt.name, - sdev->in_crop.width, sdev->in_crop.height, val, - sdev->in_crop.left, sdev->in_crop.top); - if (IS_HDR_RDBK(dev->hdr.op_mode)) - seq_printf(p, "%-10s mode:frame%d (frame:%d rate:%dms %s) cnt(total:%d X1:%d X2:%d X3:%d)\n", - "Isp Read", - dev->csi_dev.rd_mode - 3, - dev->dmarx_dev.cur_frame.id, - (u32)(dev->dmarx_dev.cur_frame.timestamp - dev->dmarx_dev.pre_frame.timestamp) / 1000 / 1000, - (dev->isp_state & ISP_FRAME_END) ? "idle" : "working", - dev->csi_dev.frame_cnt, - dev->csi_dev.frame_cnt_x1, - dev->csi_dev.frame_cnt_x2, - dev->csi_dev.frame_cnt_x3); - seq_printf(p, "%-10s rkispp%d %s Format:%s%s Size:%dx%d (frame:%d rate:%dms)\n", - "Output", - dev->dev_id, - dev->br_dev.en ? "ON" : "OFF", - (dev->br_dev.work_mode & ISP_ISPP_FBC) ? "FBC" : "YUV", - (dev->br_dev.work_mode & ISP_ISPP_422) ? "422" : "420", - dev->br_dev.crop.width, - dev->br_dev.crop.height, - dev->br_dev.dbg.id, - dev->br_dev.dbg.interval / 1000 / 1000); - for (val = 0; val < RKISP_MAX_STREAM; val++) { - struct rkisp_stream *stream = &dev->cap_dev.stream[val]; - - if (!stream->streaming) - continue; - seq_printf(p, "%-10s %s Format:%c%c%c%c Size:%dx%d frame:%d\n", - "Output", - stream->vnode.vdev.name, - stream->out_fmt.pixelformat, - stream->out_fmt.pixelformat >> 8, - stream->out_fmt.pixelformat >> 16, - stream->out_fmt.pixelformat >> 24, - stream->out_fmt.width, - stream->out_fmt.height, - atomic_read(&stream->sequence) - 1); - } + u32 val; val = rkisp_read(dev, ISP_DPCC0_MODE, false); seq_printf(p, "%-10s %s(0x%x)\n", "DPCC0", (val & 1) ? "ON" : "OFF", val); @@ -175,6 +109,200 @@ static int isp_show(struct seq_file *p, void *v) seq_printf(p, "%-10s %s(0x%x)\n", "RAWHIST2", (val & 1) ? "ON" : "OFF", val); val = rkisp_read(dev, ISP_RAWHIST_BIG1_BASE, false); seq_printf(p, "%-10s %s(0x%x)\n", "RAWHIST3", (val & 1) ? "ON" : "OFF", val); +} + +static void isp21_show(struct rkisp_device *dev, struct seq_file *p) +{ + u32 full_range_flg = CIF_ISP_CTRL_ISP_CSM_Y_FULL_ENA | CIF_ISP_CTRL_ISP_CSM_C_FULL_ENA; + static const char * const effect[] = { + "BLACKWHITE", + "NEGATIVE", + "SEPIA", + "COLOR_SEL", + "EMBOSS", + "SKETCH", + "SHARPEN", + "RKSHARPEN" + }; + u32 val; + + val = rkisp_read(dev, ISP_DPCC0_MODE, false); + seq_printf(p, "%-10s %s(0x%x)\n", "DPCC0", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP_DPCC1_MODE, false); + seq_printf(p, "%-10s %s(0x%x)\n", "DPCC1", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP_BLS_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "BLS", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, CIF_ISP_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "SDG", + (val & CIF_ISP_CTRL_ISP_GAMMA_IN_ENA) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP_LSC_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "LSC", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, CIF_ISP_CTRL, false); + seq_printf(p, "%-10s %s(0x%x) (gain: 0x%08x, 0x%08x)\n", "AWBGAIN", + (val & CIF_ISP_CTRL_ISP_AWB_ENA) ? "ON" : "OFF", val, + rkisp_read(dev, CIF_ISP_AWB_GAIN_G_V12, false), + rkisp_read(dev, CIF_ISP_AWB_GAIN_RB_V12, false)); + val = rkisp_read(dev, ISP_DEBAYER_CONTROL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "DEBAYER", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP_CCM_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "CCM", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP_GAMMA_OUT_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "GAMMA_OUT", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, CPROC_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "CPROC", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, CIF_IMG_EFF_CTRL, false); + seq_printf(p, "%-10s %s(0x%x) (effect: %s)\n", "IE", + (val & 1) ? "ON" : "OFF", val, + effect[(val & CIF_IMG_EFF_CTRL_MODE_MASK) >> 1]); + val = rkisp_read(dev, ISP21_DRC_CTRL0, false); + seq_printf(p, "%-10s %s(0x%x)\n", "HDRTMO", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP_HDRMGE_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "HDRMGE", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP21_BAYNR_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "BAYNR", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP21_BAY3D_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "BAY3D", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP21_YNR_GLOBAL_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "YNR", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP21_CNR_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "CNR", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP21_SHARP_SHARP_EN, false); + seq_printf(p, "%-10s %s(0x%x)\n", "SHARP", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP_GIC_CONTROL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "GIC", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP_DHAZ_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "DHAZ", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP_3DLUT_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "3DLUT", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP_LDCH_STS, false); + seq_printf(p, "%-10s %s(0x%x)\n", "LDCH", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "CSM", + (val & full_range_flg) ? "FULL" : "LIMITED", val); + + val = rkisp_read(dev, ISP_AFM_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "SIAF", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, CIF_ISP_AWB_PROP_V10, false); + seq_printf(p, "%-10s %s(0x%x)\n", "SIAWB", + (val & CIF_ISP_AWB_ENABLE) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP_YUVAE_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "YUVAE", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP_HIST_HIST_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "SIHST", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP_RAWAF_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "RAWAF", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP21_RAWAWB_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "RAWAWB", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP_RAWAE_LITE_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "RAWAE0", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, RAWAE_BIG2_BASE, false); + seq_printf(p, "%-10s %s(0x%x)\n", "RAWAE1", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, RAWAE_BIG3_BASE, false); + seq_printf(p, "%-10s %s(0x%x)\n", "RAWAE2", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, RAWAE_BIG1_BASE, false); + seq_printf(p, "%-10s %s(0x%x)\n", "RAWAE3", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP_RAWHIST_LITE_CTRL, false); + seq_printf(p, "%-10s %s(0x%x)\n", "RAWHIST0", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP_RAWHIST_BIG2_BASE, false); + seq_printf(p, "%-10s %s(0x%x)\n", "RAWHIST1", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP_RAWHIST_BIG3_BASE, false); + seq_printf(p, "%-10s %s(0x%x)\n", "RAWHIST2", (val & 1) ? "ON" : "OFF", val); + val = rkisp_read(dev, ISP_RAWHIST_BIG1_BASE, false); + seq_printf(p, "%-10s %s(0x%x)\n", "RAWHIST3", (val & 1) ? "ON" : "OFF", val); +} + +static int isp_show(struct seq_file *p, void *v) +{ + struct rkisp_device *dev = p->private; + struct rkisp_isp_subdev *sdev = &dev->isp_sdev; + struct rkisp_sensor_info *sensor = dev->active_sensor; + u32 val = 0; + + seq_printf(p, "%-10s Version:v%02x.%02x.%02x\n", + dev->name, + RKISP_DRIVER_VERSION >> 16, + (RKISP_DRIVER_VERSION & 0xff00) >> 8, + RKISP_DRIVER_VERSION & 0x00ff); + for (val = 0; val < dev->hw_dev->num_clks; val++) { + seq_printf(p, "%-10s %ld\n", + dev->hw_dev->match_data->clks[val], + clk_get_rate(dev->hw_dev->clks[val])); + } + if (!(dev->isp_state & ISP_START)) + return 0; + + seq_printf(p, "%-10s Cnt:%d ErrCnt:%d\n", + "Interrupt", + dev->isp_isr_cnt, + dev->isp_err_cnt); + + if (sensor && sensor->fi.interval.numerator) + val = sensor->fi.interval.denominator / sensor->fi.interval.numerator; + seq_printf(p, "%-10s %s Format:%s Size:%dx%d@%dfps Offset(%d,%d)\n", + "Input", + sensor ? sensor->sd->name : NULL, + sdev->in_fmt.name, + sdev->in_crop.width, sdev->in_crop.height, val, + sdev->in_crop.left, sdev->in_crop.top); + if (IS_HDR_RDBK(dev->hdr.op_mode)) + seq_printf(p, "%-10s mode:frame%d (frame:%d rate:%dms %s time:%dms) cnt(total:%d X1:%d X2:%d X3:%d)\n", + "Isp Read", + dev->csi_dev.rd_mode - 3, + dev->dmarx_dev.cur_frame.id, + (u32)(dev->dmarx_dev.cur_frame.timestamp - dev->dmarx_dev.pre_frame.timestamp) / 1000 / 1000, + (dev->isp_state & ISP_FRAME_END) ? "idle" : "working", + sdev->dbg.interval / 1000 / 1000, + dev->csi_dev.frame_cnt, + dev->csi_dev.frame_cnt_x1, + dev->csi_dev.frame_cnt_x2, + dev->csi_dev.frame_cnt_x3); + else + seq_printf(p, "%-10s frame:%d %s time:%dms\n", + "Isp online", + sdev->dbg.id, + (dev->isp_state & ISP_FRAME_END) ? "idle" : "working", + sdev->dbg.interval / 1000 / 1000); + + if (dev->br_dev.en) + seq_printf(p, "%-10s rkispp%d Format:%s%s Size:%dx%d (frame:%d rate:%dms)\n", + "Output", + dev->dev_id, + (dev->br_dev.work_mode & ISP_ISPP_FBC) ? "FBC" : "YUV", + (dev->br_dev.work_mode & ISP_ISPP_422) ? "422" : "420", + dev->br_dev.crop.width, + dev->br_dev.crop.height, + dev->br_dev.dbg.id, + dev->br_dev.dbg.interval / 1000 / 1000); + for (val = 0; val < RKISP_MAX_STREAM; val++) { + struct rkisp_stream *stream = &dev->cap_dev.stream[val]; + + if (!stream->streaming) + continue; + seq_printf(p, "%-10s %s Format:%c%c%c%c Size:%dx%d (frame:%d rate:%dms delay:%dms)\n", + "Output", + stream->vnode.vdev.name, + stream->out_fmt.pixelformat, + stream->out_fmt.pixelformat >> 8, + stream->out_fmt.pixelformat >> 16, + stream->out_fmt.pixelformat >> 24, + stream->out_fmt.width, + stream->out_fmt.height, + stream->dbg.id, + stream->dbg.interval / 1000 / 1000, + stream->dbg.delay / 1000 / 1000); + } + + switch (dev->isp_ver) { + case ISP_V20: + isp20_show(dev, p); + break; + case ISP_V21: + isp21_show(dev, p); + break; + default: + break; + } + return 0; } diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index 877af353218a..43d07a9bd549 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -1836,6 +1836,8 @@ rkisp_isp_queue_event_sof(struct rkisp_isp_subdev *isp) .u.frame_sync.frame_sequence = atomic_inc_return(&isp->frm_sync_seq) - 1, }; + + event.timestamp = ns_to_timespec(ktime_get_ns()); v4l2_event_queue(isp->sd.devnode, &event); } @@ -2318,6 +2320,8 @@ void rkisp_isp_isr(unsigned int isp_mis, dev->isp_isr_cnt++; /* start edge of v_sync */ if (isp_mis & CIF_ISP_V_START) { + if (!(dev->isp_state & ISP_FRAME_VS)) + dev->isp_sdev.dbg.timestamp = ktime_get_ns(); rkisp_set_state(dev, ISP_FRAME_VS); /* last vsync to config next buf */ if (!dev->csi_dev.filt_state[CSI_F_VS]) @@ -2352,8 +2356,10 @@ void rkisp_isp_isr(unsigned int isp_mis, } } - if (dev->vs_irq < 0) + if (dev->vs_irq < 0) { + dev->isp_sdev.frm_timestamp = ktime_get_ns(); rkisp_isp_queue_event_sof(&dev->isp_sdev); + } vs_skip: writel(CIF_ISP_V_START, base + CIF_ISP_ICR); isp_mis_tmp = readl(base + CIF_ISP_MIS); @@ -2410,6 +2416,8 @@ vs_skip: /* frame was completely put out */ if (isp_mis & CIF_ISP_FRAME) { + dev->isp_sdev.dbg.interval = + ktime_get_ns() - dev->isp_sdev.dbg.timestamp; /* Clear Frame In (ISP) */ rkisp_set_state(dev, ISP_FRAME_END); writel(CIF_ISP_FRAME, base + CIF_ISP_ICR); @@ -2417,7 +2425,7 @@ vs_skip: if (isp_mis_tmp & CIF_ISP_FRAME) v4l2_err(&dev->v4l2_dev, "isp icr frame end err: 0x%x\n", isp_mis_tmp); - + rkisp_dmarx_get_frame(dev, &dev->isp_sdev.dbg.id, NULL, NULL, true); rkisp_isp_read_add_fifo_data(dev); } diff --git a/drivers/media/platform/rockchip/isp/rkisp.h b/drivers/media/platform/rockchip/isp/rkisp.h index b10700be7b98..5957192de5ec 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.h +++ b/drivers/media/platform/rockchip/isp/rkisp.h @@ -41,6 +41,7 @@ #include #include #include "common.h" +#include "isp_ispp.h" #define CIF_ISP_INPUT_W_MAX 4416 #define CIF_ISP_INPUT_H_MAX 3312 @@ -118,6 +119,8 @@ struct rkisp_isp_subdev { bool dphy_errctrl_disabled; atomic_t frm_sync_seq; enum v4l2_quantization quantization; + u64 frm_timestamp; + struct frame_debug_info dbg; }; struct rkisp_emd_data {