video: driver: add start cmd allow checks inside state handler
use state specific checks inside state_handler instead of relying global msm_vidc_allow_start function. Change-Id: I04182ee3b63fa9044acf4f40adc47ea97eaa7538 Signed-off-by: Govindaraj Rajagopal <quic_grajagop@quicinc.com>
This commit is contained in:
@@ -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);
|
||||
|
@@ -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,
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user