diff --git a/driver/vidc/inc/msm_vidc_driver.h b/driver/vidc/inc/msm_vidc_driver.h index 991b76e6d9..a96f863e99 100644 --- a/driver/vidc/inc/msm_vidc_driver.h +++ b/driver/vidc/inc/msm_vidc_driver.h @@ -493,7 +493,6 @@ bool msm_vidc_allow_property(struct msm_vidc_inst *inst, u32 hfi_id); int msm_vidc_update_property_cap(struct msm_vidc_inst *inst, u32 hfi_id, bool allow); enum msm_vidc_allow msm_vidc_allow_stop(struct msm_vidc_inst *inst); -bool msm_vidc_allow_start(struct msm_vidc_inst *inst); enum msm_vidc_allow msm_vidc_allow_input_psc(struct msm_vidc_inst *inst); bool msm_vidc_allow_drain_last_flag(struct msm_vidc_inst *inst); bool msm_vidc_allow_psc_last_flag(struct msm_vidc_inst *inst); diff --git a/driver/vidc/inc/msm_vidc_state.h b/driver/vidc/inc/msm_vidc_state.h index d995a044da..6dec161d3a 100644 --- a/driver/vidc/inc/msm_vidc_state.h +++ b/driver/vidc/inc/msm_vidc_state.h @@ -91,6 +91,8 @@ const char *core_state_name(enum msm_vidc_core_state state); const char *core_sub_state_name(enum msm_vidc_core_sub_state sub_state); /* inst statemachine functions */ +bool is_drc_pending(struct msm_vidc_inst *inst); +bool is_drain_pending(struct msm_vidc_inst *inst); int msm_vidc_update_state(struct msm_vidc_inst *inst, enum msm_vidc_state request_state, const char *func); int msm_vidc_change_state(struct msm_vidc_inst *inst, diff --git a/driver/vidc/src/msm_vdec.c b/driver/vidc/src/msm_vdec.c index 50396430c1..5d53b79db9 100644 --- a/driver/vidc/src/msm_vdec.c +++ b/driver/vidc/src/msm_vdec.c @@ -2132,9 +2132,6 @@ int msm_vdec_start_cmd(struct msm_vidc_inst *inst) return -EINVAL; } - if (!msm_vidc_allow_start(inst)) - return -EBUSY; - /* tune power features */ inst->decode_batch.enable = msm_vidc_allow_decode_batch(inst); msm_vidc_allow_dcvs(inst); diff --git a/driver/vidc/src/msm_venc.c b/driver/vidc/src/msm_venc.c index 943004f647..f0c36956e6 100644 --- a/driver/vidc/src/msm_venc.c +++ b/driver/vidc/src/msm_venc.c @@ -935,8 +935,7 @@ int msm_venc_start_cmd(struct msm_vidc_inst *inst) int rc = 0; i_vpr_h(inst, "received cmd: resume\n"); - if (!msm_vidc_allow_start(inst)) - return -EBUSY; + vb2_clear_last_buffer_dequeued(inst->bufq[OUTPUT_META_PORT].vb2q); vb2_clear_last_buffer_dequeued(inst->bufq[OUTPUT_PORT].vb2q); diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index a20595713e..d82f80fcf3 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/driver/vidc/src/msm_vidc_driver.c @@ -1142,31 +1142,6 @@ enum msm_vidc_allow msm_vidc_allow_stop(struct msm_vidc_inst *inst) return allow; } -bool msm_vidc_allow_start(struct msm_vidc_inst *inst) -{ - bool allow = false; - - if (!inst) { - d_vpr_e("%s: invalid params\n", __func__); - return allow; - } - - /* client would call start (resume) to complete DRC/drain sequence */ - if (inst->state == MSM_VIDC_INPUT_STREAMING || - inst->state == MSM_VIDC_OUTPUT_STREAMING || - inst->state == MSM_VIDC_STREAMING) { - if ((is_sub_state(inst, MSM_VIDC_DRC) && - is_sub_state(inst, MSM_VIDC_DRC_LAST_BUFFER)) || - (is_sub_state(inst, MSM_VIDC_DRAIN) && - is_sub_state(inst, MSM_VIDC_DRAIN_LAST_BUFFER))) - allow = true; - } - if (!allow) - i_vpr_e(inst, "%s: not allowed in state %s, sub state %s\n", - __func__, state_name(inst->state), inst->sub_state_name); - return allow; -} - enum msm_vidc_allow msm_vidc_allow_input_psc(struct msm_vidc_inst *inst) { enum msm_vidc_allow allow = MSM_VIDC_ALLOW; diff --git a/driver/vidc/src/msm_vidc_state.c b/driver/vidc/src/msm_vidc_state.c index 097f73358b..1e6fb6d2a5 100644 --- a/driver/vidc/src/msm_vidc_state.c +++ b/driver/vidc/src/msm_vidc_state.c @@ -24,6 +24,18 @@ bool is_core_state(struct msm_vidc_core *core, enum msm_vidc_core_state state) return core->state == state; } +bool is_drc_pending(struct msm_vidc_inst *inst) +{ + return is_sub_state(inst, MSM_VIDC_DRC) && + is_sub_state(inst, MSM_VIDC_DRC_LAST_BUFFER); +} + +bool is_drain_pending(struct msm_vidc_inst *inst) +{ + return is_sub_state(inst, MSM_VIDC_DRAIN) && + is_sub_state(inst, MSM_VIDC_DRAIN_LAST_BUFFER); +} + static const char * const core_state_name_arr[] = FOREACH_CORE_STATE(GENERATE_STRING); @@ -695,10 +707,11 @@ static int msm_vidc_open_state(struct msm_vidc_inst *inst, } case MSM_VIDC_CMD_START: { - rc = msm_vidc_start_cmd(inst); - if (rc) - return rc; - break; + /* disallow start cmd request in open state */ + i_vpr_e(inst, "%s: (%s) not allowed, sub_state (%s)\n", + __func__, event_name(event), inst->sub_state_name); + + return -EBUSY; } case MSM_VIDC_CMD_STOP: { @@ -874,6 +887,14 @@ static int msm_vidc_input_streaming_state(struct msm_vidc_inst *inst, } case MSM_VIDC_CMD_START: { + /* disallow if START called for non DRC/drain cases */ + if (!is_drc_pending(inst) && !is_drain_pending(inst)) { + i_vpr_e(inst, "%s: (%s) not allowed, sub_state (%s)\n", + __func__, event_name(event), inst->sub_state_name); + return -EBUSY; + } + + /* client would call start(resume) to complete DRC/drain sequence */ rc = msm_vidc_start_cmd(inst); if (rc) return rc; @@ -1045,6 +1066,14 @@ static int msm_vidc_output_streaming_state(struct msm_vidc_inst *inst, } case MSM_VIDC_CMD_START: { + /* disallow if START called for non DRC/drain cases */ + if (!is_drc_pending(inst) && !is_drain_pending(inst)) { + i_vpr_e(inst, "%s: (%s) not allowed, sub_state (%s)\n", + __func__, event_name(event), inst->sub_state_name); + return -EBUSY; + } + + /* client would call start(resume) to complete DRC/drain sequence */ rc = msm_vidc_start_cmd(inst); if (rc) return rc; @@ -1151,6 +1180,14 @@ static int msm_vidc_streaming_state(struct msm_vidc_inst *inst, } case MSM_VIDC_CMD_START: { + /* disallow if START called for non DRC/drain cases */ + if (!is_drc_pending(inst) && !is_drain_pending(inst)) { + i_vpr_e(inst, "%s: (%s) not allowed, sub_state (%s)\n", + __func__, event_name(event), inst->sub_state_name); + return -EBUSY; + } + + /* client would call start(resume) to complete DRC/drain sequence */ rc = msm_vidc_start_cmd(inst); if (rc) return rc;