On 05.03.2025 06:53, Aakarsh Jain wrote: > When output encoded buffer size provided by userspace > is insufficient with current encoding parameters, it > leads to RET_ENC_BUFFER_FULL interrupt which was not > handled in IRQ handler. > > On handling of RET_ENC_BUFFER_FULL interrupt leads to > NAL_ABORT command from host to risc which in turn leads > to RET_NAL_ABORT interrupt. On receiving RET_NAL_ABORT > driver clears workbit and VB2 queues for cleaner closing > of MFC instance. > > When user encounters "Call on DQBUF after unrecoverable > error", userspace should close fd and restart with larger > output encoder buffer size. > > Signed-off-by: Aakarsh Jain <aakarsh.jain@xxxxxxxxxxx> Acked-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> > --- > changelog: > v1->v2 > Patch link: https://patchwork.kernel.org/project/linux-media/patch/20250228065952.14375-1-aakarsh.jain@xxxxxxxxxxx/ > Fixed build errors reported by Media CI robot. > .../media/platform/samsung/s5p-mfc/regs-mfc-v6.h | 1 + > drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c | 14 ++++++++++++++ > .../platform/samsung/s5p-mfc/s5p_mfc_common.h | 1 + > .../platform/samsung/s5p-mfc/s5p_mfc_opr_v6.c | 5 +++++ > 4 files changed, 21 insertions(+) > > diff --git a/drivers/media/platform/samsung/s5p-mfc/regs-mfc-v6.h b/drivers/media/platform/samsung/s5p-mfc/regs-mfc-v6.h > index fa49fe580e1a..075a58b50b8c 100644 > --- a/drivers/media/platform/samsung/s5p-mfc/regs-mfc-v6.h > +++ b/drivers/media/platform/samsung/s5p-mfc/regs-mfc-v6.h > @@ -45,6 +45,7 @@ > #define S5P_FIMV_H2R_CMD_WAKEUP_V6 8 > #define S5P_FIMV_CH_LAST_FRAME_V6 9 > #define S5P_FIMV_H2R_CMD_FLUSH_V6 10 > +#define S5P_FIMV_H2R_CMD_NAL_ABORT_V6 11 > /* RMVME: REALLOC used? */ > #define S5P_FIMV_CH_FRAME_START_REALLOC_V6 5 > > diff --git a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c > index 5f80931f056d..e764cab2485c 100644 > --- a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c > +++ b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc.c > @@ -739,6 +739,20 @@ static irqreturn_t s5p_mfc_irq(int irq, void *priv) > ctx->state = MFCINST_RUNNING; > goto irq_cleanup_hw; > > + case S5P_MFC_R2H_CMD_ENC_BUFFER_FUL_RET: > + ctx->state = MFCINST_NAL_ABORT; > + s5p_mfc_hw_call(dev->mfc_ops, clear_int_flags, dev); > + set_work_bit(ctx); > + WARN_ON(test_and_clear_bit(0, &dev->hw_lock) == 0); > + s5p_mfc_hw_call(dev->mfc_ops, try_run, dev); > + break; > + > + case S5P_MFC_R2H_CMD_NAL_ABORT_RET: > + ctx->state = MFCINST_ERROR; > + s5p_mfc_cleanup_queue(&ctx->dst_queue, &ctx->vq_dst); > + s5p_mfc_cleanup_queue(&ctx->src_queue, &ctx->vq_src); > + goto irq_cleanup_hw; > + > default: > mfc_debug(2, "Unknown int reason\n"); > s5p_mfc_hw_call(dev->mfc_ops, clear_int_flags, dev); > diff --git a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_common.h b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_common.h > index 3cc2a4f5c40a..86c316c1ff8f 100644 > --- a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_common.h > +++ b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_common.h > @@ -141,6 +141,7 @@ enum s5p_mfc_inst_state { > MFCINST_RES_CHANGE_INIT, > MFCINST_RES_CHANGE_FLUSH, > MFCINST_RES_CHANGE_END, > + MFCINST_NAL_ABORT, > }; > > /* > diff --git a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_opr_v6.c b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_opr_v6.c > index 4cf12f33d706..356adfddcfcf 100644 > --- a/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_opr_v6.c > +++ b/drivers/media/platform/samsung/s5p-mfc/s5p_mfc_opr_v6.c > @@ -2229,6 +2229,11 @@ static void s5p_mfc_try_run_v6(struct s5p_mfc_dev *dev) > case MFCINST_HEAD_PRODUCED: > ret = s5p_mfc_run_init_enc_buffers(ctx); > break; > + case MFCINST_NAL_ABORT: > + mfc_write(dev, ctx->inst_no, S5P_FIMV_INSTANCE_ID_V6); > + s5p_mfc_hw_call(dev->mfc_cmds, cmd_host2risc, > + dev, S5P_FIMV_H2R_CMD_NAL_ABORT_V6, NULL); > + break; > default: > ret = -EAGAIN; > } Best regards -- Marek Szyprowski, PhD Samsung R&D Institute Poland