From cd6322f3e2915d25491fe92969c6002a8cfe7e3a Mon Sep 17 00:00:00 2001 From: Shijie Qin <shijie.qin@nxp.com> Date: Thu, 5 Dec 2019 15:43:28 +0800 Subject: [PATCH] LF-365 [8QM_MEK/8QXP_MEK]mxc:vpu_malone: need skip tsm when skip not decoded frame - If frame ID is MEDIA_PLAYER_SKIPPED_FRAME_ID, need skip this frame, also need skip its tsm at the same time. - Fixed coverity issue: CID 6344236 (#2 of 2): Buffer not null terminated (BUFFER_SIZE_WARNING). - Remove two deaded code about ctx pointer check. Signed-off-by: Shijie Qin <shijie.qin@nxp.com> Acked-by: ming_qian <ming.qian@nxp.com> (cherry picked from commit 3cc1c455699e456c11118f3ed60b7fc85f1fd61b) --- drivers/mxc/vpu_malone/vpu_b0.c | 72 ++++++++++++++------------------- drivers/mxc/vpu_malone/vpu_b0.h | 1 + 2 files changed, 31 insertions(+), 42 deletions(-) diff --git a/drivers/mxc/vpu_malone/vpu_b0.c b/drivers/mxc/vpu_malone/vpu_b0.c index 780e5a607335f..defad3a8a5b94 100644 --- a/drivers/mxc/vpu_malone/vpu_b0.c +++ b/drivers/mxc/vpu_malone/vpu_b0.c @@ -3477,6 +3477,12 @@ static void report_buffer_done(struct vpu_ctx *ctx, void *frame_info) if (buffer_id != fs_id) { if (fs_id == MEDIA_PLAYER_SKIPPED_FRAME_ID) { + down(&This->drv_q_lock); + p_data_req = &This->vb2_reqs[buffer_id]; + set_data_req_status(p_data_req, FRAME_READY); + up(&This->drv_q_lock); + + vpu_dec_skip_ts(ctx); send_skip_event(ctx); ctx->frm_dis_delay--; return; @@ -3484,18 +3490,16 @@ static void report_buffer_done(struct vpu_ctx *ctx, void *frame_info) vpu_err("error: find buffer_id(%d) and firmware return id(%d) doesn't match\n", buffer_id, fs_id); } - if (ctx->q_data[V4L2_DST].vb2_reqs[buffer_id].status != FRAME_DECODED) - vpu_err("error: buffer(%d) need to set FRAME_READY, but previous state %s is not FRAME_DECODED\n", - buffer_id, bufstat[ctx->q_data[V4L2_DST].vb2_reqs[buffer_id].status]); - - set_data_req_status(&ctx->q_data[V4L2_DST].vb2_reqs[buffer_id], - FRAME_READY); ctx->frm_dis_delay--; vpu_dbg(LVL_INFO, "frame total: %d; depth: %d; delay: [dec, dis] = [%d, %d]\n", ctx->frm_total_num, vpu_frm_depth, ctx->frm_dec_delay, ctx->frm_dis_delay); down(&This->drv_q_lock); p_data_req = &This->vb2_reqs[buffer_id]; + if (p_data_req->status != FRAME_DECODED) + vpu_err("error: buffer(%d) need to set FRAME_READY, but previous state %s is not FRAME_DECODED\n", + buffer_id, bufstat[p_data_req->status]); + set_data_req_status(p_data_req, FRAME_READY); if (p_data_req->vb2_buf) { p_data_req->vb2_buf->planes[0].bytesused = This->sizeimage[0]; p_data_req->vb2_buf->planes[1].bytesused = This->sizeimage[1]; @@ -3519,6 +3523,7 @@ static void send_skip_event(struct vpu_ctx *ctx) if (!ctx) return; + ctx->statistic.skipped_frame_count++; vpu_dbg(LVL_INFO, "send skip event\n"); v4l2_event_queue_fh(&ctx->fh, &ev); } @@ -4172,21 +4177,7 @@ static void vpu_api_event_handler(struct vpu_ctx *ctx, u_int32 uStrIdx, u_int32 break; } - if (buffer_id != uDecFrmId) { - if (uDecFrmId == MEDIA_PLAYER_SKIPPED_FRAME_ID) { - send_skip_event(ctx); - ctx->frm_dec_delay--; - vpu_dec_valid_ts(ctx, - consumed_pic_bytesused, - NULL); - break; - } - vpu_err("error: VID_API_EVENT_PIC_DECODED address and id doesn't match\n"); - } p_data_req = &This->vb2_reqs[buffer_id]; - if (p_data_req->status != FRAME_FREE) - vpu_err("error: buffer(%d) need to set FRAME_DECODED, but previous state %s is not FRAME_FREE\n", - buffer_id, bufstat[ctx->q_data[V4L2_DST].vb2_reqs[buffer_id].status]); set_data_req_status(p_data_req, FRAME_DECODED); if (ctx->seqinfo.uProgressive == 1) p_data_req->bfield = false; @@ -4732,9 +4723,6 @@ static void vpu_msg_instance_work(struct work_struct *work) struct vpu_ctx *ctx = container_of(work, struct vpu_ctx, instance_work); struct event_msg msg; - if (!ctx) - return; - memset(&msg, 0, sizeof(struct event_msg)); while (receive_msg_queue(ctx, &msg)) { @@ -5341,6 +5329,9 @@ static ssize_t show_instance_buffer_info(struct device *dev, num += scnprintf(buf + num, PAGE_SIZE - num, "\t%40s:%16ld\n", "capture dqbuf count", This->dqbuf_count); + num += scnprintf(buf + num, PAGE_SIZE - num, + "\t%40s:%16ld\n", "skipped frame count", + ctx->statistic.skipped_frame_count); num += scnprintf(buf + num, PAGE_SIZE - num, "\t%40s:%16x\n", "beginning", ctx->beginning); @@ -5547,7 +5538,7 @@ static ssize_t precheck_pattern_store(struct device *dev, char *token; char *cur; - strncpy(strbuf, buf, sizeof(strbuf)); + strncpy(strbuf, buf, sizeof(strbuf) - 1); cur = strbuf; while ((token = strsep(&cur, delim))) { if (!strlen(token)) @@ -6025,28 +6016,25 @@ static unsigned int v4l2_poll(struct file *filp, poll_table *wait) vpu_dbg(LVL_BIT_FUNC, "%s()\n", __func__); - if (ctx) { - poll_wait(filp, &ctx->fh.wait, wait); + poll_wait(filp, &ctx->fh.wait, wait); - if (v4l2_event_pending(&ctx->fh)) { - vpu_dbg(LVL_INFO, "%s() v4l2_event_pending\n", __func__); - rc |= POLLPRI; - } + if (v4l2_event_pending(&ctx->fh)) { + vpu_dbg(LVL_INFO, "%s() v4l2_event_pending\n", __func__); + rc |= POLLPRI; + } - src_q = &ctx->q_data[V4L2_SRC].vb2_q; - dst_q = &ctx->q_data[V4L2_DST].vb2_q; + src_q = &ctx->q_data[V4L2_SRC].vb2_q; + dst_q = &ctx->q_data[V4L2_DST].vb2_q; - if (ctx->firmware_finished && !list_empty(&dst_q->done_list)) - rc = 0; + if (ctx->firmware_finished && !list_empty(&dst_q->done_list)) + rc = 0; - poll_wait(filp, &src_q->done_wq, wait); - if (!list_empty(&src_q->done_list)) - rc |= POLLOUT | POLLWRNORM; - poll_wait(filp, &dst_q->done_wq, wait); - if (!list_empty(&dst_q->done_list)) - rc |= POLLIN | POLLRDNORM; - } else - rc = POLLERR; + poll_wait(filp, &src_q->done_wq, wait); + if (!list_empty(&src_q->done_list)) + rc |= POLLOUT | POLLWRNORM; + poll_wait(filp, &dst_q->done_wq, wait); + if (!list_empty(&dst_q->done_list)) + rc |= POLLIN | POLLRDNORM; return rc; } diff --git a/drivers/mxc/vpu_malone/vpu_b0.h b/drivers/mxc/vpu_malone/vpu_b0.h index 3855a5eaaa98d..8feaf498cf6a4 100644 --- a/drivers/mxc/vpu_malone/vpu_b0.h +++ b/drivers/mxc/vpu_malone/vpu_b0.h @@ -333,6 +333,7 @@ struct vpu_statistic { unsigned long event[VID_API_EVENT_DEC_CFG_INFO + 2]; unsigned long current_cmd; unsigned long current_event; + unsigned long skipped_frame_count; struct timespec ts_cmd; struct timespec ts_event; atomic64_t total_dma_size; -- GitLab