summaryrefslogtreecommitdiff
path: root/drivers/mxc
diff options
context:
space:
mode:
authorHuang Chaofan <chaofan.huang@nxp.com>2019-01-29 16:53:41 +0800
committerJason Liu <jason.hui.liu@nxp.com>2019-02-12 10:36:03 +0800
commit3071fa5df722139debc2485513a94331b0b1e8b9 (patch)
tree9120cd64b77760c58d26537832febd5f95209a04 /drivers/mxc
parentf6a432cc1b7c318fe62c121129e099ebf9666cf2 (diff)
MLK-20803 VPU: Modify adding buffer for queue list to not queue same
buffer twice 1. Modify adding buffer for queue list to not queue same buffer twice 2. remove decoder_str in dts file Signed-off-by: Huang Chaofan <chaofan.huang@nxp.com>
Diffstat (limited to 'drivers/mxc')
-rw-r--r--drivers/mxc/vpu-decoder-b0/vpu_b0.c21
-rw-r--r--drivers/mxc/vpu-decoder-b0/vpu_b0.h1
2 files changed, 19 insertions, 3 deletions
diff --git a/drivers/mxc/vpu-decoder-b0/vpu_b0.c b/drivers/mxc/vpu-decoder-b0/vpu_b0.c
index 9dbff23f3d31..7f3ac686e38b 100644
--- a/drivers/mxc/vpu-decoder-b0/vpu_b0.c
+++ b/drivers/mxc/vpu-decoder-b0/vpu_b0.c
@@ -1674,6 +1674,7 @@ static void v4l2_transfer_buffer_to_firmware(struct queue_data *This, struct vb2
p_data_req = list_first_entry(&This->drv_q,
typeof(*p_data_req), list);
list_del(&p_data_req->list);
+ p_data_req->queued = false;
if (p_data_req->vb2_buf)
vb2_buffer_done(p_data_req->vb2_buf,
VB2_BUF_STATE_DONE);
@@ -1875,6 +1876,7 @@ static void v4l2_update_stream_addr(struct vpu_ctx *ctx, uint32_t uStrBufIdx)
vpu_dbg(LVL_INFO, "v4l2_transfer_buffer_to_firmware - set stream_feed_complete - DEBUG 2\n");
#endif
list_del(&p_data_req->list);
+ p_data_req->queued = false;
if (p_data_req->vb2_buf)
vb2_buffer_done(p_data_req->vb2_buf,
VB2_BUF_STATE_DONE);
@@ -2183,6 +2185,7 @@ static void vpu_api_event_handler(struct vpu_ctx *ctx, u_int32 uStrIdx, u_int32
p_data_req->status = FRAME_FREE;
vpu_dbg(LVL_INFO, "VID_API_CMD_FS_ALLOC, data_req->vb2_buf=%p, data_req->id=%d\n", p_data_req->vb2_buf, p_data_req->id);
list_del(&p_data_req->list);
+ p_data_req->queued = false;
buffer_flag = true;
break;
} else {
@@ -2264,9 +2267,11 @@ static void vpu_api_event_handler(struct vpu_ctx *ctx, u_int32 uStrIdx, u_int32
vpu_dbg(LVL_WARN, "warning: normal release and previous status %s, frame not for display, queue the buffer to list again\n",
bufstat[p_data_req->status]);
- if (p_data_req->status == FRAME_DECODED)
+ if (p_data_req->status == FRAME_DECODED && p_data_req->queued == false) {
v4l2_event_queue_fh(&ctx->fh, &ev);
- list_add_tail(&p_data_req->list, &This->drv_q);
+ list_add_tail(&p_data_req->list, &This->drv_q);
+ p_data_req->queued = true;
+ }
}
p_data_req->status = FRAME_RELEASE;
}
@@ -2673,10 +2678,17 @@ static int vpu_start_streaming(struct vb2_queue *q,
static void vpu_stop_streaming(struct vb2_queue *q)
{
struct queue_data *This = (struct queue_data *)q->drv_priv;
+ struct vb2_data_req *p_data_req = NULL;
+ struct vb2_data_req *p_temp;
struct vb2_buffer *vb;
vpu_dbg(LVL_INFO, "%s() is called\n", __func__);
down(&This->drv_q_lock);
+ if (!list_empty(&This->drv_q))
+ list_for_each_entry_safe(p_data_req, p_temp, &This->drv_q, list) {
+ list_del(&p_data_req->list);
+ p_data_req->queued = false;
+ }
if (!list_empty(&q->queued_list))
list_for_each_entry(vb, &q->queued_list, queued_entry) {
@@ -2708,8 +2720,10 @@ static void vpu_buf_queue(struct vb2_buffer *vb)
pphy_address = (u_int32 *)vb2_plane_cookie(vb, 1);
data_req->phy_addr[1] = *pphy_address;
}
- if (data_req->status != FRAME_FREE && data_req->status != FRAME_DECODED)
+ if (data_req->status != FRAME_FREE && data_req->status != FRAME_DECODED) {
list_add_tail(&data_req->list, &This->drv_q);
+ data_req->queued = true;
+ }
up(&This->drv_q_lock);
@@ -2790,6 +2804,7 @@ static void flush_drv_q(struct queue_data *This)
p_data_req->id,
p_data_req);
list_del(&p_data_req->list);
+ p_data_req->queued = false;
if (p_data_req->vb2_buf)
vb2_buffer_done(p_data_req->vb2_buf, VB2_BUF_STATE_ERROR);
}
diff --git a/drivers/mxc/vpu-decoder-b0/vpu_b0.h b/drivers/mxc/vpu-decoder-b0/vpu_b0.h
index 59b12b93a43f..b34ca5375e6b 100644
--- a/drivers/mxc/vpu-decoder-b0/vpu_b0.h
+++ b/drivers/mxc/vpu-decoder-b0/vpu_b0.h
@@ -164,6 +164,7 @@ struct vb2_data_req {
int id;
u_int32 status;
bool bfield;
+ bool queued;
u_int32 phy_addr[2]; //0 for luma, 1 for chroma
u_int32 data_offset[2]; //0 for luma, 1 for chroma
};