media: venus: queue initial buffers
Subsystems (4)
PATCH 1/1 media: venus: queue initial buffers
Buffers can be queued to driver before the planes are set to start streaming. Queue those buffers to firmware once start streaming is called on both the planes.
--- drivers/media/platform/qcom/venus/helpers.c | 22 ++++++++++++++++++++++ drivers/media/platform/qcom/venus/helpers.h | 1 + drivers/media/platform/qcom/venus/venc.c | 5 +++++ 3 files changed, 28 insertions(+)
drivers/media/platform/qcom/venus/helpers.c +22 -0
@@ -1041,6 +1041,28 @@ void venus_helper_vb2_stop_streaming(struct vb2_queue *q) }EXPORT_SYMBOL_GPL (venus_helper_vb2_stop_streaming); +int venus_helper_queue_initial_bufs (struct venus_inst *inst) +{ +struct v4l2_m2m_ctx *m2m_ctx = inst->m2m_ctx; +struct v4l2_m2m_buffer *buf, *n; +int ret; + +v4l2_m2m_for_each_dst_buf_safe (m2m_ctx, buf, n) { + ret =session_process_buf (inst, &buf->vb); +if (ret) +return_buf_error (inst, &buf->vb); + } + +v4l2_m2m_for_each_src_buf_safe (m2m_ctx, buf, n) { + ret =session_process_buf (inst, &buf->vb); +if (ret) +return_buf_error (inst, &buf->vb); + } + +return 0 ; +} +EXPORT_SYMBOL (venus_helper_queue_initial_bufs); +int venus_helper_vb2_start_streaming (struct venus_inst *inst) {struct venus_core *core = inst->core;
drivers/media/platform/qcom/venus/helpers.h +1 -0
@@ -31,6 +31,7 @@ void venus_helper_buffers_done(struct venus_inst *inst,int venus_helper_vb2_start_streaming (struct venus_inst *inst);void venus_helper_m2m_device_run (void *priv);void venus_helper_m2m_job_abort (void *priv); +int venus_helper_queue_initial_bufs (struct venus_inst *inst);int venus_helper_get_bufreq (struct venus_inst *inst,u32 type,struct hfi_buffer_requirements *req);u32 venus_helper_get_framesz_raw (u32 hfi_fmt,u32 width,u32 height);
drivers/media/platform/qcom/venus/venc.c +5 -0
@@ -989,6 +989,11 @@ static int venc_start_streaming(struct vb2_queue *q, unsigned int count)if (ret) goto deinit_sess; + ret =venus_helper_queue_initial_bufs (inst); +if (ret) + goto deinit_sess; + } +mutex_unlock (&inst->lock);return 0 ;
Signature · 1 line
1.9.1
Hi Malathi,
Quoted 3 lines · Malathi Gottam
Buffers can be queued to driver before the planes are set to start streaming. Queue those buffers to firmware once start streaming is called on both the planes.
yes and this is done in venus_helper_m2m_device_run mem2mem operation when streamon on both queues is called, thus below function just duplicates .device_run.
Do you fix an issue with that patch?
Quoted 70 lines
Signed-off-by Malathi Gottam <[email protected]>--- drivers/media/platform/qcom/venus/helpers.c | 22 ++++++++++++++++++++++ drivers/media/platform/qcom/venus/helpers.h | 1 + drivers/media/platform/qcom/venus/venc.c | 5 +++++ 3 files changed, 28 insertions(+)drivers/media/platform/qcom/venus/helpers.c +22
-0@@ -1041,6 +1041,28 @@ void venus_helper_vb2_stop_streaming(struct vb2_queue *q) }EXPORT_SYMBOL_GPL (venus_helper_vb2_stop_streaming); +int venus_helper_queue_initial_bufs (struct venus_inst *inst) +{ +struct v4l2_m2m_ctx *m2m_ctx = inst->m2m_ctx; +struct v4l2_m2m_buffer *buf, *n; +int ret; + +v4l2_m2m_for_each_dst_buf_safe (m2m_ctx, buf, n) { + ret =session_process_buf (inst, &buf->vb); +if (ret) +return_buf_error (inst, &buf->vb); + } + +v4l2_m2m_for_each_src_buf_safe (m2m_ctx, buf, n) { + ret =session_process_buf (inst, &buf->vb); +if (ret) +return_buf_error (inst, &buf->vb); + } + +return 0 ; +} +EXPORT_SYMBOL (venus_helper_queue_initial_bufs); +int venus_helper_vb2_start_streaming (struct venus_inst *inst) {struct venus_core *core = inst->core;drivers/media/platform/qcom/venus/helpers.h +1
-0@@ -31,6 +31,7 @@ void venus_helper_buffers_done(struct venus_inst *inst,int venus_helper_vb2_start_streaming (struct venus_inst *inst);void venus_helper_m2m_device_run (void *priv);void venus_helper_m2m_job_abort (void *priv); +int venus_helper_queue_initial_bufs (struct venus_inst *inst);int venus_helper_get_bufreq (struct venus_inst *inst,u32 type,struct hfi_buffer_requirements *req);u32 venus_helper_get_framesz_raw (u32 hfi_fmt,u32 width,u32 height);drivers/media/platform/qcom/venus/venc.c +5
-0@@ -989,6 +989,11 @@ static int venc_start_streaming(struct vb2_queue *q, unsigned int count)if (ret) goto deinit_sess; + ret =venus_helper_queue_initial_bufs (inst); +if (ret) + goto deinit_sess; + } +mutex_unlock (&inst->lock);return 0 ;
Signature · 2 lines
regards, Stan
Quoted 85 lines · Stanimir Varbanov
Hi Malathi,
Quoted 3 lines · Malathi Gottam
Buffers can be queued to driver before the planes are set to start streaming. Queue those buffers to firmware once start streaming is called on both the planes.
yes and this is done in
venus_helper_m2m_device_runmem2mem operation when streamon on both queues is called, thus below function just duplicates .device_run.Do you fix an issue with that patch?
Quoted 72 lines
Signed-off-by Malathi Gottam <[email protected]>--- drivers/media/platform/qcom/venus/helpers.c | 22 ++++++++++++++++++++++ drivers/media/platform/qcom/venus/helpers.h | 1 + drivers/media/platform/qcom/venus/venc.c | 5 +++++ 3 files changed, 28 insertions(+)drivers/media/platform/qcom/venus/helpers.c +22
-0@@ -1041,6 +1041,28 @@ void venus_helper_vb2_stop_streaming(struct vb2_queue *q) }EXPORT_SYMBOL_GPL (venus_helper_vb2_stop_streaming); +int venus_helper_queue_initial_bufs (struct venus_inst *inst) +{ +struct v4l2_m2m_ctx *m2m_ctx = inst->m2m_ctx; +struct v4l2_m2m_buffer *buf, *n; +int ret; + +v4l2_m2m_for_each_dst_buf_safe (m2m_ctx, buf, n) { + ret =session_process_buf (inst, &buf->vb); +if (ret) +return_buf_error (inst, &buf->vb); + } + +v4l2_m2m_for_each_src_buf_safe (m2m_ctx, buf, n) { + ret =session_process_buf (inst, &buf->vb); +if (ret) +return_buf_error (inst, &buf->vb); + } + +return 0 ; +} +EXPORT_SYMBOL (venus_helper_queue_initial_bufs); +int venus_helper_vb2_start_streaming (struct venus_inst *inst) {drivers/media/platform/qcom/venus/helpers.c +0
-0struct venus_core *core = inst->core;drivers/media/platform/qcom/venus/helpers.h +1
-0@@ -31,6 +31,7 @@ void venus_helper_buffers_done(struct venus_inst *inst, int venus_helper_vb2_start_streaming(struct venus_inst *inst);void venus_helper_m2m_device_run (void *priv);void venus_helper_m2m_job_abort (void *priv); +int venus_helper_queue_initial_bufs (struct venus_inst *inst);int venus_helper_get_bufreq (struct venus_inst *inst,u32 type,struct hfi_buffer_requirements *req);u32
venus_helper_get_framesz_raw(u32 hfi_fmt, u32 width, u32 height);drivers/media/platform/qcom/venus/venc.c +5
-0@@ -989,6 +989,11 @@ static int venc_start_streaming(struct vb2_queue *q, unsigned int count)if (ret) goto deinit_sess; + ret =venus_helper_queue_initial_bufs (inst); +if (ret) + goto deinit_sess; + } +mutex_unlock (&inst->lock);
Quoted 2 lines
Quoted 2 lines
return 0;
Hi Stan,
As I considered playback sequence as well, this function "venus_helper_m2m_device_run" was muted as a part of it. So I had to explicitly implement this function for encoder.
For now, we can omit this patch. Once the playback sequence gets merged into upstream, we can re-look into this.
Hi,
Quoted 92 lines · On 10/20/18 10:50 AM, [email protected] wrote:
Quoted 87 lines · Stanimir Varbanov
Hi Malathi,
Quoted 3 lines · Malathi Gottam
Buffers can be queued to driver before the planes are set to start streaming. Queue those buffers to firmware once start streaming is called on both the planes.
yes and this is done in
venus_helper_m2m_device_runmem2mem operation when streamon on both queues is called, thus below function just duplicates .device_run.Do you fix an issue with that patch?
Quoted 74 lines
Signed-off-by Malathi Gottam <[email protected]>---
drivers/media/platform/qcom/venus/helpers.c | 22 ++++++++++++++++++++++drivers/media/platform/qcom/venus/helpers.h| 1 + drivers/media/platform/qcom/venus/venc.c | 5 +++++3 files changed, 28 insertions(+)drivers/media/platform/qcom/venus/helpers.c +22
-0@@ -1041,6 +1041,28 @@ void venus_helper_vb2_stop_streaming(struct vb2_queue *q) } EXPORT_SYMBOL_GPL(venus_helper_vb2_stop_streaming); +int venus_helper_queue_initial_bufs (struct venus_inst *inst) +{ + struct v4l2_m2m_ctx *m2m_ctx = inst->m2m_ctx; + struct v4l2_m2m_buffer *buf, *n; + int ret; + + v4l2_m2m_for_each_dst_buf_safe(m2m_ctx, buf, n) { + ret = session_process_buf(inst, &buf->vb); + if (ret) + return_buf_error(inst, &buf->vb); + } + + v4l2_m2m_for_each_src_buf_safe(m2m_ctx, buf, n) { + ret = session_process_buf(inst, &buf->vb); + if (ret) + return_buf_error(inst, &buf->vb); + } + + return 0; +} +EXPORT_SYMBOL (venus_helper_queue_initial_bufs); + int venus_helper_vb2_start_streaming(struct venus_inst *inst) {struct
venus_core*core =inst->core;drivers/media/platform/qcom/venus/helpers.h +1
-0@@ -31,6 +31,7 @@ void venus_helper_buffers_done(struct venus_inst *inst, int venus_helper_vb2_start_streaming(struct venus_inst *inst); void venus_helper_m2m_device_run(void *priv); void venus_helper_m2m_job_abort(void *priv); +int venus_helper_queue_initial_bufs (struct venus_inst *inst); int venus_helper_get_bufreq(struct venus_inst *inst, u32 type, struct hfi_buffer_requirements *req);u32
venus_helper_get_framesz_raw(u32 hfi_fmt, u32 width, u32 height);drivers/media/platform/qcom/venus/venc.c +5
-0@@ -989,6 +989,11 @@ static int venc_start_streaming(struct vb2_queue *q, unsigned int count) if (ret) goto deinit_sess; + ret = venus_helper_queue_initial_bufs(inst); + if (ret) + goto deinit_sess; + } + mutex_unlock(&inst->lock);Quoted 2 lines
Quoted 2 lines
return 0;
Hi Stan,
Quoted 6 lines
As I considered playback sequence as well, this function "
venus_helper_m2m_device_run" was muted as a part of it. So I had to explicitly implement this function for encoder.For now, we can omit this patch. Once the playback sequence gets merged into upstream, we can re-look into this.
Sorry, I didn't look deeply into playback sequence patches yet, but looks like we have to fix them first. So please drop this patch.
Signature · 2 lines
regards, Stan
kbuild test robot
build botThank you for the patch! Yet something to improve:
Hi Malathi,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on linuxtv-media/master]
[also build test ERROR on v4.19-rc7 next-20181009]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Malathi-Gottam/media-venus-queue-initial-buffers/20181009-221017 base: git://linuxtv.org/media_tree.git master config: m68k-allmodconfig (attached as .config) compiler: m68k-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
GCC_VERSION=7.2.0 make.cross ARCH=m68k
All error/warnings (new ones prefixed by >>):
drivers/media//platform/qcom/venus/venc.c: In function 'venc_start_streaming':
>> drivers/media//platform/qcom/venus/venc.c:994:3: error: label 'deinit_sess' used but not defined
goto deinit_sess;
^~~~
>> drivers/media//platform/qcom/venus/venc.c:973:3: error: label 'bufs_done' used but not defined
goto bufs_done;
^~~~
drivers/media//platform/qcom/venus/venc.c: At top level:
>> drivers/media//platform/qcom/venus/venc.c:997:15: error: expected declaration specifiers or '...' before '&' token
mutex_unlock(&inst->lock);
^
>> drivers/media//platform/qcom/venus/venc.c:999:2: error: expected identifier or '(' before 'return'
return 0;
^~~~~~
>> drivers/media//platform/qcom/venus/venc.c:1001:12: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token
deinit_sess:
^
drivers/media//platform/qcom/venus/venc.c:1003:10: error: expected '=', ',', ';', 'asm' or '__attribute__' before ':' token
bufs_done:
^
>> drivers/media//platform/qcom/venus/venc.c:1005:2: error: expected identifier or '(' before 'if'
if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
^~
>> drivers/media//platform/qcom/venus/venc.c:1007:2: error: expected identifier or '(' before 'else'
else
^~~~
drivers/media//platform/qcom/venus/venc.c:1009:15: error: expected declaration specifiers or '...' before '&' token
mutex_unlock(&inst->lock);
^
drivers/media//platform/qcom/venus/venc.c:1010:2: error: expected identifier or '(' before 'return'
return ret;
^~~~~~
>> drivers/media//platform/qcom/venus/venc.c:1011:1: error: expected identifier or '(' before '}' token
}
^
drivers/media//platform/qcom/venus/venc.c: In function 'venc_start_streaming':
>> drivers/media//platform/qcom/venus/venc.c:995:2: warning: control reaches end of non-void function [-Wreturn-type]
}
^vim +/deinit_sess +994 drivers/media//platform/qcom/venus/venc.c
948
949 static int venc_start_streaming(struct vb2_queue *q, unsigned int count)
950 {
951 struct venus_inst *inst = vb2_get_drv_priv(q);
952 int ret;
953
954 mutex_lock(&inst->lock);
955
956 if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
957 inst->streamon_out = 1;
958 else
959 inst->streamon_cap = 1;
960
961 if (!(inst->streamon_out & inst->streamon_cap)) {
962 mutex_unlock(&inst->lock);
963 return 0;
964 }
965
966 venus_helper_init_instance(inst);
967
968 inst->sequence_cap = 0;
969 inst->sequence_out = 0;
970
971 ret = venc_init_session(inst);
972 if (ret)
> 973 goto bufs_done; 974 975 ret = venc_set_properties(inst); 976 if (ret) 977 goto deinit_sess; 978 979 ret = venc_verify_conf(inst); 980 if (ret) 981 goto deinit_sess; 982 983 ret = venus_helper_set_num_bufs(inst, inst->num_input_bufs, 984 inst->num_output_bufs, 0); 985 if (ret) 986 goto deinit_sess; 987 988 ret = venus_helper_vb2_start_streaming(inst); 989 if (ret) 990 goto deinit_sess; 991 992 ret = venus_helper_queue_initial_bufs(inst); 993 if (ret) > 994 goto deinit_sess; > 995 } 996 > 997 mutex_unlock(&inst->lock); 998 > 999 return 0; 1000 > 1001 deinit_sess: 1002 hfi_session_deinit(inst); 1003 bufs_done: 1004 venus_helper_buffers_done(inst, VB2_BUF_STATE_QUEUED); > 1005 if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) 1006 inst->streamon_out = 0; > 1007 else 1008 inst->streamon_cap = 0; 1009 mutex_unlock(&inst->lock); > 1010 return ret; > 1011 }
1012
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation