فهرست منبع

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 <[email protected]>
Govindaraj Rajagopal 2 سال پیش
والد
کامیت
a6e521d629

+ 0 - 1
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);

+ 2 - 0
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,

+ 0 - 3
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);

+ 1 - 2
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);
 

+ 0 - 25
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;

+ 41 - 4
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;