[PATCH linux-next/master 1/1] media: staging/imx7: Add handler the abnormal interrupt BIT_STATFF_INT
Alice Yuan
alice.yuan at nxp.com
Sun Jan 28 21:59:37 PST 2024
@rmfrfs at gmail.com@Laurent Pinchart at martin.kepplinger@puri.sm at kernel@puri.sm at linux-media@vger.kernel.org
Any feedback?
Thanks
------------
B&R.
Name: Alice Yuan
Address: No.192, Zhangjiang Liangjing Road, Pudong New Area, Shanghai
> -----Original Message-----
> From: Alice Yuan
> Sent: 2023年12月8日 10:15
> To: rmfrfs at gmail.com; Laurent Pinchart
> <laurent.pinchart at ideasonboard.com>; martin.kepplinger at puri.sm;
> kernel at puri.sm; linux-media at vger.kernel.org
> Cc: LnxRevLi <LnxRevLi at nxp.com>; linux-devel at linux.nxdi.nxp.com;
> kernel at pengutronix.de; dl-linux-imx <linux-imx at nxp.com>;
> dri-devel at lists.freedesktop.org; linux-arm-kernel at lists.infradead.org;
> patchwork-lst at pengutronix.de
> Subject: [PATCH linux-next/master 1/1] media: staging/imx7: Add handler the
> abnormal interrupt BIT_STATFF_INT
>
> From: "alice.yuan" <alice.yuan at nxp.com>
>
> When do 2592x1944 resolution capture, we found some times the
> "BIT_STATFF_INT" is abnormal, the stat fifo is not full, but still the DMA transfer
> done interrupts generate, at this time we will get broken frames.
>
> From the reference manual of imx8mm, we know the STATFIFO full interrupt
> status, that indicates the number of data in the STATFIFO reaches the trigger
> level. It defined clearly about BIT_STATFF_INT, 0: STATFIFO is not full, 1:
> STATFIFO is full.
>
> So we should handler the abnormal interrupts when BIT_STATFF_INT is 0, the
> stat fifo is not full, we need to drop the broken frames, and recovery from the
> abnormal status.
>
> Signed-off-by: alice.yuan <alice.yuan at nxp.com>
> ---
> drivers/media/platform/nxp/imx7-media-csi.c | 25 ++++++++++++++++-----
> 1 file changed, 19 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/media/platform/nxp/imx7-media-csi.c
> b/drivers/media/platform/nxp/imx7-media-csi.c
> index 15049c6aab37..9012b155c2d7 100644
> --- a/drivers/media/platform/nxp/imx7-media-csi.c
> +++ b/drivers/media/platform/nxp/imx7-media-csi.c
> @@ -249,6 +249,7 @@ struct imx7_csi {
> bool is_streaming;
> int buf_num;
> u32 frame_sequence;
> + int frame_skip;
>
> bool last_eof;
> struct completion last_eof_completion; @@ -686,6 +687,7 @@ static
> void imx7_csi_enable(struct imx7_csi *csi)
> imx7_csi_dmareq_rff_enable(csi);
> imx7_csi_hw_enable(csi);
>
> + csi->frame_skip = 0;
> if (csi->model == IMX7_CSI_IMX8MQ)
> imx7_csi_baseaddr_switch_on_second_frame(csi);
> }
> @@ -764,6 +766,12 @@ static irqreturn_t imx7_csi_irq_handler(int irq, void
> *data)
> imx7_csi_error_recovery(csi);
> }
>
> + if (!(status & BIT_STATFF_INT)) {
> + dev_warn(csi->dev, "Stat fifo is not full\n");
> + imx7_csi_error_recovery(csi);
> + csi->frame_skip++;
> + }
> +
> if (status & BIT_ADDR_CH_ERR_INT) {
> imx7_csi_hw_disable(csi);
>
> @@ -790,14 +798,19 @@ static irqreturn_t imx7_csi_irq_handler(int irq, void
> *data)
>
> if ((status & BIT_DMA_TSF_DONE_FB1) ||
> (status & BIT_DMA_TSF_DONE_FB2)) {
> - imx7_csi_vb2_buf_done(csi);
> -
> - if (csi->last_eof) {
> - complete(&csi->last_eof_completion);
> - csi->last_eof = false;
> + if (csi->frame_skip) {
> + dev_warn(csi->dev, "skip frame: %d\n", csi->frame_skip);
> + csi->frame_skip--;
> + goto out;
> + } else {
> + imx7_csi_vb2_buf_done(csi);
> + if (csi->last_eof) {
> + complete(&csi->last_eof_completion);
> + csi->last_eof = false;
> + }
> }
> }
> -
> +out:
> spin_unlock(&csi->irqlock);
>
> return IRQ_HANDLED;
> --
> 2.37.1
More information about the linux-arm-kernel
mailing list