From bff6f56a2869cc57e29b2b125fc3c72296a5ba70 Mon Sep 17 00:00:00 2001 From: Darshana Patil Date: Wed, 2 Dec 2020 15:15:23 -0800 Subject: [PATCH] driver: video: handle drain command handle decoder and encoder drain command. send hfi drain command to firmware. Change-Id: I94835ce0b2a8b06e7a9ad64f7cc8642913987659 Signed-off-by: Darshana Patil --- driver/vidc/inc/msm_vdec.h | 1 + driver/vidc/inc/msm_venc.h | 1 + driver/vidc/src/msm_vdec.c | 28 +++++++++++++++++++++++++++- driver/vidc/src/msm_venc.c | 25 +++++++++++++++++++++++++ driver/vidc/src/msm_vidc.c | 13 +++++++++++++ driver/vidc/src/msm_vidc_buffer.c | 3 +-- 6 files changed, 68 insertions(+), 3 deletions(-) diff --git a/driver/vidc/inc/msm_vdec.h b/driver/vidc/inc/msm_vdec.h index 576818f91f..b16aa22ab3 100644 --- a/driver/vidc/inc/msm_vdec.h +++ b/driver/vidc/inc/msm_vdec.h @@ -20,5 +20,6 @@ int msm_vdec_enum_fmt(struct msm_vidc_inst *inst, struct v4l2_fmtdesc *f); int msm_vdec_inst_init(struct msm_vidc_inst *inst); int msm_vdec_input_port_settings_change(struct msm_vidc_inst *inst); int msm_vdec_output_port_settings_change(struct msm_vidc_inst *inst); +int msm_vdec_process_cmd(struct msm_vidc_inst *inst, u32 cmd); #endif // _MSM_VDEC_H_ \ No newline at end of file diff --git a/driver/vidc/inc/msm_venc.h b/driver/vidc/inc/msm_venc.h index 11d5c2df67..05d2794448 100644 --- a/driver/vidc/inc/msm_venc.h +++ b/driver/vidc/inc/msm_venc.h @@ -13,6 +13,7 @@ int msm_venc_stop_input(struct msm_vidc_inst *inst); int msm_venc_start_input(struct msm_vidc_inst *inst); int msm_venc_stop_output(struct msm_vidc_inst *inst); int msm_venc_start_output(struct msm_vidc_inst *inst); +int msm_venc_process_cmd(struct msm_vidc_inst *inst, u32 cmd); int msm_venc_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f); int msm_venc_g_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f); int msm_venc_enum_fmt(struct msm_vidc_inst *inst, struct v4l2_fmtdesc *f); diff --git a/driver/vidc/src/msm_vdec.c b/driver/vidc/src/msm_vdec.c index b1a76f9c3b..6c48caafc8 100644 --- a/driver/vidc/src/msm_vdec.c +++ b/driver/vidc/src/msm_vdec.c @@ -1117,7 +1117,7 @@ int msm_vdec_input_port_settings_change(struct msm_vidc_inst *inst) if (rc) return rc; - event.type = V4L2_EVENT_SRC_CH_RESOLUTION;//todo + event.type = V4L2_EVENT_SOURCE_CHANGE; event.u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION; v4l2_event_queue_fh(&inst->event_handler, &event); @@ -1313,6 +1313,32 @@ int msm_vdec_qbuf(struct msm_vidc_inst *inst, struct vb2_buffer *vb2) return rc; } +int msm_vdec_process_cmd(struct msm_vidc_inst *inst, u32 cmd) +{ + int rc = 0; + + if (!inst || !inst->core) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + if (cmd == V4L2_DEC_CMD_STOP) { + rc = venus_hfi_session_command(inst, + HFI_CMD_DRAIN, + INPUT_PORT, + HFI_PAYLOAD_NONE, + NULL, + 0); + if (rc) + return rc; + } else { + d_vpr_e("%s: unknown cmd %d\n", __func__, cmd); + return -EINVAL; + } + + return 0; +} + int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) { int rc = 0; diff --git a/driver/vidc/src/msm_venc.c b/driver/vidc/src/msm_venc.c index b3c684c7b9..63460244e3 100644 --- a/driver/vidc/src/msm_venc.c +++ b/driver/vidc/src/msm_venc.c @@ -613,6 +613,31 @@ error: return rc; } +int msm_venc_process_cmd(struct msm_vidc_inst *inst, u32 cmd) +{ + int rc = 0; + + if (!inst || !inst->core) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + if (cmd == V4L2_ENC_CMD_STOP) { + rc = venus_hfi_session_command(inst, + HFI_CMD_DRAIN, + INPUT_PORT, + HFI_PAYLOAD_NONE, + NULL, + 0); + if (rc) + return rc; + } else { + d_vpr_e("%s: unknown cmd %d\n", __func__, cmd); + return -EINVAL; + } + return 0; +} + int msm_venc_stop_output(struct msm_vidc_inst *inst) { int rc = 0; diff --git a/driver/vidc/src/msm_vidc.c b/driver/vidc/src/msm_vidc.c index a1d02e522e..d6ccd5ee0a 100644 --- a/driver/vidc/src/msm_vidc.c +++ b/driver/vidc/src/msm_vidc.c @@ -610,6 +610,19 @@ EXPORT_SYMBOL(msm_vidc_streamoff); int msm_vidc_cmd(void *instance, union msm_v4l2_cmd *cmd) { + int rc = 0; + struct msm_vidc_inst *inst = instance; + struct v4l2_decoder_cmd *dec = NULL; + struct v4l2_encoder_cmd *enc = NULL; + + if (is_decode_session(inst)) { + dec = (struct v4l2_decoder_cmd *)cmd; + rc = msm_vdec_process_cmd(inst, dec->cmd); + } else if (is_encode_session(inst)) { + enc = (struct v4l2_encoder_cmd *)cmd; + rc = msm_venc_process_cmd(inst, enc->cmd); + } + return 0; } EXPORT_SYMBOL(msm_vidc_cmd); diff --git a/driver/vidc/src/msm_vidc_buffer.c b/driver/vidc/src/msm_vidc_buffer.c index fc3d7f0858..e6b34f0d2b 100644 --- a/driver/vidc/src/msm_vidc_buffer.c +++ b/driver/vidc/src/msm_vidc_buffer.c @@ -140,8 +140,7 @@ u32 msm_vidc_output_extra_count(struct msm_vidc_inst *inst) u32 msm_vidc_decoder_input_size(struct msm_vidc_inst *inst) { - u32 size = ALIGN(15 * 1024 * 1024, SZ_4K); - size = 4; // TODO + u32 size = ALIGN(1 * 1024 * 1024, SZ_4K); return size; }