* [PATCH 1/6] media: mediatek: vcodec: extend h264 video share information
2024-10-14 7:33 [PATCH 0/6] media: mediatek: vcodec: support h264 extend vsi Yunfei Dong
@ 2024-10-14 7:33 ` Yunfei Dong
2024-10-14 7:33 ` [PATCH 2/6] media: mediatek: vcodec: remove parse nal info in kernel Yunfei Dong
` (5 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Yunfei Dong @ 2024-10-14 7:33 UTC (permalink / raw)
To: Nícolas F . R . A . Prado, Sebastian Fricke,
Nicolas Dufresne, Hans Verkuil, AngeloGioacchino Del Regno,
Benjamin Gaignard, Nathan Hebert, Daniel Almeida
Cc: Hsin-Yi Wang, Fritz Koenig, Daniel Vetter, Steve Cho, Yunfei Dong,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, Project_Global_Chrome_Upstream_Group
Calculate the working buffer address end with each buffer size when
the address end can't be calculated in kernel space. Re-contruct the
driver flow when vsi struct is changed for adding the buffer size.
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
---
.../decoder/vdec/vdec_h264_req_multi_if.c | 274 ++++++++++--------
1 file changed, 161 insertions(+), 113 deletions(-)
diff --git a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
index 732d78f63e5a..d3f8d62238c0 100644
--- a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
+++ b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
@@ -50,60 +50,76 @@ struct vdec_h264_slice_lat_dec_param {
/**
* struct vdec_h264_slice_info - decode information
*
+ * @wdma_end_addr_offset: offset from buffer start
* @nal_info: nal info of current picture
* @timeout: Decode timeout: 1 timeout, 0 no timeout
- * @bs_buf_size: bitstream size
- * @bs_buf_addr: bitstream buffer dma address
- * @y_fb_dma: Y frame buffer dma address
- * @c_fb_dma: C frame buffer dma address
* @vdec_fb_va: VDEC frame buffer struct virtual address
* @crc: Used to check whether hardware's status is right
+ * @reserved: reserved
*/
struct vdec_h264_slice_info {
+ u64 wdma_end_addr_offset;
u16 nal_info;
u16 timeout;
- u32 bs_buf_size;
- u64 bs_buf_addr;
- u64 y_fb_dma;
- u64 c_fb_dma;
u64 vdec_fb_va;
u32 crc[8];
+ u32 reserved;
+};
+
+/*
+ * struct vdec_h264_slice_mem - memory address and size
+ */
+struct vdec_h264_slice_mem {
+ union {
+ u64 buf;
+ u64 dma_addr;
+ };
+ union {
+ size_t size;
+ u64 dma_addr_end;
+ };
+};
+
+/**
+ * struct vdec_h264_slice_fb - frame buffer for decoding
+ *
+ * @y: current y buffer address info
+ * @c: current c buffer address info
+ */
+struct vdec_h264_slice_fb {
+ struct vdec_h264_slice_mem y;
+ struct vdec_h264_slice_mem c;
};
/**
* struct vdec_h264_slice_vsi - shared memory for decode information exchange
* between SCP and Host.
*
- * @wdma_err_addr: wdma error dma address
- * @wdma_start_addr: wdma start dma address
- * @wdma_end_addr: wdma end dma address
- * @slice_bc_start_addr: slice bc start dma address
- * @slice_bc_end_addr: slice bc end dma address
- * @row_info_start_addr: row info start dma address
- * @row_info_end_addr: row info end dma address
- * @trans_start: trans start dma address
- * @trans_end: trans end dma address
- * @wdma_end_addr_offset: wdma end address offset
+ * @bs: input buffer info
+ * @fb: current y/c buffer
+ *
+ * @ube: ube buffer
+ * @trans: transcoded buffer
+ * @row_info: row info buffer
+ * @err_map: err map buffer
+ * @slice_bc: slice buffer
*
* @mv_buf_dma: HW working motion vector buffer
- * dma address (AP-W, VPU-R)
- * @dec: decode information (AP-R, VPU-W)
- * @h264_slice_params: decode parameters for hw used
+ * @dec: decode information (AP-R, VPU-W)
+ * @h264_slice_params: decode parameters for hw used
*/
struct vdec_h264_slice_vsi {
/* LAT dec addr */
- u64 wdma_err_addr;
- u64 wdma_start_addr;
- u64 wdma_end_addr;
- u64 slice_bc_start_addr;
- u64 slice_bc_end_addr;
- u64 row_info_start_addr;
- u64 row_info_end_addr;
- u64 trans_start;
- u64 trans_end;
- u64 wdma_end_addr_offset;
+ struct vdec_h264_slice_mem bs;
+ struct vdec_h264_slice_fb fb;
+
+ struct vdec_h264_slice_mem ube;
+ struct vdec_h264_slice_mem trans;
+ struct vdec_h264_slice_mem row_info;
+ struct vdec_h264_slice_mem err_map;
+ struct vdec_h264_slice_mem slice_bc;
- u64 mv_buf_dma[H264_MAX_MV_NUM];
+ struct vdec_h264_slice_mem mv_buf_dma[H264_MAX_MV_NUM];
struct vdec_h264_slice_info dec;
struct vdec_h264_slice_lat_dec_param h264_slice_params;
};
@@ -392,6 +408,98 @@ static void vdec_h264_slice_get_crop_info(struct vdec_h264_slice_inst *inst,
cr->left, cr->top, cr->width, cr->height);
}
+static void vdec_h264_slice_setup_lat_buffer(struct vdec_h264_slice_inst *inst,
+ struct mtk_vcodec_mem *bs,
+ struct vdec_lat_buf *lat_buf)
+{
+ struct mtk_vcodec_mem *mem;
+ int i;
+
+ inst->vsi->bs.dma_addr = (u64)bs->dma_addr;
+ inst->vsi->bs.size = bs->size;
+
+ for (i = 0; i < H264_MAX_MV_NUM; i++) {
+ mem = &inst->mv_buf[i];
+ inst->vsi->mv_buf_dma[i].dma_addr = mem->dma_addr;
+ inst->vsi->mv_buf_dma[i].size = mem->size;
+ }
+ inst->vsi->ube.dma_addr = lat_buf->ctx->msg_queue.wdma_addr.dma_addr;
+ inst->vsi->ube.size = lat_buf->ctx->msg_queue.wdma_addr.size;
+
+ inst->vsi->row_info.dma_addr = 0;
+ inst->vsi->row_info.size = 0;
+
+ inst->vsi->err_map.dma_addr = lat_buf->wdma_err_addr.dma_addr;
+ inst->vsi->err_map.size = lat_buf->wdma_err_addr.size;
+
+ inst->vsi->slice_bc.dma_addr = lat_buf->slice_bc_addr.dma_addr;
+ inst->vsi->slice_bc.size = lat_buf->slice_bc_addr.size;
+
+ inst->vsi->trans.dma_addr_end = inst->ctx->msg_queue.wdma_rptr_addr;
+ inst->vsi->trans.dma_addr = inst->ctx->msg_queue.wdma_wptr_addr;
+}
+
+static int vdec_h264_slice_setup_core_buffer(struct vdec_h264_slice_inst *inst,
+ struct vdec_h264_slice_share_info *share_info,
+ struct vdec_lat_buf *lat_buf)
+{
+ struct mtk_vcodec_mem *mem;
+ struct mtk_vcodec_dec_ctx *ctx = inst->ctx;
+ struct vb2_v4l2_buffer *vb2_v4l2;
+ struct vdec_fb *fb;
+ u64 y_fb_dma, c_fb_dma = 0;
+ int i;
+
+ fb = ctx->dev->vdec_pdata->get_cap_buffer(ctx);
+ if (!fb) {
+ mtk_vdec_err(ctx, "fb buffer is NULL");
+ return -EBUSY;
+ }
+
+ y_fb_dma = (u64)fb->base_y.dma_addr;
+ if (ctx->q_data[MTK_Q_DATA_DST].fmt->num_planes == 1)
+ c_fb_dma =
+ y_fb_dma + inst->ctx->picinfo.buf_w * inst->ctx->picinfo.buf_h;
+ else
+ c_fb_dma = (u64)fb->base_c.dma_addr;
+
+ mtk_vdec_debug(ctx, "[h264-core] y/c addr = 0x%llx 0x%llx", y_fb_dma, c_fb_dma);
+
+ inst->vsi_core->fb.y.dma_addr = y_fb_dma;
+ inst->vsi_core->fb.y.size = ctx->picinfo.fb_sz[0];
+ inst->vsi_core->fb.c.dma_addr = c_fb_dma;
+ inst->vsi_core->fb.c.size = ctx->picinfo.fb_sz[1];
+
+ inst->vsi_core->dec.vdec_fb_va = (unsigned long)fb;
+ inst->vsi_core->dec.nal_info = share_info->nal_info;
+
+ inst->vsi_core->ube.dma_addr = lat_buf->ctx->msg_queue.wdma_addr.dma_addr;
+ inst->vsi_core->ube.size = lat_buf->ctx->msg_queue.wdma_addr.size;
+
+ inst->vsi_core->err_map.dma_addr = lat_buf->wdma_err_addr.dma_addr;
+ inst->vsi_core->err_map.size = lat_buf->wdma_err_addr.size;
+
+ inst->vsi_core->slice_bc.dma_addr = lat_buf->slice_bc_addr.dma_addr;
+ inst->vsi_core->slice_bc.size = lat_buf->slice_bc_addr.size;
+
+ inst->vsi_core->row_info.dma_addr = 0;
+ inst->vsi_core->row_info.size = 0;
+
+ inst->vsi_core->trans.dma_addr = share_info->trans_start;
+ inst->vsi_core->trans.dma_addr_end = share_info->trans_end;
+
+ for (i = 0; i < H264_MAX_MV_NUM; i++) {
+ mem = &inst->mv_buf[i];
+ inst->vsi_core->mv_buf_dma[i].dma_addr = mem->dma_addr;
+ inst->vsi_core->mv_buf_dma[i].size = mem->size;
+ }
+
+ vb2_v4l2 = v4l2_m2m_next_dst_buf(ctx->m2m_ctx);
+ v4l2_m2m_buf_copy_metadata(&lat_buf->ts_info, vb2_v4l2, true);
+
+ return 0;
+}
+
static int vdec_h264_slice_init(struct mtk_vcodec_dec_ctx *ctx)
{
struct vdec_h264_slice_inst *inst;
@@ -452,64 +560,22 @@ static void vdec_h264_slice_deinit(void *h_vdec)
static int vdec_h264_slice_core_decode(struct vdec_lat_buf *lat_buf)
{
- struct vdec_fb *fb;
- u64 vdec_fb_va;
- u64 y_fb_dma, c_fb_dma;
- int err, timeout, i;
+ int err, timeout;
struct mtk_vcodec_dec_ctx *ctx = lat_buf->ctx;
struct vdec_h264_slice_inst *inst = ctx->drv_handle;
- struct vb2_v4l2_buffer *vb2_v4l2;
struct vdec_h264_slice_share_info *share_info = lat_buf->private_data;
- struct mtk_vcodec_mem *mem;
struct vdec_vpu_inst *vpu = &inst->vpu;
mtk_vdec_debug(ctx, "[h264-core] vdec_h264 core decode");
memcpy(&inst->vsi_core->h264_slice_params, &share_info->h264_slice_params,
sizeof(share_info->h264_slice_params));
- fb = ctx->dev->vdec_pdata->get_cap_buffer(ctx);
- if (!fb) {
- err = -EBUSY;
- mtk_vdec_err(ctx, "fb buffer is NULL");
+ err = vdec_h264_slice_setup_core_buffer(inst, share_info, lat_buf);
+ if (err)
goto vdec_dec_end;
- }
-
- vdec_fb_va = (unsigned long)fb;
- y_fb_dma = (u64)fb->base_y.dma_addr;
- if (ctx->q_data[MTK_Q_DATA_DST].fmt->num_planes == 1)
- c_fb_dma =
- y_fb_dma + inst->ctx->picinfo.buf_w * inst->ctx->picinfo.buf_h;
- else
- c_fb_dma = (u64)fb->base_c.dma_addr;
-
- mtk_vdec_debug(ctx, "[h264-core] y/c addr = 0x%llx 0x%llx", y_fb_dma, c_fb_dma);
-
- inst->vsi_core->dec.y_fb_dma = y_fb_dma;
- inst->vsi_core->dec.c_fb_dma = c_fb_dma;
- inst->vsi_core->dec.vdec_fb_va = vdec_fb_va;
- inst->vsi_core->dec.nal_info = share_info->nal_info;
- inst->vsi_core->wdma_start_addr =
- lat_buf->ctx->msg_queue.wdma_addr.dma_addr;
- inst->vsi_core->wdma_end_addr =
- lat_buf->ctx->msg_queue.wdma_addr.dma_addr +
- lat_buf->ctx->msg_queue.wdma_addr.size;
- inst->vsi_core->wdma_err_addr = lat_buf->wdma_err_addr.dma_addr;
- inst->vsi_core->slice_bc_start_addr = lat_buf->slice_bc_addr.dma_addr;
- inst->vsi_core->slice_bc_end_addr = lat_buf->slice_bc_addr.dma_addr +
- lat_buf->slice_bc_addr.size;
- inst->vsi_core->trans_start = share_info->trans_start;
- inst->vsi_core->trans_end = share_info->trans_end;
- for (i = 0; i < H264_MAX_MV_NUM; i++) {
- mem = &inst->mv_buf[i];
- inst->vsi_core->mv_buf_dma[i] = mem->dma_addr;
- }
-
- vb2_v4l2 = v4l2_m2m_next_dst_buf(ctx->m2m_ctx);
- v4l2_m2m_buf_copy_metadata(&lat_buf->ts_info, vb2_v4l2, true);
vdec_h264_slice_fill_decode_reflist(inst, &inst->vsi_core->h264_slice_params,
share_info);
-
err = vpu_dec_core(vpu);
if (err) {
mtk_vdec_err(ctx, "core decode err=%d", err);
@@ -568,12 +634,11 @@ static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
struct vdec_h264_slice_inst *inst = h_vdec;
struct vdec_vpu_inst *vpu = &inst->vpu;
struct mtk_video_dec_buf *src_buf_info;
- int nal_start_idx, err, timeout = 0, i;
+ int nal_start_idx, err, timeout = 0;
unsigned int data[2];
struct vdec_lat_buf *lat_buf;
struct vdec_h264_slice_share_info *share_info;
unsigned char *buf;
- struct mtk_vcodec_mem *mem;
if (vdec_msg_queue_init(&inst->ctx->msg_queue, inst->ctx,
vdec_h264_slice_core_decode,
@@ -615,9 +680,6 @@ static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
vdec_h264_insert_startcode(inst->ctx->dev, buf, &bs->size,
&share_info->h264_slice_params.pps);
- inst->vsi->dec.bs_buf_addr = (uint64_t)bs->dma_addr;
- inst->vsi->dec.bs_buf_size = bs->size;
-
*res_chg = inst->resolution_changed;
if (inst->resolution_changed) {
mtk_vdec_debug(inst->ctx, "- resolution changed -");
@@ -629,30 +691,15 @@ static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
}
inst->resolution_changed = false;
}
- for (i = 0; i < H264_MAX_MV_NUM; i++) {
- mem = &inst->mv_buf[i];
- inst->vsi->mv_buf_dma[i] = mem->dma_addr;
- }
- inst->vsi->wdma_start_addr = lat_buf->ctx->msg_queue.wdma_addr.dma_addr;
- inst->vsi->wdma_end_addr = lat_buf->ctx->msg_queue.wdma_addr.dma_addr +
- lat_buf->ctx->msg_queue.wdma_addr.size;
- inst->vsi->wdma_err_addr = lat_buf->wdma_err_addr.dma_addr;
- inst->vsi->slice_bc_start_addr = lat_buf->slice_bc_addr.dma_addr;
- inst->vsi->slice_bc_end_addr = lat_buf->slice_bc_addr.dma_addr +
- lat_buf->slice_bc_addr.size;
-
- inst->vsi->trans_end = inst->ctx->msg_queue.wdma_rptr_addr;
- inst->vsi->trans_start = inst->ctx->msg_queue.wdma_wptr_addr;
- mtk_vdec_debug(inst->ctx, "lat:trans(0x%llx 0x%llx) err:0x%llx",
- inst->vsi->wdma_start_addr,
- inst->vsi->wdma_end_addr,
- inst->vsi->wdma_err_addr);
-
- mtk_vdec_debug(inst->ctx, "slice(0x%llx 0x%llx) rprt((0x%llx 0x%llx))",
- inst->vsi->slice_bc_start_addr,
- inst->vsi->slice_bc_end_addr,
- inst->vsi->trans_start,
- inst->vsi->trans_end);
+
+ vdec_h264_slice_setup_lat_buffer(inst, bs, lat_buf);
+ mtk_vdec_debug(inst->ctx, "lat:trans(0x%llx 0x%lx) err:0x%llx",
+ inst->vsi->ube.dma_addr, (unsigned long)inst->vsi->ube.size,
+ inst->vsi->err_map.dma_addr);
+
+ mtk_vdec_debug(inst->ctx, "slice(0x%llx 0x%lx) rprt((0x%llx 0x%llx))",
+ inst->vsi->slice_bc.dma_addr, (unsigned long)inst->vsi->slice_bc.size,
+ inst->vsi->trans.dma_addr, inst->vsi->trans.dma_addr_end);
err = vpu_dec_start(vpu, data, 2);
if (err) {
mtk_vdec_debug(inst->ctx, "lat decode err: %d", err);
@@ -660,7 +707,8 @@ static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
}
share_info->trans_end = inst->ctx->msg_queue.wdma_addr.dma_addr +
- inst->vsi->wdma_end_addr_offset;
+ inst->vsi->dec.wdma_end_addr_offset;
+
share_info->trans_start = inst->ctx->msg_queue.wdma_wptr_addr;
share_info->nal_info = inst->vsi->dec.nal_info;
@@ -687,7 +735,7 @@ static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
}
share_info->trans_end = inst->ctx->msg_queue.wdma_addr.dma_addr +
- inst->vsi->wdma_end_addr_offset;
+ inst->vsi->dec.wdma_end_addr_offset;
vdec_msg_queue_update_ube_wptr(&lat_buf->ctx->msg_queue, share_info->trans_end);
if (!IS_VDEC_INNER_RACING(inst->ctx->dev->dec_capability)) {
@@ -737,10 +785,10 @@ static int vdec_h264_slice_single_decode(void *h_vdec, struct mtk_vcodec_mem *bs
mtk_vdec_debug(inst->ctx, "[h264-dec] [%d] y_dma=%llx c_dma=%llx",
inst->ctx->decoded_frame_cnt, y_fb_dma, c_fb_dma);
- inst->vsi_ctx.dec.bs_buf_addr = (u64)bs->dma_addr;
- inst->vsi_ctx.dec.bs_buf_size = bs->size;
- inst->vsi_ctx.dec.y_fb_dma = y_fb_dma;
- inst->vsi_ctx.dec.c_fb_dma = c_fb_dma;
+ inst->vsi_ctx.bs.dma_addr = (u64)bs->dma_addr;
+ inst->vsi_ctx.bs.size = bs->size;
+ inst->vsi_ctx.fb.y.dma_addr = y_fb_dma;
+ inst->vsi_ctx.fb.c.dma_addr = c_fb_dma;
inst->vsi_ctx.dec.vdec_fb_va = (u64)(uintptr_t)fb;
v4l2_m2m_buf_copy_metadata(&src_buf_info->m2m_buf.vb,
@@ -770,7 +818,7 @@ static int vdec_h264_slice_single_decode(void *h_vdec, struct mtk_vcodec_mem *bs
for (i = 0; i < H264_MAX_MV_NUM; i++) {
mem = &inst->mv_buf[i];
- inst->vsi_ctx.mv_buf_dma[i] = mem->dma_addr;
+ inst->vsi_ctx.mv_buf_dma[i].dma_addr = mem->dma_addr;
}
}
--
2.46.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH 2/6] media: mediatek: vcodec: remove parse nal info in kernel
2024-10-14 7:33 [PATCH 0/6] media: mediatek: vcodec: support h264 extend vsi Yunfei Dong
2024-10-14 7:33 ` [PATCH 1/6] media: mediatek: vcodec: extend h264 video share information Yunfei Dong
@ 2024-10-14 7:33 ` Yunfei Dong
2024-10-15 7:58 ` Chen-Yu Tsai
2024-10-14 7:33 ` [PATCH 3/6] media: mediatek: vcodec: remove vsi operation in common interface Yunfei Dong
` (4 subsequent siblings)
6 siblings, 1 reply; 11+ messages in thread
From: Yunfei Dong @ 2024-10-14 7:33 UTC (permalink / raw)
To: Nícolas F . R . A . Prado, Sebastian Fricke,
Nicolas Dufresne, Hans Verkuil, AngeloGioacchino Del Regno,
Benjamin Gaignard, Nathan Hebert, Daniel Almeida
Cc: Hsin-Yi Wang, Fritz Koenig, Daniel Vetter, Steve Cho, Yunfei Dong,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, Project_Global_Chrome_Upstream_Group
Hardware can parse the slice synatx to get nal information in
scp, needn't to parse it in kernel again.
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
---
.../vcodec/decoder/vdec/vdec_h264_req_multi_if.c | 13 ++-----------
1 file changed, 2 insertions(+), 11 deletions(-)
diff --git a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
index d3f8d62238c0..76b96924a2a7 100644
--- a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
+++ b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
@@ -634,11 +634,10 @@ static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
struct vdec_h264_slice_inst *inst = h_vdec;
struct vdec_vpu_inst *vpu = &inst->vpu;
struct mtk_video_dec_buf *src_buf_info;
- int nal_start_idx, err, timeout = 0;
+ int err, timeout = 0;
unsigned int data[2];
struct vdec_lat_buf *lat_buf;
struct vdec_h264_slice_share_info *share_info;
- unsigned char *buf;
if (vdec_msg_queue_init(&inst->ctx->msg_queue, inst->ctx,
vdec_h264_slice_core_decode,
@@ -662,14 +661,6 @@ static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
share_info = lat_buf->private_data;
src_buf_info = container_of(bs, struct mtk_video_dec_buf, bs_buffer);
- buf = (unsigned char *)bs->va;
- nal_start_idx = mtk_vdec_h264_find_start_code(buf, bs->size);
- if (nal_start_idx < 0) {
- err = -EINVAL;
- goto err_free_fb_out;
- }
-
- inst->vsi->dec.nal_info = buf[nal_start_idx];
lat_buf->vb2_v4l2_src = &src_buf_info->m2m_buf.vb;
v4l2_m2m_buf_copy_metadata(&src_buf_info->m2m_buf.vb, &lat_buf->ts_info, true);
@@ -677,7 +668,7 @@ static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
if (err)
goto err_free_fb_out;
- vdec_h264_insert_startcode(inst->ctx->dev, buf, &bs->size,
+ vdec_h264_insert_startcode(inst->ctx->dev, bs->va, &bs->size,
&share_info->h264_slice_params.pps);
*res_chg = inst->resolution_changed;
--
2.46.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* Re: [PATCH 2/6] media: mediatek: vcodec: remove parse nal info in kernel
2024-10-14 7:33 ` [PATCH 2/6] media: mediatek: vcodec: remove parse nal info in kernel Yunfei Dong
@ 2024-10-15 7:58 ` Chen-Yu Tsai
2024-10-16 3:46 ` Yunfei Dong (董云飞)
0 siblings, 1 reply; 11+ messages in thread
From: Chen-Yu Tsai @ 2024-10-15 7:58 UTC (permalink / raw)
To: Yunfei Dong
Cc: Nícolas F . R . A . Prado, Sebastian Fricke,
Nicolas Dufresne, Hans Verkuil, AngeloGioacchino Del Regno,
Benjamin Gaignard, Nathan Hebert, Daniel Almeida, Hsin-Yi Wang,
Fritz Koenig, Daniel Vetter, Steve Cho, linux-media, devicetree,
linux-kernel, linux-arm-kernel, linux-mediatek,
Project_Global_Chrome_Upstream_Group
On Mon, Oct 14, 2024 at 3:33 PM Yunfei Dong <yunfei.dong@mediatek.com> wrote:
>
> Hardware can parse the slice synatx to get nal information in
> scp, needn't to parse it in kernel again.
Does this apply to all existing shipped SCP firmware? If not, please
put this behind a vdec firmware flag.
ChenYu
> Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
> ---
> .../vcodec/decoder/vdec/vdec_h264_req_multi_if.c | 13 ++-----------
> 1 file changed, 2 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
> index d3f8d62238c0..76b96924a2a7 100644
> --- a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
> +++ b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
> @@ -634,11 +634,10 @@ static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
> struct vdec_h264_slice_inst *inst = h_vdec;
> struct vdec_vpu_inst *vpu = &inst->vpu;
> struct mtk_video_dec_buf *src_buf_info;
> - int nal_start_idx, err, timeout = 0;
> + int err, timeout = 0;
> unsigned int data[2];
> struct vdec_lat_buf *lat_buf;
> struct vdec_h264_slice_share_info *share_info;
> - unsigned char *buf;
>
> if (vdec_msg_queue_init(&inst->ctx->msg_queue, inst->ctx,
> vdec_h264_slice_core_decode,
> @@ -662,14 +661,6 @@ static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
> share_info = lat_buf->private_data;
> src_buf_info = container_of(bs, struct mtk_video_dec_buf, bs_buffer);
>
> - buf = (unsigned char *)bs->va;
> - nal_start_idx = mtk_vdec_h264_find_start_code(buf, bs->size);
> - if (nal_start_idx < 0) {
> - err = -EINVAL;
> - goto err_free_fb_out;
> - }
> -
> - inst->vsi->dec.nal_info = buf[nal_start_idx];
> lat_buf->vb2_v4l2_src = &src_buf_info->m2m_buf.vb;
> v4l2_m2m_buf_copy_metadata(&src_buf_info->m2m_buf.vb, &lat_buf->ts_info, true);
>
> @@ -677,7 +668,7 @@ static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
> if (err)
> goto err_free_fb_out;
>
> - vdec_h264_insert_startcode(inst->ctx->dev, buf, &bs->size,
> + vdec_h264_insert_startcode(inst->ctx->dev, bs->va, &bs->size,
> &share_info->h264_slice_params.pps);
>
> *res_chg = inst->resolution_changed;
> --
> 2.46.0
>
>
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: [PATCH 2/6] media: mediatek: vcodec: remove parse nal info in kernel
2024-10-15 7:58 ` Chen-Yu Tsai
@ 2024-10-16 3:46 ` Yunfei Dong (董云飞)
0 siblings, 0 replies; 11+ messages in thread
From: Yunfei Dong (董云飞) @ 2024-10-16 3:46 UTC (permalink / raw)
To: wenst@chromium.org
Cc: linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org,
frkoenig@chromium.org, stevecho@chromium.org,
nhebert@chromium.org, linux-media@vger.kernel.org,
devicetree@vger.kernel.org, nicolas.dufresne@collabora.com,
daniel.almeida@collabora.com, daniel@ffwll.ch,
Project_Global_Chrome_Upstream_Group,
benjamin.gaignard@collabora.com, sebastian.fricke@collabora.com,
linux-arm-kernel@lists.infradead.org, hverkuil-cisco@xs4all.nl,
hsinyi@chromium.org, AngeloGioacchino Del Regno, Nicolas Prado
Hi Chen-Yu,
Thanks for your help to review the patch.
On Tue, 2024-10-15 at 15:58 +0800, Chen-Yu Tsai wrote:
>
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
> On Mon, Oct 14, 2024 at 3:33 PM Yunfei Dong <
> yunfei.dong@mediatek.com> wrote:
> >
> > Hardware can parse the slice synatx to get nal information in
> > scp, needn't to parse it in kernel again.
>
> Does this apply to all existing shipped SCP firmware? If not, please
> put this behind a vdec firmware flag.
>
Need to remove the parse driver for extend driver, keep the logic for
non extend architecture.
> ChenYu
>
Best Regards,
Yunfei Dong
>
> > Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
> > ---
> > .../vcodec/decoder/vdec/vdec_h264_req_multi_if.c | 13 ++-------
> ----
> > 1 file changed, 2 insertions(+), 11 deletions(-)
> >
> > diff --git
> a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_m
> ulti_if.c
> b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_m
> ulti_if.c
> > index d3f8d62238c0..76b96924a2a7 100644
> > ---
> a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_m
> ulti_if.c
> > +++
> b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_m
> ulti_if.c
> > @@ -634,11 +634,10 @@ static int vdec_h264_slice_lat_decode(void
> *h_vdec, struct mtk_vcodec_mem *bs,
> > struct vdec_h264_slice_inst *inst = h_vdec;
> > struct vdec_vpu_inst *vpu = &inst->vpu;
> > struct mtk_video_dec_buf *src_buf_info;
> > - int nal_start_idx, err, timeout = 0;
> > + int err, timeout = 0;
> > unsigned int data[2];
> > struct vdec_lat_buf *lat_buf;
> > struct vdec_h264_slice_share_info *share_info;
> > - unsigned char *buf;
> >
> > if (vdec_msg_queue_init(&inst->ctx->msg_queue, inst->ctx,
> > vdec_h264_slice_core_decode,
> > @@ -662,14 +661,6 @@ static int vdec_h264_slice_lat_decode(void
> *h_vdec, struct mtk_vcodec_mem *bs,
> > share_info = lat_buf->private_data;
> > src_buf_info = container_of(bs, struct mtk_video_dec_buf,
> bs_buffer);
> >
> > - buf = (unsigned char *)bs->va;
> > - nal_start_idx = mtk_vdec_h264_find_start_code(buf, bs-
> >size);
> > - if (nal_start_idx < 0) {
> > - err = -EINVAL;
> > - goto err_free_fb_out;
> > - }
> > -
> > - inst->vsi->dec.nal_info = buf[nal_start_idx];
> > lat_buf->vb2_v4l2_src = &src_buf_info->m2m_buf.vb;
> > v4l2_m2m_buf_copy_metadata(&src_buf_info->m2m_buf.vb,
> &lat_buf->ts_info, true);
> >
> > @@ -677,7 +668,7 @@ static int vdec_h264_slice_lat_decode(void
> *h_vdec, struct mtk_vcodec_mem *bs,
> > if (err)
> > goto err_free_fb_out;
> >
> > - vdec_h264_insert_startcode(inst->ctx->dev, buf, &bs->size,
> > + vdec_h264_insert_startcode(inst->ctx->dev, bs->va, &bs-
> >size,
> > &share_info-
> >h264_slice_params.pps);
> >
> > *res_chg = inst->resolution_changed;
> > --
> > 2.46.0
> >
> >
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 3/6] media: mediatek: vcodec: remove vsi operation in common interface
2024-10-14 7:33 [PATCH 0/6] media: mediatek: vcodec: support h264 extend vsi Yunfei Dong
2024-10-14 7:33 ` [PATCH 1/6] media: mediatek: vcodec: extend h264 video share information Yunfei Dong
2024-10-14 7:33 ` [PATCH 2/6] media: mediatek: vcodec: remove parse nal info in kernel Yunfei Dong
@ 2024-10-14 7:33 ` Yunfei Dong
2024-10-14 7:33 ` [PATCH 4/6] media: mediatek: vcodec: rename vsi to extend vsi Yunfei Dong
` (3 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Yunfei Dong @ 2024-10-14 7:33 UTC (permalink / raw)
To: Nícolas F . R . A . Prado, Sebastian Fricke,
Nicolas Dufresne, Hans Verkuil, AngeloGioacchino Del Regno,
Benjamin Gaignard, Nathan Hebert, Daniel Almeida
Cc: Hsin-Yi Wang, Fritz Koenig, Daniel Vetter, Steve Cho, Yunfei Dong,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, Project_Global_Chrome_Upstream_Group
Remove vsi related operation in common interface to make sure the
interface can be called by different architecture at the same time.
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
---
.../decoder/vdec/vdec_h264_req_multi_if.c | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
index 76b96924a2a7..02ad579bfe8e 100644
--- a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
+++ b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
@@ -187,9 +187,9 @@ struct vdec_h264_slice_inst {
};
static int vdec_h264_slice_fill_decode_parameters(struct vdec_h264_slice_inst *inst,
- struct vdec_h264_slice_share_info *share_info)
+ struct vdec_h264_slice_share_info *share_info,
+ struct vdec_h264_slice_lat_dec_param *slice_data)
{
- struct vdec_h264_slice_lat_dec_param *slice_param = &inst->vsi->h264_slice_params;
const struct v4l2_ctrl_h264_decode_params *dec_params;
const struct v4l2_ctrl_h264_scaling_matrix *src_matrix;
const struct v4l2_ctrl_h264_sps *sps;
@@ -219,9 +219,9 @@ static int vdec_h264_slice_fill_decode_parameters(struct vdec_h264_slice_inst *i
return -EINVAL;
}
- mtk_vdec_h264_copy_sps_params(&slice_param->sps, sps);
- mtk_vdec_h264_copy_pps_params(&slice_param->pps, pps);
- mtk_vdec_h264_copy_scaling_matrix(&slice_param->scaling_matrix, src_matrix);
+ mtk_vdec_h264_copy_sps_params(&slice_data->sps, sps);
+ mtk_vdec_h264_copy_pps_params(&slice_data->pps, pps);
+ mtk_vdec_h264_copy_scaling_matrix(&slice_data->scaling_matrix, src_matrix);
memcpy(&share_info->sps, sps, sizeof(*sps));
memcpy(&share_info->dec_params, dec_params, sizeof(*dec_params));
@@ -282,9 +282,6 @@ static int get_vdec_sig_decode_parameters(struct vdec_h264_slice_inst *inst)
mtk_vdec_h264_get_ref_list(b0_reflist, v4l2_b0_reflist, reflist_builder.num_valid);
mtk_vdec_h264_get_ref_list(b1_reflist, v4l2_b1_reflist, reflist_builder.num_valid);
- memcpy(&inst->vsi_ctx.h264_slice_params, slice_param,
- sizeof(inst->vsi_ctx.h264_slice_params));
-
return 0;
}
@@ -664,7 +661,8 @@ static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
lat_buf->vb2_v4l2_src = &src_buf_info->m2m_buf.vb;
v4l2_m2m_buf_copy_metadata(&src_buf_info->m2m_buf.vb, &lat_buf->ts_info, true);
- err = vdec_h264_slice_fill_decode_parameters(inst, share_info);
+ err = vdec_h264_slice_fill_decode_parameters(inst, share_info,
+ &inst->vsi->h264_slice_params);
if (err)
goto err_free_fb_out;
@@ -788,6 +786,9 @@ static int vdec_h264_slice_single_decode(void *h_vdec, struct mtk_vcodec_mem *bs
if (err)
goto err_free_fb_out;
+ memcpy(&inst->vsi_ctx.h264_slice_params, &inst->h264_slice_param,
+ sizeof(inst->vsi_ctx.h264_slice_params));
+
buf = (unsigned char *)bs->va;
nal_start_idx = mtk_vdec_h264_find_start_code(buf, bs->size);
if (nal_start_idx < 0) {
--
2.46.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH 4/6] media: mediatek: vcodec: rename vsi to extend vsi
2024-10-14 7:33 [PATCH 0/6] media: mediatek: vcodec: support h264 extend vsi Yunfei Dong
` (2 preceding siblings ...)
2024-10-14 7:33 ` [PATCH 3/6] media: mediatek: vcodec: remove vsi operation in common interface Yunfei Dong
@ 2024-10-14 7:33 ` Yunfei Dong
2024-10-14 7:33 ` [PATCH 5/6] media: mediatek: vcodec: adding non extend struct Yunfei Dong
` (2 subsequent siblings)
6 siblings, 0 replies; 11+ messages in thread
From: Yunfei Dong @ 2024-10-14 7:33 UTC (permalink / raw)
To: Nícolas F . R . A . Prado, Sebastian Fricke,
Nicolas Dufresne, Hans Verkuil, AngeloGioacchino Del Regno,
Benjamin Gaignard, Nathan Hebert, Daniel Almeida
Cc: Hsin-Yi Wang, Fritz Koenig, Daniel Vetter, Steve Cho, Yunfei Dong,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, Project_Global_Chrome_Upstream_Group
Rename vsi struct to extend vsi to support extend architecture.
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
---
.../decoder/vdec/vdec_h264_req_multi_if.c | 167 +++++++++---------
1 file changed, 85 insertions(+), 82 deletions(-)
diff --git a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
index 02ad579bfe8e..ba7fd3200d98 100644
--- a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
+++ b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
@@ -48,7 +48,7 @@ struct vdec_h264_slice_lat_dec_param {
};
/**
- * struct vdec_h264_slice_info - decode information
+ * struct vdec_h264_slice_info_ex - extend decode information
*
* @wdma_end_addr_offset: offset from buffer start
* @nal_info: nal info of current picture
@@ -57,7 +57,7 @@ struct vdec_h264_slice_lat_dec_param {
* @crc: Used to check whether hardware's status is right
* @reserved: reserved
*/
-struct vdec_h264_slice_info {
+struct vdec_h264_slice_info_ex {
u64 wdma_end_addr_offset;
u16 nal_info;
u16 timeout;
@@ -92,7 +92,7 @@ struct vdec_h264_slice_fb {
};
/**
- * struct vdec_h264_slice_vsi - shared memory for decode information exchange
+ * struct vdec_h264_slice_vsi_ex - extend shared memory for decode information exchange
* between SCP and Host.
*
* @bs: input buffer info
@@ -108,7 +108,7 @@ struct vdec_h264_slice_fb {
* @dec: decode information (AP-R, VPU-W)
* @h264_slice_params: decode parameters for hw used
*/
-struct vdec_h264_slice_vsi {
+struct vdec_h264_slice_vsi_ex {
/* LAT dec addr */
struct vdec_h264_slice_mem bs;
struct vdec_h264_slice_fb fb;
@@ -120,7 +120,7 @@ struct vdec_h264_slice_vsi {
struct vdec_h264_slice_mem slice_bc;
struct vdec_h264_slice_mem mv_buf_dma[H264_MAX_MV_NUM];
- struct vdec_h264_slice_info dec;
+ struct vdec_h264_slice_info_ex dec;
struct vdec_h264_slice_lat_dec_param h264_slice_params;
};
@@ -152,10 +152,10 @@ struct vdec_h264_slice_share_info {
* @pred_buf: HW working prediction buffer
* @mv_buf: HW working motion vector buffer
* @vpu: VPU instance
- * @vsi: vsi used for lat
- * @vsi_core: vsi used for core
+ * @vsi_ex: extend vsi used for lat
+ * @vsi_core_ex: extend vsi used for core
*
- * @vsi_ctx: Local VSI data for this decoding context
+ * @vsi_ctx_ex: Local extend vsi data for this decoding context
* @h264_slice_param: the parameters that hardware use to decode
*
* @resolution_changed:resolution changed
@@ -172,10 +172,10 @@ struct vdec_h264_slice_inst {
struct mtk_vcodec_mem pred_buf;
struct mtk_vcodec_mem mv_buf[H264_MAX_MV_NUM];
struct vdec_vpu_inst vpu;
- struct vdec_h264_slice_vsi *vsi;
- struct vdec_h264_slice_vsi *vsi_core;
+ struct vdec_h264_slice_vsi_ex *vsi_ex;
+ struct vdec_h264_slice_vsi_ex *vsi_core_ex;
- struct vdec_h264_slice_vsi vsi_ctx;
+ struct vdec_h264_slice_vsi_ex vsi_ctx_ex;
struct vdec_h264_slice_lat_dec_param h264_slice_param;
unsigned int resolution_changed;
@@ -412,28 +412,28 @@ static void vdec_h264_slice_setup_lat_buffer(struct vdec_h264_slice_inst *inst,
struct mtk_vcodec_mem *mem;
int i;
- inst->vsi->bs.dma_addr = (u64)bs->dma_addr;
- inst->vsi->bs.size = bs->size;
+ inst->vsi_ex->bs.dma_addr = (u64)bs->dma_addr;
+ inst->vsi_ex->bs.size = bs->size;
for (i = 0; i < H264_MAX_MV_NUM; i++) {
mem = &inst->mv_buf[i];
- inst->vsi->mv_buf_dma[i].dma_addr = mem->dma_addr;
- inst->vsi->mv_buf_dma[i].size = mem->size;
+ inst->vsi_ex->mv_buf_dma[i].dma_addr = mem->dma_addr;
+ inst->vsi_ex->mv_buf_dma[i].size = mem->size;
}
- inst->vsi->ube.dma_addr = lat_buf->ctx->msg_queue.wdma_addr.dma_addr;
- inst->vsi->ube.size = lat_buf->ctx->msg_queue.wdma_addr.size;
+ inst->vsi_ex->ube.dma_addr = lat_buf->ctx->msg_queue.wdma_addr.dma_addr;
+ inst->vsi_ex->ube.size = lat_buf->ctx->msg_queue.wdma_addr.size;
- inst->vsi->row_info.dma_addr = 0;
- inst->vsi->row_info.size = 0;
+ inst->vsi_ex->row_info.dma_addr = 0;
+ inst->vsi_ex->row_info.size = 0;
- inst->vsi->err_map.dma_addr = lat_buf->wdma_err_addr.dma_addr;
- inst->vsi->err_map.size = lat_buf->wdma_err_addr.size;
+ inst->vsi_ex->err_map.dma_addr = lat_buf->wdma_err_addr.dma_addr;
+ inst->vsi_ex->err_map.size = lat_buf->wdma_err_addr.size;
- inst->vsi->slice_bc.dma_addr = lat_buf->slice_bc_addr.dma_addr;
- inst->vsi->slice_bc.size = lat_buf->slice_bc_addr.size;
+ inst->vsi_ex->slice_bc.dma_addr = lat_buf->slice_bc_addr.dma_addr;
+ inst->vsi_ex->slice_bc.size = lat_buf->slice_bc_addr.size;
- inst->vsi->trans.dma_addr_end = inst->ctx->msg_queue.wdma_rptr_addr;
- inst->vsi->trans.dma_addr = inst->ctx->msg_queue.wdma_wptr_addr;
+ inst->vsi_ex->trans.dma_addr_end = inst->ctx->msg_queue.wdma_rptr_addr;
+ inst->vsi_ex->trans.dma_addr = inst->ctx->msg_queue.wdma_wptr_addr;
}
static int vdec_h264_slice_setup_core_buffer(struct vdec_h264_slice_inst *inst,
@@ -462,33 +462,33 @@ static int vdec_h264_slice_setup_core_buffer(struct vdec_h264_slice_inst *inst,
mtk_vdec_debug(ctx, "[h264-core] y/c addr = 0x%llx 0x%llx", y_fb_dma, c_fb_dma);
- inst->vsi_core->fb.y.dma_addr = y_fb_dma;
- inst->vsi_core->fb.y.size = ctx->picinfo.fb_sz[0];
- inst->vsi_core->fb.c.dma_addr = c_fb_dma;
- inst->vsi_core->fb.c.size = ctx->picinfo.fb_sz[1];
+ inst->vsi_core_ex->fb.y.dma_addr = y_fb_dma;
+ inst->vsi_core_ex->fb.y.size = ctx->picinfo.fb_sz[0];
+ inst->vsi_core_ex->fb.c.dma_addr = c_fb_dma;
+ inst->vsi_core_ex->fb.c.size = ctx->picinfo.fb_sz[1];
- inst->vsi_core->dec.vdec_fb_va = (unsigned long)fb;
- inst->vsi_core->dec.nal_info = share_info->nal_info;
+ inst->vsi_core_ex->dec.vdec_fb_va = (unsigned long)fb;
+ inst->vsi_core_ex->dec.nal_info = share_info->nal_info;
- inst->vsi_core->ube.dma_addr = lat_buf->ctx->msg_queue.wdma_addr.dma_addr;
- inst->vsi_core->ube.size = lat_buf->ctx->msg_queue.wdma_addr.size;
+ inst->vsi_core_ex->ube.dma_addr = lat_buf->ctx->msg_queue.wdma_addr.dma_addr;
+ inst->vsi_core_ex->ube.size = lat_buf->ctx->msg_queue.wdma_addr.size;
- inst->vsi_core->err_map.dma_addr = lat_buf->wdma_err_addr.dma_addr;
- inst->vsi_core->err_map.size = lat_buf->wdma_err_addr.size;
+ inst->vsi_core_ex->err_map.dma_addr = lat_buf->wdma_err_addr.dma_addr;
+ inst->vsi_core_ex->err_map.size = lat_buf->wdma_err_addr.size;
- inst->vsi_core->slice_bc.dma_addr = lat_buf->slice_bc_addr.dma_addr;
- inst->vsi_core->slice_bc.size = lat_buf->slice_bc_addr.size;
+ inst->vsi_core_ex->slice_bc.dma_addr = lat_buf->slice_bc_addr.dma_addr;
+ inst->vsi_core_ex->slice_bc.size = lat_buf->slice_bc_addr.size;
- inst->vsi_core->row_info.dma_addr = 0;
- inst->vsi_core->row_info.size = 0;
+ inst->vsi_core_ex->row_info.dma_addr = 0;
+ inst->vsi_core_ex->row_info.size = 0;
- inst->vsi_core->trans.dma_addr = share_info->trans_start;
- inst->vsi_core->trans.dma_addr_end = share_info->trans_end;
+ inst->vsi_core_ex->trans.dma_addr = share_info->trans_start;
+ inst->vsi_core_ex->trans.dma_addr_end = share_info->trans_end;
for (i = 0; i < H264_MAX_MV_NUM; i++) {
mem = &inst->mv_buf[i];
- inst->vsi_core->mv_buf_dma[i].dma_addr = mem->dma_addr;
- inst->vsi_core->mv_buf_dma[i].size = mem->size;
+ inst->vsi_core_ex->mv_buf_dma[i].dma_addr = mem->dma_addr;
+ inst->vsi_core_ex->mv_buf_dma[i].size = mem->size;
}
vb2_v4l2 = v4l2_m2m_next_dst_buf(ctx->m2m_ctx);
@@ -520,10 +520,10 @@ static int vdec_h264_slice_init(struct mtk_vcodec_dec_ctx *ctx)
goto error_free_inst;
}
- vsi_size = round_up(sizeof(struct vdec_h264_slice_vsi), VCODEC_DEC_ALIGNED_64);
- inst->vsi = inst->vpu.vsi;
- inst->vsi_core =
- (struct vdec_h264_slice_vsi *)(((char *)inst->vpu.vsi) + vsi_size);
+ vsi_size = round_up(sizeof(struct vdec_h264_slice_vsi_ex), VCODEC_DEC_ALIGNED_64);
+ inst->vsi_ex = inst->vpu.vsi;
+ inst->vsi_core_ex =
+ (struct vdec_h264_slice_vsi_ex *)(((char *)inst->vpu.vsi) + vsi_size);
inst->resolution_changed = true;
inst->realloc_mv_buf = true;
@@ -564,14 +564,14 @@ static int vdec_h264_slice_core_decode(struct vdec_lat_buf *lat_buf)
struct vdec_vpu_inst *vpu = &inst->vpu;
mtk_vdec_debug(ctx, "[h264-core] vdec_h264 core decode");
- memcpy(&inst->vsi_core->h264_slice_params, &share_info->h264_slice_params,
+ memcpy(&inst->vsi_core_ex->h264_slice_params, &share_info->h264_slice_params,
sizeof(share_info->h264_slice_params));
err = vdec_h264_slice_setup_core_buffer(inst, share_info, lat_buf);
if (err)
goto vdec_dec_end;
- vdec_h264_slice_fill_decode_reflist(inst, &inst->vsi_core->h264_slice_params,
+ vdec_h264_slice_fill_decode_reflist(inst, &inst->vsi_core_ex->h264_slice_params,
share_info);
err = vpu_dec_core(vpu);
if (err) {
@@ -584,15 +584,15 @@ static int vdec_h264_slice_core_decode(struct vdec_lat_buf *lat_buf)
WAIT_INTR_TIMEOUT_MS, MTK_VDEC_CORE);
if (timeout)
mtk_vdec_err(ctx, "core decode timeout: pic_%d", ctx->decoded_frame_cnt);
- inst->vsi_core->dec.timeout = !!timeout;
+ inst->vsi_core_ex->dec.timeout = !!timeout;
vpu_dec_core_end(vpu);
mtk_vdec_debug(ctx, "pic[%d] crc: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x",
ctx->decoded_frame_cnt,
- inst->vsi_core->dec.crc[0], inst->vsi_core->dec.crc[1],
- inst->vsi_core->dec.crc[2], inst->vsi_core->dec.crc[3],
- inst->vsi_core->dec.crc[4], inst->vsi_core->dec.crc[5],
- inst->vsi_core->dec.crc[6], inst->vsi_core->dec.crc[7]);
+ inst->vsi_core_ex->dec.crc[0], inst->vsi_core_ex->dec.crc[1],
+ inst->vsi_core_ex->dec.crc[2], inst->vsi_core_ex->dec.crc[3],
+ inst->vsi_core_ex->dec.crc[4], inst->vsi_core_ex->dec.crc[5],
+ inst->vsi_core_ex->dec.crc[6], inst->vsi_core_ex->dec.crc[7]);
vdec_dec_end:
vdec_msg_queue_update_ube_rptr(&lat_buf->ctx->msg_queue, share_info->trans_end);
@@ -662,7 +662,7 @@ static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
v4l2_m2m_buf_copy_metadata(&src_buf_info->m2m_buf.vb, &lat_buf->ts_info, true);
err = vdec_h264_slice_fill_decode_parameters(inst, share_info,
- &inst->vsi->h264_slice_params);
+ &inst->vsi_ex->h264_slice_params);
if (err)
goto err_free_fb_out;
@@ -683,12 +683,13 @@ static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
vdec_h264_slice_setup_lat_buffer(inst, bs, lat_buf);
mtk_vdec_debug(inst->ctx, "lat:trans(0x%llx 0x%lx) err:0x%llx",
- inst->vsi->ube.dma_addr, (unsigned long)inst->vsi->ube.size,
- inst->vsi->err_map.dma_addr);
+ inst->vsi_ex->ube.dma_addr, (unsigned long)inst->vsi_ex->ube.size,
+ inst->vsi_ex->err_map.dma_addr);
mtk_vdec_debug(inst->ctx, "slice(0x%llx 0x%lx) rprt((0x%llx 0x%llx))",
- inst->vsi->slice_bc.dma_addr, (unsigned long)inst->vsi->slice_bc.size,
- inst->vsi->trans.dma_addr, inst->vsi->trans.dma_addr_end);
+ inst->vsi_ex->slice_bc.dma_addr, (unsigned long)inst->vsi_ex->slice_bc.size,
+ inst->vsi_ex->trans.dma_addr, inst->vsi_ex->trans.dma_addr_end);
+
err = vpu_dec_start(vpu, data, 2);
if (err) {
mtk_vdec_debug(inst->ctx, "lat decode err: %d", err);
@@ -696,13 +697,13 @@ static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
}
share_info->trans_end = inst->ctx->msg_queue.wdma_addr.dma_addr +
- inst->vsi->dec.wdma_end_addr_offset;
+ inst->vsi_ex->dec.wdma_end_addr_offset;
share_info->trans_start = inst->ctx->msg_queue.wdma_wptr_addr;
- share_info->nal_info = inst->vsi->dec.nal_info;
+ share_info->nal_info = inst->vsi_ex->dec.nal_info;
if (IS_VDEC_INNER_RACING(inst->ctx->dev->dec_capability)) {
- memcpy(&share_info->h264_slice_params, &inst->vsi->h264_slice_params,
+ memcpy(&share_info->h264_slice_params, &inst->vsi_ex->h264_slice_params,
sizeof(share_info->h264_slice_params));
vdec_msg_queue_qbuf(&inst->ctx->msg_queue.core_ctx, lat_buf);
}
@@ -712,7 +713,7 @@ static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
WAIT_INTR_TIMEOUT_MS, MTK_VDEC_LAT0);
if (timeout)
mtk_vdec_err(inst->ctx, "lat decode timeout: pic_%d", inst->slice_dec_num);
- inst->vsi->dec.timeout = !!timeout;
+ inst->vsi_ex->dec.timeout = !!timeout;
err = vpu_dec_end(vpu);
if (err == SLICE_HEADER_FULL || err == TRANS_BUFFER_FULL) {
@@ -724,16 +725,18 @@ static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
}
share_info->trans_end = inst->ctx->msg_queue.wdma_addr.dma_addr +
- inst->vsi->dec.wdma_end_addr_offset;
+ inst->vsi_ex->dec.wdma_end_addr_offset;
+
vdec_msg_queue_update_ube_wptr(&lat_buf->ctx->msg_queue, share_info->trans_end);
if (!IS_VDEC_INNER_RACING(inst->ctx->dev->dec_capability)) {
- memcpy(&share_info->h264_slice_params, &inst->vsi->h264_slice_params,
+ memcpy(&share_info->h264_slice_params, &inst->vsi_ex->h264_slice_params,
sizeof(share_info->h264_slice_params));
vdec_msg_queue_qbuf(&inst->ctx->msg_queue.core_ctx, lat_buf);
}
mtk_vdec_debug(inst->ctx, "dec num: %d lat crc: 0x%x 0x%x 0x%x", inst->slice_dec_num,
- inst->vsi->dec.crc[0], inst->vsi->dec.crc[1], inst->vsi->dec.crc[2]);
+ inst->vsi_ex->dec.crc[0], inst->vsi_ex->dec.crc[1],
+ inst->vsi_ex->dec.crc[2]);
inst->slice_dec_num++;
return 0;
@@ -774,11 +777,11 @@ static int vdec_h264_slice_single_decode(void *h_vdec, struct mtk_vcodec_mem *bs
mtk_vdec_debug(inst->ctx, "[h264-dec] [%d] y_dma=%llx c_dma=%llx",
inst->ctx->decoded_frame_cnt, y_fb_dma, c_fb_dma);
- inst->vsi_ctx.bs.dma_addr = (u64)bs->dma_addr;
- inst->vsi_ctx.bs.size = bs->size;
- inst->vsi_ctx.fb.y.dma_addr = y_fb_dma;
- inst->vsi_ctx.fb.c.dma_addr = c_fb_dma;
- inst->vsi_ctx.dec.vdec_fb_va = (u64)(uintptr_t)fb;
+ inst->vsi_ctx_ex.bs.dma_addr = (u64)bs->dma_addr;
+ inst->vsi_ctx_ex.bs.size = bs->size;
+ inst->vsi_ctx_ex.fb.y.dma_addr = y_fb_dma;
+ inst->vsi_ctx_ex.fb.c.dma_addr = c_fb_dma;
+ inst->vsi_ctx_ex.dec.vdec_fb_va = (u64)(uintptr_t)fb;
v4l2_m2m_buf_copy_metadata(&src_buf_info->m2m_buf.vb,
&dst_buf_info->m2m_buf.vb, true);
@@ -786,8 +789,8 @@ static int vdec_h264_slice_single_decode(void *h_vdec, struct mtk_vcodec_mem *bs
if (err)
goto err_free_fb_out;
- memcpy(&inst->vsi_ctx.h264_slice_params, &inst->h264_slice_param,
- sizeof(inst->vsi_ctx.h264_slice_params));
+ memcpy(&inst->vsi_ctx_ex.h264_slice_params, &inst->h264_slice_param,
+ sizeof(inst->vsi_ctx_ex.h264_slice_params));
buf = (unsigned char *)bs->va;
nal_start_idx = mtk_vdec_h264_find_start_code(buf, bs->size);
@@ -795,7 +798,7 @@ static int vdec_h264_slice_single_decode(void *h_vdec, struct mtk_vcodec_mem *bs
err = -EINVAL;
goto err_free_fb_out;
}
- inst->vsi_ctx.dec.nal_info = buf[nal_start_idx];
+ inst->vsi_ctx_ex.dec.nal_info = buf[nal_start_idx];
*res_chg = inst->resolution_changed;
if (inst->resolution_changed) {
@@ -810,11 +813,11 @@ static int vdec_h264_slice_single_decode(void *h_vdec, struct mtk_vcodec_mem *bs
for (i = 0; i < H264_MAX_MV_NUM; i++) {
mem = &inst->mv_buf[i];
- inst->vsi_ctx.mv_buf_dma[i].dma_addr = mem->dma_addr;
+ inst->vsi_ctx_ex.mv_buf_dma[i].dma_addr = mem->dma_addr;
}
}
- memcpy(inst->vpu.vsi, &inst->vsi_ctx, sizeof(inst->vsi_ctx));
+ memcpy(inst->vpu.vsi, &inst->vsi_ctx_ex, sizeof(inst->vsi_ctx_ex));
err = vpu_dec_start(vpu, data, 2);
if (err)
goto err_free_fb_out;
@@ -825,18 +828,18 @@ static int vdec_h264_slice_single_decode(void *h_vdec, struct mtk_vcodec_mem *bs
if (err)
mtk_vdec_err(inst->ctx, "decode timeout: pic_%d", inst->ctx->decoded_frame_cnt);
- inst->vsi->dec.timeout = !!err;
+ inst->vsi_ex->dec.timeout = !!err;
err = vpu_dec_end(vpu);
if (err)
goto err_free_fb_out;
- memcpy(&inst->vsi_ctx, inst->vpu.vsi, sizeof(inst->vsi_ctx));
+ memcpy(&inst->vsi_ctx_ex, inst->vpu.vsi, sizeof(inst->vsi_ctx_ex));
mtk_vdec_debug(inst->ctx, "pic[%d] crc: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x",
inst->ctx->decoded_frame_cnt,
- inst->vsi_ctx.dec.crc[0], inst->vsi_ctx.dec.crc[1],
- inst->vsi_ctx.dec.crc[2], inst->vsi_ctx.dec.crc[3],
- inst->vsi_ctx.dec.crc[4], inst->vsi_ctx.dec.crc[5],
- inst->vsi_ctx.dec.crc[6], inst->vsi_ctx.dec.crc[7]);
+ inst->vsi_ctx_ex.dec.crc[0], inst->vsi_ctx_ex.dec.crc[1],
+ inst->vsi_ctx_ex.dec.crc[2], inst->vsi_ctx_ex.dec.crc[3],
+ inst->vsi_ctx_ex.dec.crc[4], inst->vsi_ctx_ex.dec.crc[5],
+ inst->vsi_ctx_ex.dec.crc[6], inst->vsi_ctx_ex.dec.crc[7]);
inst->ctx->decoded_frame_cnt++;
return 0;
--
2.46.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH 5/6] media: mediatek: vcodec: adding non extend struct
2024-10-14 7:33 [PATCH 0/6] media: mediatek: vcodec: support h264 extend vsi Yunfei Dong
` (3 preceding siblings ...)
2024-10-14 7:33 ` [PATCH 4/6] media: mediatek: vcodec: rename vsi to extend vsi Yunfei Dong
@ 2024-10-14 7:33 ` Yunfei Dong
2024-10-14 7:33 ` [PATCH 6/6] media: mediatek: vcodec: support extend h264 driver Yunfei Dong
2024-10-15 7:54 ` [PATCH 0/6] media: mediatek: vcodec: support h264 extend vsi Chen-Yu Tsai
6 siblings, 0 replies; 11+ messages in thread
From: Yunfei Dong @ 2024-10-14 7:33 UTC (permalink / raw)
To: Nícolas F . R . A . Prado, Sebastian Fricke,
Nicolas Dufresne, Hans Verkuil, AngeloGioacchino Del Regno,
Benjamin Gaignard, Nathan Hebert, Daniel Almeida
Cc: Hsin-Yi Wang, Fritz Koenig, Daniel Vetter, Steve Cho, Yunfei Dong,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, Project_Global_Chrome_Upstream_Group
Adding non extend struct to support old architecture to calculate
address end in kernel.
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
---
.../decoder/vdec/vdec_h264_req_multi_if.c | 76 ++++++++++++++++++-
1 file changed, 73 insertions(+), 3 deletions(-)
diff --git a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
index ba7fd3200d98..d6dc1cc5a712 100644
--- a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
+++ b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
@@ -66,6 +66,29 @@ struct vdec_h264_slice_info_ex {
u32 reserved;
};
+/**
+ * struct vdec_h264_slice_info - decode information
+ *
+ * @nal_info: nal info of current picture
+ * @timeout: Decode timeout: 1 timeout, 0 no timeount
+ * @bs_buf_size: bitstream size
+ * @bs_buf_addr: bitstream buffer dma address
+ * @y_fb_dma: Y frame buffer dma address
+ * @c_fb_dma: C frame buffer dma address
+ * @vdec_fb_va: VDEC frame buffer struct virtual address
+ * @crc: Used to check whether hardware's status is right
+ */
+struct vdec_h264_slice_info {
+ u16 nal_info;
+ u16 timeout;
+ u32 bs_buf_size;
+ u64 bs_buf_addr;
+ u64 y_fb_dma;
+ u64 c_fb_dma;
+ u64 vdec_fb_va;
+ u32 crc[8];
+};
+
/*
* struct vdec_h264_slice_mem - memory address and size
*/
@@ -124,6 +147,44 @@ struct vdec_h264_slice_vsi_ex {
struct vdec_h264_slice_lat_dec_param h264_slice_params;
};
+/**
+ * struct vdec_h264_slice_vsi - shared memory for decode information exchange
+ * between SCP and Host.
+ *
+ * @wdma_err_addr: wdma error dma address
+ * @wdma_start_addr: wdma start dma address
+ * @wdma_end_addr: wdma end dma address
+ * @slice_bc_start_addr: slice bc start dma address
+ * @slice_bc_end_addr: slice bc end dma address
+ * @row_info_start_addr: row info start dma address
+ * @row_info_end_addr: row info end dma address
+ * @trans_start: trans start dma address
+ * @trans_end: trans end dma address
+ * @wdma_end_addr_offset: wdma end address offset
+ *
+ * @mv_buf_dma: HW working motion vector buffer
+ * dma address (AP-W, VPU-R)
+ * @dec: decode information (AP-R, VPU-W)
+ * @h264_slice_params: decode parameters for hw used
+ */
+struct vdec_h264_slice_vsi {
+ /* LAT dec addr */
+ u64 wdma_err_addr;
+ u64 wdma_start_addr;
+ u64 wdma_end_addr;
+ u64 slice_bc_start_addr;
+ u64 slice_bc_end_addr;
+ u64 row_info_start_addr;
+ u64 row_info_end_addr;
+ u64 trans_start;
+ u64 trans_end;
+ u64 wdma_end_addr_offset;
+
+ u64 mv_buf_dma[H264_MAX_MV_NUM];
+ struct vdec_h264_slice_info dec;
+ struct vdec_h264_slice_lat_dec_param h264_slice_params;
+};
+
/**
* struct vdec_h264_slice_share_info - shared information used to exchange
* message between lat and core
@@ -172,10 +233,19 @@ struct vdec_h264_slice_inst {
struct mtk_vcodec_mem pred_buf;
struct mtk_vcodec_mem mv_buf[H264_MAX_MV_NUM];
struct vdec_vpu_inst vpu;
- struct vdec_h264_slice_vsi_ex *vsi_ex;
- struct vdec_h264_slice_vsi_ex *vsi_core_ex;
+ union {
+ struct vdec_h264_slice_vsi_ex *vsi_ex;
+ struct vdec_h264_slice_vsi *vsi;
+ };
+ union {
+ struct vdec_h264_slice_vsi_ex *vsi_core_ex;
+ struct vdec_h264_slice_vsi *vsi_core;
+ };
- struct vdec_h264_slice_vsi_ex vsi_ctx_ex;
+ union {
+ struct vdec_h264_slice_vsi_ex vsi_ctx_ex;
+ struct vdec_h264_slice_vsi vsi_ctx;
+ };
struct vdec_h264_slice_lat_dec_param h264_slice_param;
unsigned int resolution_changed;
--
2.46.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* [PATCH 6/6] media: mediatek: vcodec: support extend h264 driver
2024-10-14 7:33 [PATCH 0/6] media: mediatek: vcodec: support h264 extend vsi Yunfei Dong
` (4 preceding siblings ...)
2024-10-14 7:33 ` [PATCH 5/6] media: mediatek: vcodec: adding non extend struct Yunfei Dong
@ 2024-10-14 7:33 ` Yunfei Dong
2024-10-15 7:54 ` [PATCH 0/6] media: mediatek: vcodec: support h264 extend vsi Chen-Yu Tsai
6 siblings, 0 replies; 11+ messages in thread
From: Yunfei Dong @ 2024-10-14 7:33 UTC (permalink / raw)
To: Nícolas F . R . A . Prado, Sebastian Fricke,
Nicolas Dufresne, Hans Verkuil, AngeloGioacchino Del Regno,
Benjamin Gaignard, Nathan Hebert, Daniel Almeida
Cc: Hsin-Yi Wang, Fritz Koenig, Daniel Vetter, Steve Cho, Yunfei Dong,
linux-media, devicetree, linux-kernel, linux-arm-kernel,
linux-mediatek, Project_Global_Chrome_Upstream_Group
Rename the extend interface with _ex and sync the non extend driver.
Adding capability to separate extend and non extend driver.
Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com>
---
.../vcodec/decoder/mtk_vcodec_dec_drv.h | 2 +
.../decoder/vdec/vdec_h264_req_multi_if.c | 377 +++++++++++++++++-
2 files changed, 367 insertions(+), 12 deletions(-)
diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.h b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.h
index 886fa385e2e6..1e697bc810b0 100644
--- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.h
+++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.h
@@ -17,6 +17,7 @@
#define IS_VDEC_LAT_ARCH(hw_arch) ((hw_arch) >= MTK_VDEC_LAT_SINGLE_CORE)
#define IS_VDEC_INNER_RACING(capability) ((capability) & MTK_VCODEC_INNER_RACING)
+#define IS_VDEC_SUPPORT_EX(capability) ((capability) & MTK_VDEC_IS_SUPPORT_EX)
enum mtk_vcodec_dec_chip_name {
MTK_VDEC_INVAL = 0,
@@ -42,6 +43,7 @@ enum mtk_vdec_format_types {
MTK_VDEC_FORMAT_HEVC_FRAME = 0x1000,
MTK_VCODEC_INNER_RACING = 0x20000,
MTK_VDEC_IS_SUPPORT_10BIT = 0x40000,
+ MTK_VDEC_IS_SUPPORT_EX = 0x80000,
};
/*
diff --git a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
index d6dc1cc5a712..94be1ad394c9 100644
--- a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
+++ b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_h264_req_multi_if.c
@@ -571,6 +571,7 @@ static int vdec_h264_slice_init(struct mtk_vcodec_dec_ctx *ctx)
{
struct vdec_h264_slice_inst *inst;
int err, vsi_size;
+ unsigned char *temp;
inst = kzalloc(sizeof(*inst), GFP_KERNEL);
if (!inst)
@@ -590,10 +591,21 @@ static int vdec_h264_slice_init(struct mtk_vcodec_dec_ctx *ctx)
goto error_free_inst;
}
- vsi_size = round_up(sizeof(struct vdec_h264_slice_vsi_ex), VCODEC_DEC_ALIGNED_64);
- inst->vsi_ex = inst->vpu.vsi;
- inst->vsi_core_ex =
- (struct vdec_h264_slice_vsi_ex *)(((char *)inst->vpu.vsi) + vsi_size);
+ if (IS_VDEC_SUPPORT_EX(ctx->dev->dec_capability)) {
+ vsi_size = sizeof(struct vdec_h264_slice_vsi_ex);
+
+ vsi_size = round_up(vsi_size, VCODEC_DEC_ALIGNED_64);
+ inst->vsi_ex = inst->vpu.vsi;
+ temp = (unsigned char *)inst->vsi_ex;
+ inst->vsi_core_ex = (struct vdec_h264_slice_vsi_ex *)(temp + vsi_size);
+ } else {
+ vsi_size = sizeof(struct vdec_h264_slice_vsi);
+
+ vsi_size = round_up(vsi_size, VCODEC_DEC_ALIGNED_64);
+ inst->vsi = inst->vpu.vsi;
+ temp = (unsigned char *)inst->vsi;
+ inst->vsi_core = (struct vdec_h264_slice_vsi *)(temp + vsi_size);
+ }
inst->resolution_changed = true;
inst->realloc_mv_buf = true;
@@ -625,7 +637,7 @@ static void vdec_h264_slice_deinit(void *h_vdec)
kfree(inst);
}
-static int vdec_h264_slice_core_decode(struct vdec_lat_buf *lat_buf)
+static int vdec_h264_slice_core_decode_ex(struct vdec_lat_buf *lat_buf)
{
int err, timeout;
struct mtk_vcodec_dec_ctx *ctx = lat_buf->ctx;
@@ -672,6 +684,95 @@ static int vdec_h264_slice_core_decode(struct vdec_lat_buf *lat_buf)
return 0;
}
+static int vdec_h264_slice_core_decode(struct vdec_lat_buf *lat_buf)
+{
+ struct vdec_fb *fb;
+ u64 vdec_fb_va;
+ u64 y_fb_dma, c_fb_dma;
+ int err, timeout, i;
+ struct mtk_vcodec_dec_ctx *ctx = lat_buf->ctx;
+ struct vdec_h264_slice_inst *inst = ctx->drv_handle;
+ struct vb2_v4l2_buffer *vb2_v4l2;
+ struct vdec_h264_slice_share_info *share_info = lat_buf->private_data;
+ struct mtk_vcodec_mem *mem;
+ struct vdec_vpu_inst *vpu = &inst->vpu;
+
+ mtk_vdec_debug(ctx, "[h264-core] vdec_h264 core decode");
+ memcpy(&inst->vsi_core->h264_slice_params, &share_info->h264_slice_params,
+ sizeof(share_info->h264_slice_params));
+
+ fb = ctx->dev->vdec_pdata->get_cap_buffer(ctx);
+ if (!fb) {
+ err = -EBUSY;
+ mtk_vdec_err(ctx, "fb buffer is NULL");
+ goto vdec_dec_end;
+ }
+
+ vdec_fb_va = (unsigned long)fb;
+ y_fb_dma = (u64)fb->base_y.dma_addr;
+ if (ctx->q_data[MTK_Q_DATA_DST].fmt->num_planes == 1)
+ c_fb_dma =
+ y_fb_dma + inst->ctx->picinfo.buf_w * inst->ctx->picinfo.buf_h;
+ else
+ c_fb_dma = (u64)fb->base_c.dma_addr;
+
+ mtk_vdec_debug(ctx, "[h264-core] y/c addr = 0x%llx 0x%llx", y_fb_dma, c_fb_dma);
+
+ inst->vsi_core->dec.y_fb_dma = y_fb_dma;
+ inst->vsi_core->dec.c_fb_dma = c_fb_dma;
+ inst->vsi_core->dec.vdec_fb_va = vdec_fb_va;
+ inst->vsi_core->dec.nal_info = share_info->nal_info;
+ inst->vsi_core->wdma_start_addr =
+ lat_buf->ctx->msg_queue.wdma_addr.dma_addr;
+ inst->vsi_core->wdma_end_addr =
+ lat_buf->ctx->msg_queue.wdma_addr.dma_addr +
+ lat_buf->ctx->msg_queue.wdma_addr.size;
+ inst->vsi_core->wdma_err_addr = lat_buf->wdma_err_addr.dma_addr;
+ inst->vsi_core->slice_bc_start_addr = lat_buf->slice_bc_addr.dma_addr;
+ inst->vsi_core->slice_bc_end_addr = lat_buf->slice_bc_addr.dma_addr +
+ lat_buf->slice_bc_addr.size;
+ inst->vsi_core->trans_start = share_info->trans_start;
+ inst->vsi_core->trans_end = share_info->trans_end;
+ for (i = 0; i < H264_MAX_MV_NUM; i++) {
+ mem = &inst->mv_buf[i];
+ inst->vsi_core->mv_buf_dma[i] = mem->dma_addr;
+ }
+
+ vb2_v4l2 = v4l2_m2m_next_dst_buf(ctx->m2m_ctx);
+ v4l2_m2m_buf_copy_metadata(&lat_buf->ts_info, vb2_v4l2, true);
+
+ vdec_h264_slice_fill_decode_reflist(inst, &inst->vsi_core->h264_slice_params,
+ share_info);
+
+ err = vpu_dec_core(vpu);
+ if (err) {
+ mtk_vdec_err(ctx, "core decode err=%d", err);
+ goto vdec_dec_end;
+ }
+
+ /* wait decoder done interrupt */
+ timeout = mtk_vcodec_wait_for_done_ctx(inst->ctx, MTK_INST_IRQ_RECEIVED,
+ WAIT_INTR_TIMEOUT_MS, MTK_VDEC_CORE);
+ if (timeout)
+ mtk_vdec_err(ctx, "core decode timeout: pic_%d", ctx->decoded_frame_cnt);
+ inst->vsi_core->dec.timeout = !!timeout;
+
+ vpu_dec_core_end(vpu);
+ mtk_vdec_debug(ctx, "pic[%d] crc: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x",
+ ctx->decoded_frame_cnt,
+ inst->vsi_core->dec.crc[0], inst->vsi_core->dec.crc[1],
+ inst->vsi_core->dec.crc[2], inst->vsi_core->dec.crc[3],
+ inst->vsi_core->dec.crc[4], inst->vsi_core->dec.crc[5],
+ inst->vsi_core->dec.crc[6], inst->vsi_core->dec.crc[7]);
+
+vdec_dec_end:
+ vdec_msg_queue_update_ube_rptr(&lat_buf->ctx->msg_queue, share_info->trans_end);
+ ctx->dev->vdec_pdata->cap_to_disp(ctx, !!err, lat_buf->vb2_v4l2_src);
+ mtk_vdec_debug(ctx, "core decode done err=%d", err);
+ ctx->decoded_frame_cnt++;
+ return 0;
+}
+
static void vdec_h264_insert_startcode(struct mtk_vcodec_dec_dev *vcodec_dev, unsigned char *buf,
size_t *bs_size, struct mtk_h264_pps_param *pps)
{
@@ -695,8 +796,8 @@ static void vdec_h264_insert_startcode(struct mtk_vcodec_dec_dev *vcodec_dev, un
(*bs_size) += 4;
}
-static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
- struct vdec_fb *fb, bool *res_chg)
+static int vdec_h264_slice_lat_decode_ex(void *h_vdec, struct mtk_vcodec_mem *bs,
+ struct vdec_fb *fb, bool *res_chg)
{
struct vdec_h264_slice_inst *inst = h_vdec;
struct vdec_vpu_inst *vpu = &inst->vpu;
@@ -707,7 +808,7 @@ static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
struct vdec_h264_slice_share_info *share_info;
if (vdec_msg_queue_init(&inst->ctx->msg_queue, inst->ctx,
- vdec_h264_slice_core_decode,
+ vdec_h264_slice_core_decode_ex,
sizeof(*share_info)))
return -ENOMEM;
@@ -816,8 +917,153 @@ static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
return err;
}
-static int vdec_h264_slice_single_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
- struct vdec_fb *unused, bool *res_chg)
+static int vdec_h264_slice_lat_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
+ struct vdec_fb *fb, bool *res_chg)
+{
+ struct vdec_h264_slice_inst *inst = h_vdec;
+ struct vdec_vpu_inst *vpu = &inst->vpu;
+ struct mtk_video_dec_buf *src_buf_info;
+ int nal_start_idx, err, timeout = 0, i;
+ unsigned int data[2];
+ struct vdec_lat_buf *lat_buf;
+ struct vdec_h264_slice_share_info *share_info;
+ unsigned char *buf;
+ struct mtk_vcodec_mem *mem;
+
+ if (vdec_msg_queue_init(&inst->ctx->msg_queue, inst->ctx,
+ vdec_h264_slice_core_decode,
+ sizeof(*share_info)))
+ return -ENOMEM;
+
+ /* bs NULL means flush decoder */
+ if (!bs) {
+ vdec_msg_queue_wait_lat_buf_full(&inst->ctx->msg_queue);
+ return vpu_dec_reset(vpu);
+ }
+
+ if (inst->is_field_bitstream)
+ return -EINVAL;
+
+ lat_buf = vdec_msg_queue_dqbuf(&inst->ctx->msg_queue.lat_ctx);
+ if (!lat_buf) {
+ mtk_vdec_debug(inst->ctx, "failed to get lat buffer");
+ return -EAGAIN;
+ }
+ share_info = lat_buf->private_data;
+ src_buf_info = container_of(bs, struct mtk_video_dec_buf, bs_buffer);
+
+ buf = (unsigned char *)bs->va;
+ nal_start_idx = mtk_vdec_h264_find_start_code(buf, bs->size);
+ if (nal_start_idx < 0) {
+ err = -EINVAL;
+ goto err_free_fb_out;
+ }
+
+ inst->vsi->dec.nal_info = buf[nal_start_idx];
+ lat_buf->vb2_v4l2_src = &src_buf_info->m2m_buf.vb;
+ v4l2_m2m_buf_copy_metadata(&src_buf_info->m2m_buf.vb, &lat_buf->ts_info, true);
+
+ err = vdec_h264_slice_fill_decode_parameters(inst, share_info,
+ &inst->vsi->h264_slice_params);
+ if (err)
+ goto err_free_fb_out;
+
+ vdec_h264_insert_startcode(inst->ctx->dev, buf, &bs->size,
+ &share_info->h264_slice_params.pps);
+
+ inst->vsi->dec.bs_buf_addr = (uint64_t)bs->dma_addr;
+ inst->vsi->dec.bs_buf_size = bs->size;
+
+ *res_chg = inst->resolution_changed;
+ if (inst->resolution_changed) {
+ mtk_vdec_debug(inst->ctx, "- resolution changed -");
+ if (inst->realloc_mv_buf) {
+ err = vdec_h264_slice_alloc_mv_buf(inst, &inst->ctx->picinfo);
+ inst->realloc_mv_buf = false;
+ if (err)
+ goto err_free_fb_out;
+ }
+ inst->resolution_changed = false;
+ }
+ for (i = 0; i < H264_MAX_MV_NUM; i++) {
+ mem = &inst->mv_buf[i];
+ inst->vsi->mv_buf_dma[i] = mem->dma_addr;
+ }
+ inst->vsi->wdma_start_addr = lat_buf->ctx->msg_queue.wdma_addr.dma_addr;
+ inst->vsi->wdma_end_addr = lat_buf->ctx->msg_queue.wdma_addr.dma_addr +
+ lat_buf->ctx->msg_queue.wdma_addr.size;
+ inst->vsi->wdma_err_addr = lat_buf->wdma_err_addr.dma_addr;
+ inst->vsi->slice_bc_start_addr = lat_buf->slice_bc_addr.dma_addr;
+ inst->vsi->slice_bc_end_addr = lat_buf->slice_bc_addr.dma_addr +
+ lat_buf->slice_bc_addr.size;
+
+ inst->vsi->trans_end = inst->ctx->msg_queue.wdma_rptr_addr;
+ inst->vsi->trans_start = inst->ctx->msg_queue.wdma_wptr_addr;
+ mtk_vdec_debug(inst->ctx, "lat:trans(0x%llx 0x%llx) err:0x%llx",
+ inst->vsi->wdma_start_addr,
+ inst->vsi->wdma_end_addr,
+ inst->vsi->wdma_err_addr);
+
+ mtk_vdec_debug(inst->ctx, "slice(0x%llx 0x%llx) rprt((0x%llx 0x%llx))",
+ inst->vsi->slice_bc_start_addr,
+ inst->vsi->slice_bc_end_addr,
+ inst->vsi->trans_start,
+ inst->vsi->trans_end);
+ err = vpu_dec_start(vpu, data, 2);
+ if (err) {
+ mtk_vdec_debug(inst->ctx, "lat decode err: %d", err);
+ goto err_free_fb_out;
+ }
+
+ share_info->trans_end = inst->ctx->msg_queue.wdma_addr.dma_addr +
+ inst->vsi->wdma_end_addr_offset;
+ share_info->trans_start = inst->ctx->msg_queue.wdma_wptr_addr;
+ share_info->nal_info = inst->vsi->dec.nal_info;
+
+ if (IS_VDEC_INNER_RACING(inst->ctx->dev->dec_capability)) {
+ memcpy(&share_info->h264_slice_params, &inst->vsi->h264_slice_params,
+ sizeof(share_info->h264_slice_params));
+ vdec_msg_queue_qbuf(&inst->ctx->msg_queue.core_ctx, lat_buf);
+ }
+
+ /* wait decoder done interrupt */
+ timeout = mtk_vcodec_wait_for_done_ctx(inst->ctx, MTK_INST_IRQ_RECEIVED,
+ WAIT_INTR_TIMEOUT_MS, MTK_VDEC_LAT0);
+ if (timeout)
+ mtk_vdec_err(inst->ctx, "lat decode timeout: pic_%d", inst->slice_dec_num);
+ inst->vsi->dec.timeout = !!timeout;
+
+ err = vpu_dec_end(vpu);
+ if (err == SLICE_HEADER_FULL || err == TRANS_BUFFER_FULL) {
+ if (!IS_VDEC_INNER_RACING(inst->ctx->dev->dec_capability))
+ vdec_msg_queue_qbuf(&inst->ctx->msg_queue.lat_ctx, lat_buf);
+ inst->slice_dec_num++;
+ mtk_vdec_err(inst->ctx, "lat dec fail: pic_%d err:%d", inst->slice_dec_num, err);
+ return -EINVAL;
+ }
+
+ share_info->trans_end = inst->ctx->msg_queue.wdma_addr.dma_addr +
+ inst->vsi->wdma_end_addr_offset;
+ vdec_msg_queue_update_ube_wptr(&lat_buf->ctx->msg_queue, share_info->trans_end);
+
+ if (!IS_VDEC_INNER_RACING(inst->ctx->dev->dec_capability)) {
+ memcpy(&share_info->h264_slice_params, &inst->vsi->h264_slice_params,
+ sizeof(share_info->h264_slice_params));
+ vdec_msg_queue_qbuf(&inst->ctx->msg_queue.core_ctx, lat_buf);
+ }
+ mtk_vdec_debug(inst->ctx, "dec num: %d lat crc: 0x%x 0x%x 0x%x", inst->slice_dec_num,
+ inst->vsi->dec.crc[0], inst->vsi->dec.crc[1], inst->vsi->dec.crc[2]);
+
+ inst->slice_dec_num++;
+ return 0;
+err_free_fb_out:
+ vdec_msg_queue_qbuf(&inst->ctx->msg_queue.lat_ctx, lat_buf);
+ mtk_vdec_err(inst->ctx, "slice dec number: %d err: %d", inst->slice_dec_num, err);
+ return err;
+}
+
+static int vdec_h264_slice_single_decode_ex(void *h_vdec, struct mtk_vcodec_mem *bs,
+ struct vdec_fb *unused, bool *res_chg)
{
struct vdec_h264_slice_inst *inst = h_vdec;
struct vdec_vpu_inst *vpu = &inst->vpu;
@@ -919,6 +1165,104 @@ static int vdec_h264_slice_single_decode(void *h_vdec, struct mtk_vcodec_mem *bs
return err;
}
+static int vdec_h264_slice_single_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
+ struct vdec_fb *unused, bool *res_chg)
+{
+ struct vdec_h264_slice_inst *inst = h_vdec;
+ struct vdec_vpu_inst *vpu = &inst->vpu;
+ struct mtk_video_dec_buf *src_buf_info, *dst_buf_info;
+ struct vdec_fb *fb;
+ unsigned char *buf;
+ unsigned int data[2], i;
+ u64 y_fb_dma, c_fb_dma;
+ struct mtk_vcodec_mem *mem;
+ int err, nal_start_idx;
+
+ /* bs NULL means flush decoder */
+ if (!bs)
+ return vpu_dec_reset(vpu);
+
+ fb = inst->ctx->dev->vdec_pdata->get_cap_buffer(inst->ctx);
+ src_buf_info = container_of(bs, struct mtk_video_dec_buf, bs_buffer);
+ dst_buf_info = container_of(fb, struct mtk_video_dec_buf, frame_buffer);
+
+ y_fb_dma = fb ? (u64)fb->base_y.dma_addr : 0;
+ c_fb_dma = fb ? (u64)fb->base_c.dma_addr : 0;
+ mtk_vdec_debug(inst->ctx, "[h264-dec] [%d] y_dma=%llx c_dma=%llx",
+ inst->ctx->decoded_frame_cnt, y_fb_dma, c_fb_dma);
+
+ inst->vsi_ctx.dec.bs_buf_addr = (u64)bs->dma_addr;
+ inst->vsi_ctx.dec.bs_buf_size = bs->size;
+ inst->vsi_ctx.dec.y_fb_dma = y_fb_dma;
+ inst->vsi_ctx.dec.c_fb_dma = c_fb_dma;
+ inst->vsi_ctx.dec.vdec_fb_va = (u64)(uintptr_t)fb;
+
+ v4l2_m2m_buf_copy_metadata(&src_buf_info->m2m_buf.vb,
+ &dst_buf_info->m2m_buf.vb, true);
+ err = get_vdec_sig_decode_parameters(inst);
+ if (err)
+ goto err_free_fb_out;
+
+ memcpy(&inst->vsi_ctx.h264_slice_params, &inst->h264_slice_param,
+ sizeof(inst->vsi_ctx.h264_slice_params));
+
+ buf = (unsigned char *)bs->va;
+ nal_start_idx = mtk_vdec_h264_find_start_code(buf, bs->size);
+ if (nal_start_idx < 0) {
+ err = -EINVAL;
+ goto err_free_fb_out;
+ }
+ inst->vsi_ctx.dec.nal_info = buf[nal_start_idx];
+
+ *res_chg = inst->resolution_changed;
+ if (inst->resolution_changed) {
+ mtk_vdec_debug(inst->ctx, "- resolution changed -");
+ if (inst->realloc_mv_buf) {
+ err = vdec_h264_slice_alloc_mv_buf(inst, &inst->ctx->picinfo);
+ inst->realloc_mv_buf = false;
+ if (err)
+ goto err_free_fb_out;
+ }
+ inst->resolution_changed = false;
+
+ for (i = 0; i < H264_MAX_MV_NUM; i++) {
+ mem = &inst->mv_buf[i];
+ inst->vsi_ctx.mv_buf_dma[i] = mem->dma_addr;
+ }
+ }
+
+ memcpy(inst->vpu.vsi, &inst->vsi_ctx, sizeof(inst->vsi_ctx));
+ err = vpu_dec_start(vpu, data, 2);
+ if (err)
+ goto err_free_fb_out;
+
+ /* wait decoder done interrupt */
+ err = mtk_vcodec_wait_for_done_ctx(inst->ctx, MTK_INST_IRQ_RECEIVED,
+ WAIT_INTR_TIMEOUT_MS, MTK_VDEC_CORE);
+ if (err)
+ mtk_vdec_err(inst->ctx, "decode timeout: pic_%d", inst->ctx->decoded_frame_cnt);
+
+ inst->vsi->dec.timeout = !!err;
+ err = vpu_dec_end(vpu);
+ if (err)
+ goto err_free_fb_out;
+
+ memcpy(&inst->vsi_ctx, inst->vpu.vsi, sizeof(inst->vsi_ctx));
+ mtk_vdec_debug(inst->ctx, "pic[%d] crc: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x",
+ inst->ctx->decoded_frame_cnt,
+ inst->vsi_ctx.dec.crc[0], inst->vsi_ctx.dec.crc[1],
+ inst->vsi_ctx.dec.crc[2], inst->vsi_ctx.dec.crc[3],
+ inst->vsi_ctx.dec.crc[4], inst->vsi_ctx.dec.crc[5],
+ inst->vsi_ctx.dec.crc[6], inst->vsi_ctx.dec.crc[7]);
+
+ inst->ctx->decoded_frame_cnt++;
+ return 0;
+
+err_free_fb_out:
+ mtk_vdec_err(inst->ctx, "dec frame number: %d err: %d", inst->ctx->decoded_frame_cnt, err);
+ return err;
+}
+
static int vdec_h264_slice_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
struct vdec_fb *unused, bool *res_chg)
{
@@ -928,8 +1272,17 @@ static int vdec_h264_slice_decode(void *h_vdec, struct mtk_vcodec_mem *bs,
if (!h_vdec)
return -EINVAL;
- if (inst->ctx->dev->vdec_pdata->hw_arch == MTK_VDEC_PURE_SINGLE_CORE)
- ret = vdec_h264_slice_single_decode(h_vdec, bs, unused, res_chg);
+ if (inst->ctx->dev->vdec_pdata->hw_arch == MTK_VDEC_PURE_SINGLE_CORE) {
+ if (IS_VDEC_SUPPORT_EX(inst->ctx->dev->dec_capability))
+ ret = vdec_h264_slice_single_decode_ex(h_vdec, bs, unused, res_chg);
+ else
+ ret = vdec_h264_slice_single_decode(h_vdec, bs, unused, res_chg);
+
+ return ret;
+ }
+
+ if (IS_VDEC_SUPPORT_EX(inst->ctx->dev->dec_capability))
+ ret = vdec_h264_slice_lat_decode_ex(h_vdec, bs, unused, res_chg);
else
ret = vdec_h264_slice_lat_decode(h_vdec, bs, unused, res_chg);
--
2.46.0
^ permalink raw reply related [flat|nested] 11+ messages in thread* Re: [PATCH 0/6] media: mediatek: vcodec: support h264 extend vsi
2024-10-14 7:33 [PATCH 0/6] media: mediatek: vcodec: support h264 extend vsi Yunfei Dong
` (5 preceding siblings ...)
2024-10-14 7:33 ` [PATCH 6/6] media: mediatek: vcodec: support extend h264 driver Yunfei Dong
@ 2024-10-15 7:54 ` Chen-Yu Tsai
2024-10-16 3:44 ` Yunfei Dong (董云飞)
6 siblings, 1 reply; 11+ messages in thread
From: Chen-Yu Tsai @ 2024-10-15 7:54 UTC (permalink / raw)
To: Yunfei Dong
Cc: Nícolas F . R . A . Prado, Sebastian Fricke,
Nicolas Dufresne, Hans Verkuil, AngeloGioacchino Del Regno,
Benjamin Gaignard, Nathan Hebert, Daniel Almeida, Hsin-Yi Wang,
Fritz Koenig, Daniel Vetter, Steve Cho, linux-media, devicetree,
linux-kernel, linux-arm-kernel, linux-mediatek,
Project_Global_Chrome_Upstream_Group
Hi,
On Mon, Oct 14, 2024 at 3:33 PM Yunfei Dong <yunfei.dong@mediatek.com> wrote:
>
> The working buffer address start and end are calculated in kernel
> side currently, can't calculate the address end if the driver only
> getting the address file handle, not the real physical address. Need
> to extend the vsi to calculate the address end in scp.
>
> Re-construct some interface and add config to support extend and non
> extend at the same time.
> ---
> This patch series depends on:
> [1] https://patchwork.kernel.org/project/linux-mediatek/cover/20241012064333.27269-1-yunfei.dong@mediatek.com
> ---
> Yunfei Dong (6):
> media: mediatek: vcodec: extend h264 video share information
> media: mediatek: vcodec: remove parse nal info in kernel
> media: mediatek: vcodec: remove vsi operation in common interface
> media: mediatek: vcodec: rename vsi to extend vsi
> media: mediatek: vcodec: adding non extend struct
> media: mediatek: vcodec: support extend h264 driver
This should be reworked so that "adding non extend struct" is not needed.
"rename vsi to extend vsi" and "extend h264 video share information"
could be combined so that you are "adding" the extended data structures,
not reworking the existing ones. Otherwise the whole thing breaks existing
systems until "adding non extend struct" is applied, making the series
non-bisectable.
ChenYu
>
> .../vcodec/decoder/mtk_vcodec_dec_drv.h | 2 +
> .../decoder/vdec/vdec_h264_req_multi_if.c | 516 +++++++++++++++++-
> 2 files changed, 493 insertions(+), 25 deletions(-)
>
> --
> 2.46.0
>
>
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: [PATCH 0/6] media: mediatek: vcodec: support h264 extend vsi
2024-10-15 7:54 ` [PATCH 0/6] media: mediatek: vcodec: support h264 extend vsi Chen-Yu Tsai
@ 2024-10-16 3:44 ` Yunfei Dong (董云飞)
0 siblings, 0 replies; 11+ messages in thread
From: Yunfei Dong (董云飞) @ 2024-10-16 3:44 UTC (permalink / raw)
To: wenst@chromium.org
Cc: linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org,
frkoenig@chromium.org, stevecho@chromium.org,
nhebert@chromium.org, linux-media@vger.kernel.org,
devicetree@vger.kernel.org, nicolas.dufresne@collabora.com,
daniel.almeida@collabora.com, daniel@ffwll.ch,
Project_Global_Chrome_Upstream_Group,
benjamin.gaignard@collabora.com, sebastian.fricke@collabora.com,
linux-arm-kernel@lists.infradead.org, hverkuil-cisco@xs4all.nl,
hsinyi@chromium.org, AngeloGioacchino Del Regno, Nicolas Prado
Hi Chen-Yu,
Thanks for your help to review the patch.
On Tue, 2024-10-15 at 15:54 +0800, Chen-Yu Tsai wrote:
>
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
> Hi,
>
> On Mon, Oct 14, 2024 at 3:33 PM Yunfei Dong <yunfei.dong@mediatek.com
> > wrote:
> >
> > The working buffer address start and end are calculated in kernel
> > side currently, can't calculate the address end if the driver only
> > getting the address file handle, not the real physical address.
> Need
> > to extend the vsi to calculate the address end in scp.
> >
> > Re-construct some interface and add config to support extend and
> non
> > extend at the same time.
> > ---
> > This patch series depends on:
> > [1]
> https://patchwork.kernel.org/project/linux-mediatek/cover/20241012064333.27269-1-yunfei.dong@mediatek.com
> > ---
> > Yunfei Dong (6):
> > media: mediatek: vcodec: extend h264 video share information
> > media: mediatek: vcodec: remove parse nal info in kernel
> > media: mediatek: vcodec: remove vsi operation in common interface
> > media: mediatek: vcodec: rename vsi to extend vsi
> > media: mediatek: vcodec: adding non extend struct
> > media: mediatek: vcodec: support extend h264 driver
>
> This should be reworked so that "adding non extend struct" is not
> needed.
> "rename vsi to extend vsi" and "extend h264 video share information"
> could be combined so that you are "adding" the extended data
> structures,
> not reworking the existing ones. Otherwise the whole thing breaks
> existing
> systems until "adding non extend struct" is applied, making the
> series
> non-bisectable.
>
>
Your advice is very reasonable, I will rewrite the patches again.
> ChenYu
>
Best Regards,
Yunfei Dong
> >
> > .../vcodec/decoder/mtk_vcodec_dec_drv.h | 2 +
> > .../decoder/vdec/vdec_h264_req_multi_if.c | 516
> +++++++++++++++++-
> > 2 files changed, 493 insertions(+), 25 deletions(-)
> >
> > --
> > 2.46.0
> >
> >
^ permalink raw reply [flat|nested] 11+ messages in thread