media: staging: rkisp1: isp: add a warning and debugfs var for irq delay
authorDafna Hirschfeld <dafna.hirschfeld@collabora.com>
Tue, 22 Sep 2020 11:33:57 +0000 (13:33 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Sun, 27 Sep 2020 09:34:28 +0000 (11:34 +0200)
The signal RKISP1_CIF_ISP_FRAME is set when the ISP completes
outputting the frame to the next block in the pipeline.
In order to keep buffer synchronization we assume that the
RKISP1_CIF_ISP_V_START signal never arrives together with the
RKISP1_CIF_ISP_FRAME signal.
In case those signals arrive together then the code is not able to
tell if the RKISP1_CIF_ISP_FRAME signal relates to the frame of
the current v-start or the previous. This patch adds a WARN_ONCE
and a debugfs var to catch it.

Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/staging/media/rkisp1/rkisp1-common.h
drivers/staging/media/rkisp1/rkisp1-dev.c
drivers/staging/media/rkisp1/rkisp1-isp.c

index 01a4d9bae9823fb049a68ba25e41a55353458de5..45abacdbb6642d23a777490a6fe5693ac546b663 100644 (file)
@@ -326,6 +326,7 @@ struct rkisp1_debug {
        unsigned long outform_size_error;
        unsigned long img_stabilization_size_error;
        unsigned long inform_size_error;
+       unsigned long irq_delay;
        unsigned long mipi_error;
        unsigned long stats_error;
        unsigned long stop_timeout[2];
index d85ac10e5494218ad7bd1be8eabb48dafa4b2ab8..91584695804bbf437307889f8d16aa2d635d474b 100644 (file)
@@ -444,6 +444,8 @@ static void rkisp1_debug_init(struct rkisp1_device *rkisp1)
                             &debug->img_stabilization_size_error);
        debugfs_create_ulong("inform_size_error", 0444,  debug->debugfs_dir,
                             &debug->inform_size_error);
+       debugfs_create_ulong("irq_delay", 0444,  debug->debugfs_dir,
+                            &debug->irq_delay);
        debugfs_create_ulong("mipi_error", 0444, debug->debugfs_dir,
                             &debug->mipi_error);
        debugfs_create_ulong("stats_error", 0444, debug->debugfs_dir,
index 49efcb589d5c793e26ecc6d59d6b0661a0e11144..7473bd6f876c3286a0aeef4274706b1a3a16085b 100644 (file)
@@ -1123,6 +1123,10 @@ void rkisp1_isp_isr(struct rkisp1_device *rkisp1)
        if (status & RKISP1_CIF_ISP_V_START) {
                rkisp1->isp.frame_sequence++;
                rkisp1_isp_queue_event_sof(&rkisp1->isp);
+               if (status & RKISP1_CIF_ISP_FRAME) {
+                       WARN_ONCE(1, "irq delay is too long, buffers might not be in sync\n");
+                       rkisp1->debug.irq_delay++;
+               }
        }
        if (status & RKISP1_CIF_ISP_PIC_SIZE_ERROR) {
                /* Clear pic_size_error */