"%s   width(%d) or height(%d) exceeds limits (%dx%d)\n",
                        pctx->name, frame_width, frame_height,
                        H264_MAX_SIZE_W, H264_MAX_SIZE_H);
+               pctx->frame_errors++;
                return -EINVAL;
        }
 
        default:
                dev_err(dev, "%s   invalid source pixel format\n",
                        pctx->name);
+               pctx->frame_errors++;
                return -EINVAL;
        }
 
 
        if (td->framerate_den == 0) {
                dev_err(dev, "%s   invalid framerate\n", pctx->name);
+               pctx->frame_errors++;
                return -EINVAL;
        }
 
            (payload > MAX_SPS_PPS_SIZE)) {
                dev_err(dev, "%s   invalid sps/pps size %d\n", pctx->name,
                        payload);
+               pctx->frame_errors++;
                return -EINVAL;
        }
 
                                                   (u8 *)stream->vaddr,
                                                   &payload)) {
                dev_err(dev, "%s   fail to get SEI nal\n", pctx->name);
+               pctx->frame_errors++;
                return -EINVAL;
        }
 
 err_ctx:
        devm_kfree(dev, ctx);
 err:
+       pctx->sys_errors++;
        return ret;
 }
 
 
 
        if (pm_runtime_get_sync(dev) < 0) {
                dev_err(dev, "%s     failed to get pm_runtime\n", ctx->name);
+               ctx->sys_errors++;
                ret = -EFAULT;
                goto out;
        }
                break;
        default:
                dev_dbg(dev, "%s     unknown command 0x%x\n", ctx->name, cmd);
+               ctx->encode_errors++;
                ret = -EFAULT;
                goto out;
        }
                                         msecs_to_jiffies(2000))) {
                dev_err(dev, "%s     %s: time out on completion\n", ctx->name,
                        __func__);
+               ctx->encode_errors++;
                ret = -EFAULT;
                goto out;
        }
        /* get encoding status */
        ret = ctx->hw_err ? -EFAULT : 0;
 
+       ctx->encode_errors += ctx->hw_err ? 1 : 0;
+
 out:
        disable_irq(hva->irq_its);
        disable_irq(hva->irq_err);
 
        return ret;
 }
 
+void hva_dbg_summary(struct hva_ctx *ctx)
+{
+       struct device *dev = ctx_to_dev(ctx);
+       struct hva_streaminfo *stream = &ctx->streaminfo;
+       struct hva_frameinfo *frame = &ctx->frameinfo;
+
+       if (!(ctx->flags & HVA_FLAG_STREAMINFO))
+               return;
+
+       dev_dbg(dev, "%s %4.4s %dx%d > %4.4s %dx%d %s %s: %d frames encoded, %d system errors, %d encoding errors, %d frame errors\n",
+               ctx->name,
+               (char *)&frame->pixelformat,
+               frame->aligned_width, frame->aligned_height,
+               (char *)&stream->streamformat,
+               stream->width, stream->height,
+               stream->profile, stream->level,
+               ctx->encoded_frames,
+               ctx->sys_errors,
+               ctx->encode_errors,
+               ctx->frame_errors);
+}
+
 /*
  * V4L2 ioctl operations
  */
                break;
        case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
                ctx->ctrls.profile = ctrl->val;
-               if (ctx->flags & HVA_FLAG_STREAMINFO)
-                       snprintf(ctx->streaminfo.profile,
-                                sizeof(ctx->streaminfo.profile),
-                                "%s profile",
-                                v4l2_ctrl_get_menu(ctrl->id)[ctrl->val]);
+               snprintf(ctx->streaminfo.profile,
+                        sizeof(ctx->streaminfo.profile),
+                        "%s profile",
+                        v4l2_ctrl_get_menu(ctrl->id)[ctrl->val]);
                break;
        case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
                ctx->ctrls.level = ctrl->val;
-               if (ctx->flags & HVA_FLAG_STREAMINFO)
-                       snprintf(ctx->streaminfo.level,
-                                sizeof(ctx->streaminfo.level),
-                                "level %s",
-                                v4l2_ctrl_get_menu(ctrl->id)[ctrl->val]);
+               snprintf(ctx->streaminfo.level,
+                        sizeof(ctx->streaminfo.level),
+                        "level %s",
+                        v4l2_ctrl_get_menu(ctrl->id)[ctrl->val]);
                break;
        case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:
                ctx->ctrls.entropy_mode = ctrl->val;
                dst_buf->field = V4L2_FIELD_NONE;
                dst_buf->sequence = ctx->stream_num - 1;
 
+               ctx->encoded_frames++;
+
                v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
                v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_DONE);
        }
                        v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_QUEUED);
        }
 
+       ctx->sys_errors++;
+
        return ret;
 }
 
        if (ret) {
                dev_err(dev, "%s [x:x] failed to setup controls\n",
                        HVA_PREFIX);
+               ctx->sys_errors++;
                goto err_fh;
        }
        ctx->fh.ctrl_handler = &ctx->ctrl_handler;
                ret = PTR_ERR(ctx->fh.m2m_ctx);
                dev_err(dev, "%s failed to initialize m2m context (%d)\n",
                        HVA_PREFIX, ret);
+               ctx->sys_errors++;
                goto err_ctrls;
        }
 
                hva->nb_of_instances--;
        }
 
+       /* trace a summary of instance before closing (debug purpose) */
+       hva_dbg_summary(ctx);
+
        v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
 
        v4l2_ctrl_handler_free(&ctx->ctrl_handler);