lkml.org 
[lkml]   [2021]   [Jul]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v1, 10/14] media: mtk-vcodec: Add core thread
    Date
    Core thread:
    1. Gets lat_buf from core msg queue.
    2. Proceeds core decode.
    3. Puts the lat_buf back to lat msg queue.

    Both H264 and VP9 rely on the core thread.

    Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
    ---
    .../platform/mtk-vcodec/mtk_vcodec_dec_drv.c | 9 ++++++
    .../platform/mtk-vcodec/mtk_vcodec_drv.h | 2 ++
    .../platform/mtk-vcodec/vdec_msg_queue.c | 32 +++++++++++++++++++
    .../platform/mtk-vcodec/vdec_msg_queue.h | 6 ++++
    4 files changed, 49 insertions(+)

    diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
    index f156a943ca62..1bcb070ef947 100644
    --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
    +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
    @@ -423,6 +423,15 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
    goto err_res;
    }

    + if (VDEC_LAT_ARCH(dev->vdec_pdata->hw_arch)) {
    + init_waitqueue_head(&dev->core_read);
    + INIT_LIST_HEAD(&dev->core_queue);
    + spin_lock_init(&dev->core_lock);
    + dev->kthread_core = kthread_run(vdec_msg_queue_core_thead, dev,
    + "mtk-%s", "core");
    + dev->num_core = 0;
    + }
    +
    for (i = 0; i < MTK_VDEC_HW_MAX; i++)
    mutex_init(&dev->dec_mutex[i]);
    mutex_init(&dev->dev_mutex);
    diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
    index 68b3fbcd95b0..9a2a3821d4e1 100644
    --- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
    +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
    @@ -34,6 +34,7 @@
    #define MTK_VCODEC_MAX_PLANES 3
    #define MTK_V4L2_BENCHMARK 0
    #define WAIT_INTR_TIMEOUT_MS 1000
    +#define VDEC_LAT_ARCH(hw_arch) ((hw_arch) >= MTK_VDEC_LAT_SINGLE_CORE)

    /*
    * enum mtk_hw_reg_idx - MTK hw register base index
    @@ -519,6 +520,7 @@ struct mtk_vcodec_dev {
    struct device_node *component_node[MTK_VDEC_HW_MAX];
    int comp_idx;

    + struct task_struct *kthread_core;
    wait_queue_head_t core_read;
    struct list_head core_queue;
    spinlock_t core_lock;
    diff --git a/drivers/media/platform/mtk-vcodec/vdec_msg_queue.c b/drivers/media/platform/mtk-vcodec/vdec_msg_queue.c
    index 9d684e5f051c..4841b7c17c41 100644
    --- a/drivers/media/platform/mtk-vcodec/vdec_msg_queue.c
    +++ b/drivers/media/platform/mtk-vcodec/vdec_msg_queue.c
    @@ -232,3 +232,35 @@ void vdec_msg_queue_deinit(

    msg_queue->init_done = false;
    }
    +
    +int vdec_msg_queue_core_thead(void *data)
    +{
    + struct mtk_vcodec_dev *dev = data;
    + struct vdec_lat_buf *lat_buf;
    + struct mtk_vcodec_ctx *ctx;
    +
    + set_freezable();
    + for (;;) {
    + try_to_freeze();
    + if (kthread_should_stop())
    + break;
    +
    + lat_buf = vdec_msg_queue_get_core_buf(dev);
    + if (!lat_buf)
    + continue;
    +
    + ctx = lat_buf->ctx;
    + mtk_vcodec_set_curr_ctx(dev, ctx, MTK_VDEC_CORE);
    +
    + if (!lat_buf->core_decode)
    + mtk_v4l2_err("Core decode callback func is NULL");
    + else
    + lat_buf->core_decode(lat_buf);
    +
    + mtk_vcodec_set_curr_ctx(dev, NULL, MTK_VDEC_CORE);
    + vdec_msg_queue_buf_to_lat(lat_buf);
    + }
    +
    + mtk_v4l2_debug(3, "Video Capture Thread End");
    + return 0;
    +}
    diff --git a/drivers/media/platform/mtk-vcodec/vdec_msg_queue.h b/drivers/media/platform/mtk-vcodec/vdec_msg_queue.h
    index 62261702c464..dba127843f14 100644
    --- a/drivers/media/platform/mtk-vcodec/vdec_msg_queue.h
    +++ b/drivers/media/platform/mtk-vcodec/vdec_msg_queue.h
    @@ -127,4 +127,10 @@ void vdec_msg_queue_deinit(
    struct mtk_vcodec_ctx *ctx,
    struct vdec_msg_queue *msg_queue);

    +/**
    + * vdec_msg_queue_core_thead - used for core decoder.
    + * @data: private data used for each codec
    + */
    +int vdec_msg_queue_core_thead(void *data);
    +
    #endif
    --
    2.18.0
    \
     
     \ /
      Last update: 2021-07-07 08:24    [W:4.208 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site