Hi Dafna, On Tue, Mar 22, 2022 at 07:25:20AM +0200, Dafna Hirschfeld wrote: > On 19.03.2022 18:30, Laurent Pinchart wrote: > > It's useful to dumb the value of registers for debugging purpose. Add > > two debugfs files to dump key core and ISP registers. > > > > Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> > > Signed-off-by: Paul Elder <paul.elder@xxxxxxxxxxxxxxxx> > > --- > > .../platform/rockchip/rkisp1/rkisp1-debug.c | 72 +++++++++++++++++++ > > 1 file changed, 72 insertions(+) > > > > diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-debug.c b/drivers/media/platform/rockchip/rkisp1/rkisp1-debug.c > > index da3ed0ab697a..97be529a74e8 100644 > > --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-debug.c > > +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-debug.c > > @@ -17,6 +17,70 @@ > > #include "rkisp1-common.h" > > #include "rkisp1-regs.h" > > > > +struct rkisp1_debug_register { > > + u32 offset; > > I'd call it 'reg' or 'address' instead of 'offset' since it is really what we call reg OK, will fix in v4. > > + const char * const name; > > +}; > > + > > +#define RKISP1_DEBUG_REG(name) { RKISP1_CIF_##name, #name } > > + > > +static int rkisp1_debug_dump_regs(struct seq_file *m, > > + const struct rkisp1_debug_register *regs) > > +{ > > + struct rkisp1_device *rkisp1 = m->private; > > + u32 val; > > + int ret; > > + > > + ret = pm_runtime_get_if_in_use(rkisp1->dev); > > + if (ret) > > + return ret; > > Same comment as in the data collection patch, should it be > if (ret <= 0) > return ret; > ? Sure. > > + > > + for ( ; regs->name; ++regs) { > > + val = rkisp1_read(rkisp1, regs->offset); > > + seq_printf(m, "%14s: 0x%08x\n", regs->name, val); > > + } > > + > > + pm_runtime_put(rkisp1->dev); > > + > > + return 0; > > +} > > + > > +static int rkisp1_debug_dump_core_regs_show(struct seq_file *m, void *p) > > +{ > > + static const struct rkisp1_debug_register registers[] = { > > + RKISP1_DEBUG_REG(VI_CCL), > > + RKISP1_DEBUG_REG(VI_ICCL), > > + RKISP1_DEBUG_REG(VI_IRCL), > > + RKISP1_DEBUG_REG(VI_DPCL), > > + RKISP1_DEBUG_REG(MI_CTRL), > > + RKISP1_DEBUG_REG(MI_BYTE_CNT), > > + RKISP1_DEBUG_REG(MI_CTRL_SHD), > > + RKISP1_DEBUG_REG(MI_RIS), > > + RKISP1_DEBUG_REG(MI_STATUS), > > + RKISP1_DEBUG_REG(MI_DMA_CTRL), > > + RKISP1_DEBUG_REG(MI_DMA_STATUS), > > + { /* Sentinel */ }, > > + }; > > + > > + return rkisp1_debug_dump_regs(m, registers); > > +} > > +DEFINE_SHOW_ATTRIBUTE(rkisp1_debug_dump_core_regs); > > + > > +static int rkisp1_debug_dump_isp_regs_show(struct seq_file *m, void *p) > > +{ > > + static const struct rkisp1_debug_register registers[] = { > > + RKISP1_DEBUG_REG(ISP_CTRL), > > + RKISP1_DEBUG_REG(ISP_ACQ_PROP), > > + RKISP1_DEBUG_REG(ISP_FLAGS_SHD), > > + RKISP1_DEBUG_REG(ISP_RIS), > > + RKISP1_DEBUG_REG(ISP_ERR), > > + { /* Sentinel */ }, > > + }; > > + > > + return rkisp1_debug_dump_regs(m, registers); > > +} > > +DEFINE_SHOW_ATTRIBUTE(rkisp1_debug_dump_isp_regs); > > + > > #define RKISP1_DEBUG_DATA_COUNT_BINS 32 > > #define RKISP1_DEBUG_DATA_COUNT_STEP (4096 / RKISP1_DEBUG_DATA_COUNT_BINS) > > > > @@ -68,6 +132,7 @@ DEFINE_SHOW_ATTRIBUTE(rkisp1_debug_input_status); > > void rkisp1_debug_init(struct rkisp1_device *rkisp1) > > { > > struct rkisp1_debug *debug = &rkisp1->debug; > > + struct dentry *regs_dir; > > > > debug->debugfs_dir = debugfs_create_dir(dev_name(rkisp1->dev), NULL); > > > > @@ -96,6 +161,13 @@ void rkisp1_debug_init(struct rkisp1_device *rkisp1) > > &debug->frame_drop[RKISP1_SELFPATH]); > > debugfs_create_file("input_status", 0444, debug->debugfs_dir, rkisp1, > > &rkisp1_debug_input_status_fops); > > + > > + regs_dir = debugfs_create_dir("regs", debug->debugfs_dir); > > + > > + debugfs_create_file("core", 0444, regs_dir, rkisp1, > > + &rkisp1_debug_dump_core_regs_fops); > > + debugfs_create_file("isp", 0444, regs_dir, rkisp1, > > + &rkisp1_debug_dump_isp_regs_fops); > > } > > > > void rkisp1_debug_cleanup(struct rkisp1_device *rkisp1) -- Regards, Laurent Pinchart