media: rkisp1: debug: Collect input status by sampling ISP_FLAGS_SHD
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Sat, 26 Feb 2022 07:57:09 +0000 (07:57 +0000)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Mon, 27 Jun 2022 07:36:32 +0000 (08:36 +0100)
The ISP_FLAGS_SHD register exposes the ISP parallel input signals (data
and synchronization) in real time. This can help debugging when the
device doesn't output any image. Sample the register 10000 times with a
1µs delay and expose the result through debugfs.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Ricardo Ribalda <ribalda@chromium.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/platform/rockchip/rkisp1/rkisp1-debug.c
drivers/media/platform/rockchip/rkisp1/rkisp1-regs.h

index 64b33774cbdfbf30b8483281d47e7f441ce53c40..782a696ac5874160a8891e672281d4124ca5c9e3 100644 (file)
@@ -9,9 +9,61 @@
  */
 
 #include <linux/debugfs.h>
+#include <linux/delay.h>
 #include <linux/device.h>
+#include <linux/pm_runtime.h>
+#include <linux/seq_file.h>
 
 #include "rkisp1-common.h"
+#include "rkisp1-regs.h"
+
+#define RKISP1_DEBUG_DATA_COUNT_BINS   32
+#define RKISP1_DEBUG_DATA_COUNT_STEP   (4096 / RKISP1_DEBUG_DATA_COUNT_BINS)
+
+static int rkisp1_debug_input_status_show(struct seq_file *m, void *p)
+{
+       struct rkisp1_device *rkisp1 = m->private;
+       u16 data_count[RKISP1_DEBUG_DATA_COUNT_BINS] = { };
+       unsigned int hsync_count = 0;
+       unsigned int vsync_count = 0;
+       unsigned int i;
+       u32 data;
+       u32 val;
+       int ret;
+
+       ret = pm_runtime_get_if_in_use(rkisp1->dev);
+       if (ret <= 0)
+               return ret ? : -ENODATA;
+
+       /* Sample the ISP input port status 10000 times with a 1µs interval. */
+       for (i = 0; i < 10000; ++i) {
+               val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_FLAGS_SHD);
+
+               data = (val & RKISP1_CIF_ISP_FLAGS_SHD_S_DATA_MASK)
+                    >> RKISP1_CIF_ISP_FLAGS_SHD_S_DATA_SHIFT;
+               data_count[data / RKISP1_DEBUG_DATA_COUNT_STEP]++;
+
+               if (val & RKISP1_CIF_ISP_FLAGS_SHD_S_HSYNC)
+                       hsync_count++;
+               if (val & RKISP1_CIF_ISP_FLAGS_SHD_S_VSYNC)
+                       vsync_count++;
+
+               udelay(1);
+       }
+
+       pm_runtime_put(rkisp1->dev);
+
+       seq_printf(m, "vsync: %u, hsync: %u\n", vsync_count, hsync_count);
+       seq_puts(m, "data:\n");
+       for (i = 0; i < ARRAY_SIZE(data_count); ++i)
+               seq_printf(m, "- [%04u:%04u]: %u\n",
+                          i * RKISP1_DEBUG_DATA_COUNT_STEP,
+                          (i + 1) * RKISP1_DEBUG_DATA_COUNT_STEP - 1,
+                          data_count[i]);
+
+       return 0;
+}
+DEFINE_SHOW_ATTRIBUTE(rkisp1_debug_input_status);
 
 void rkisp1_debug_init(struct rkisp1_device *rkisp1)
 {
@@ -42,6 +94,8 @@ void rkisp1_debug_init(struct rkisp1_device *rkisp1)
                             &debug->frame_drop[RKISP1_MAINPATH]);
        debugfs_create_ulong("sp_frame_drop", 0444, debug->debugfs_dir,
                             &debug->frame_drop[RKISP1_SELFPATH]);
+       debugfs_create_file("input_status", 0444, debug->debugfs_dir, rkisp1,
+                           &rkisp1_debug_input_status_fops);
 }
 
 void rkisp1_debug_cleanup(struct rkisp1_device *rkisp1)
index 7045f4a5a5d595433dd0e83620d457e868c61101..dd3e6c38be67757764225f2be3cee7a6c208b742 100644 (file)
 #define RKISP1_CIF_ISP_DEMOSAIC_BYPASS                 BIT(10)
 #define RKISP1_CIF_ISP_DEMOSAIC_TH(x)                  ((x) & 0xFF)
 
+/* ISP_FLAGS_SHD */
+#define RKISP1_CIF_ISP_FLAGS_SHD_ISP_ENABLE_SHD                BIT(0)
+#define RKISP1_CIF_ISP_FLAGS_SHD_ISP_ENABLE_INFORM_SHD BIT(1)
+#define RKISP1_CIF_ISP_FLAGS_SHD_INFORM_FIELD          BIT(2)
+#define RKISP1_CIF_ISP_FLAGS_SHD_S_DATA_MASK           GENMASK(27, 16)
+#define RKISP1_CIF_ISP_FLAGS_SHD_S_DATA_SHIFT          16
+#define RKISP1_CIF_ISP_FLAGS_SHD_S_VSYNC               BIT(30)
+#define RKISP1_CIF_ISP_FLAGS_SHD_S_HSYNC               BIT(31)
+
 /* AWB */
 /* ISP_AWB_PROP */
 #define RKISP1_CIF_ISP_AWB_YMAX_CMP_EN                 BIT(2)