lkml.org 
[lkml]   [2022]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.19 0466/1157] media: amphion: sync buffer status with firmware during abort
    Date
    From: Ming Qian <ming.qian@nxp.com>

    [ Upstream commit d8f1eb105eab7aab36323c6b488dda479d5bd2da ]

    1. prevent to allocate buffer to firmware during abort
    2. release buffer when clear the slots

    Fixes: 6de8d628df6ef ("media: amphion: add v4l2 m2m vpu decoder stateful driver")
    Signed-off-by: Ming Qian <ming.qian@nxp.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/media/platform/amphion/vdec.c | 9 +++++++++
    1 file changed, 9 insertions(+)

    diff --git a/drivers/media/platform/amphion/vdec.c b/drivers/media/platform/amphion/vdec.c
    index a5bb997b000b..5e3b08d07abd 100644
    --- a/drivers/media/platform/amphion/vdec.c
    +++ b/drivers/media/platform/amphion/vdec.c
    @@ -63,6 +63,7 @@ struct vdec_t {
    bool is_source_changed;
    u32 source_change;
    u32 drain;
    + bool aborting;
    };

    static const struct vpu_format vdec_formats[] = {
    @@ -948,6 +949,9 @@ static int vdec_response_frame(struct vpu_inst *inst, struct vb2_v4l2_buffer *vb
    if (inst->state != VPU_CODEC_STATE_ACTIVE)
    return -EINVAL;

    + if (vdec->aborting)
    + return -EINVAL;
    +
    if (!vdec->req_frame_count)
    return -EINVAL;

    @@ -1057,6 +1061,8 @@ static void vdec_clear_slots(struct vpu_inst *inst)
    vpu_buf = vdec->slots[i];
    vbuf = &vpu_buf->m2m_buf.vb;

    + vpu_trace(inst->dev, "clear slot %d\n", i);
    + vdec_response_fs_release(inst, i, vpu_buf->tag);
    vdec_recycle_buffer(inst, vbuf);
    vdec->slots[i]->state = VPU_BUF_STATE_IDLE;
    vdec->slots[i] = NULL;
    @@ -1318,6 +1324,8 @@ static void vdec_abort(struct vpu_inst *inst)
    int ret;

    vpu_trace(inst->dev, "[%d] state = %d\n", inst->id, inst->state);
    +
    + vdec->aborting = true;
    vpu_iface_add_scode(inst, SCODE_PADDING_ABORT);
    vdec->params.end_flag = 1;
    vpu_iface_set_decode_params(inst, &vdec->params, 1);
    @@ -1341,6 +1349,7 @@ static void vdec_abort(struct vpu_inst *inst)
    vdec->decoded_frame_count = 0;
    vdec->display_frame_count = 0;
    vdec->sequence = 0;
    + vdec->aborting = false;
    }

    static void vdec_stop(struct vpu_inst *inst, bool free)
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-16 01:56    [W:4.029 / U:0.192 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site