Re: [PATCH 6/9] media: mtk-vcodec: Add new venc drv interface for frame_racing mode
From: Tzung-Bi Shih <hidden>
Date: 2021-08-24 18:55:02
Also in:
linux-arm-kernel, linux-media, linux-mediatek, lkml
On Mon, Aug 16, 2021 at 06:59:31PM +0800, Irui Wang wrote:
Frame-racing mode encoding need more venc working buffers, it will break the compatibility if we just add venc_vsi in AP-Kernel but not in firmware, so add a new venc driver interface to distinguish the sigle_core_mode and frame_racing mode. The new driver interface can be used for different codecs in the future.
The patch contains more code than the commit message explains that I couldn't understand. Only find some nits.
quoted hunk ↗ jump to hunk
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_util.c +++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_util.c@@ -9,6 +9,7 @@ #include "mtk_vcodec_drv.h" #include "mtk_vcodec_util.h" +#include "mtk_vcodec_enc_hw.h"
Please try to maintain the order.
+void __iomem *mtk_get_venc_comp_reg_addr(struct mtk_vcodec_ctx *data,
+ unsigned int hw_id)
+{
+ struct mtk_vcodec_ctx *ctx = (struct mtk_vcodec_ctx *)data;typeof(ctx) == typeof(data), rename the function argument 'data' to 'ctx'.
+static int venc_alloc_work_buf(struct venc_common_inst *inst)
+{
+ int i;
+ int ret = 0;It doesn't need to be initialized. See comment below.
+ mtk_vcodec_debug_leave(inst); + + return ret;
It is more clear if just return 0 here. In the meantime, ret doesn't need to be initialized.
+static unsigned int venc_wait_comp_done(struct venc_common_inst *inst,
+ unsigned int hw_id)
+{
+ unsigned int irq_status = 0;
+ struct mtk_vcodec_ctx *ctx = (struct mtk_vcodec_ctx *)inst->ctx;No need to cast.
+static int venc_encode_sps(struct venc_common_inst *inst,
+ struct mtk_vcodec_mem *bs_buf,
+ unsigned int *bs_size)
+{
+ int ret = 0;Same.
+ *bs_size = venc_read_reg(inst, VENC_PIC_BITSTREAM_BYTE_CNT, + MTK_VENC_CORE0); + mtk_vcodec_debug(inst, "bs size %d <-", *bs_size); + + return ret;
Same.
+static int venc_encode_pps(struct venc_common_inst *inst,
+ struct mtk_vcodec_mem *bs_buf,
+ unsigned int *bs_size)
+{
+ int ret = 0;Same.
+ *bs_size = venc_read_reg(inst, VENC_PIC_BITSTREAM_BYTE_CNT, + MTK_VENC_CORE0); + mtk_vcodec_debug(inst, "bs size %d <-", *bs_size); + + return ret;
Same.
+static int venc_encode_header(struct venc_common_inst *inst,
+ struct mtk_vcodec_mem *bs_buf,
+ unsigned int *bs_size)
+{
+ int ret = 0;Same.
+ memcpy(bs_buf->va + bs_size_sps, inst->pps_buf.va, bs_size_pps); + *bs_size = bs_size_sps + bs_size_pps; + + return ret;
Same.
+static int venc_encode_frame(struct venc_common_inst *inst,
+ struct venc_frm_buf *frm_buf,
+ struct mtk_vcodec_mem *bs_buf,
+ unsigned int *bs_size,
+ int hw_id)
+{
+ int ret = 0;Same.
+ ++inst->frm_cnt; + mtk_vcodec_debug(inst, "frm %d bs_size %d key_frm %d <-", + inst->frm_cnt, *bs_size, inst->vpu_inst.is_key_frm); + + return ret;
Same.
+static void h264_encode_filler(struct venc_common_inst *inst, void *buf,
+ int size)
+{
+ unsigned char *p = buf;
+
+ if (size < H264_FILLER_MARKER_SIZE) {
+ mtk_vcodec_err(inst, "filler size too small %d", size);
+ return;
+ }
+
+ memcpy(p, h264_filler_marker, ARRAY_SIZE(h264_filler_marker));Replace ARRAY_SIZE(h264_filler_marker) to H264_FILLER_MARKER_SIZE.
+static int venc_init(struct mtk_vcodec_ctx *ctx)
+{
+ int i;
+ int ret = 0;
+ struct venc_common_inst *inst;
+
+ inst = kzalloc(sizeof(*inst), GFP_KERNEL);
+ if (!inst)
+ return -ENOMEM;
+
+ inst->ctx = ctx;
+ inst->vpu_inst.ctx = ctx;
+ inst->vpu_inst.id = SCP_IPI_VENC_H264;
+
+ mtk_vcodec_debug_enter(inst);
+
+ ret = vpu_enc_init(&inst->vpu_inst);
+
+ inst->vsi = (struct venc_vsi *)inst->vpu_inst.vsi;No need to cast.
+static int venc_encode(void *handle,
+ enum venc_start_opt opt,
+ struct venc_frm_buf *frm_buf,
+ struct mtk_vcodec_mem *bs_buf,
+ struct venc_done_result *result)
+{
+ int ret;
+ struct venc_common_inst *inst = (struct venc_common_inst *)handle;No need to cast.
+ default: + mtk_vcodec_err(inst, "venc_start_opt %d not supported", opt); + return -EINVAL; + } + + return ret;
It is more clear if just return 0 here.
+static int venc_set_param(void *handle,
+ enum venc_set_param_type type,
+ struct venc_enc_param *enc_prm)
+{
+ int ret = 0;
+ struct venc_common_inst *inst = (struct venc_common_inst *)handle;No need to cast.
+static int venc_deinit(void *handle)
+{
+ int ret = 0;Same.
+ struct venc_common_inst *inst = (struct venc_common_inst *)handle;
No need to cast.
+ mtk_vcodec_debug_leave(inst); + kfree(inst); + + return ret;
Same.