video: driver: add core sub_state support

Introduce core->sub_state similar to inst->sub_state.

[1] pm_suspended - moved to this substate in case of PM suspend
[2] handoff - moved to this state after successful
    handoff_regulator call.
[3] fw_power_control - moved to this state in case of IFPC.
[4] power_enable - will track core power_on/power_off status.
[5] page_fault - used to rate_limit fault logs.
[6] cpu_wd - indicates hw fired wd interrupt.
[7] video_unresponsive - moved to this state if sync cmd fails.

Change-Id: Iceb65cf404fd93aff7846860b0276307e4eab570
Signed-off-by: Govindaraj Rajagopal <quic_grajagop@quicinc.com>
This commit is contained in:
Govindaraj Rajagopal
2022-11-14 20:22:08 +05:30
parent 1addb15e58
commit 9b0140cf03
14 changed files with 293 additions and 129 deletions

View File

@@ -280,24 +280,26 @@ static int __power_off_iris33_hardware(struct msm_vidc_core *core)
* Incase hw power control is enabled, for both CPU WD, video
* hw unresponsive cases, check for power status to decide on
* executing NOC reset sequence before disabling power. If there
* is no CPU WD and hw_power_control is enabled, fw is expected
* is no CPU WD and hw power control is enabled, fw is expected
* to power collapse video hw always.
*/
if (core->hw_power_control) {
if (is_core_sub_state(core, CORE_SUBSTATE_FW_PWR_CTRL)) {
pwr_collapsed = is_iris33_hw_power_collapsed(core);
if (core->cpu_watchdog || core->video_unresponsive) {
if (is_core_sub_state(core, CORE_SUBSTATE_CPU_WATCHDOG) ||
is_core_sub_state(core, CORE_SUBSTATE_VIDEO_UNRESPONSIVE)) {
if (pwr_collapsed) {
d_vpr_e("%s: video hw power collapsed %d, %d\n",
__func__, core->cpu_watchdog, core->video_unresponsive);
d_vpr_e("%s: video hw power collapsed %s\n",
__func__, core->sub_state_name);
goto disable_power;
} else {
d_vpr_e("%s: video hw is power ON %d, %d\n",
__func__, core->cpu_watchdog, core->video_unresponsive);
d_vpr_e("%s: video hw is power ON %s\n",
__func__, core->sub_state_name);
}
} else {
if (!pwr_collapsed)
d_vpr_e("%s: video hw is not power collapsed\n", __func__);
d_vpr_h("%s: disabling hw power\n", __func__);
goto disable_power;
}
}
@@ -530,7 +532,7 @@ static int __power_off_iris33(struct msm_vidc_core *core)
return -EINVAL;
}
if (!core->power_enabled)
if (!is_core_sub_state(core, CORE_SUBSTATE_POWER_ENABLE))
return 0;
/**
@@ -555,7 +557,7 @@ static int __power_off_iris33(struct msm_vidc_core *core)
disable_irq_nosync(core->resource->irq);
core->intr_status = 0;
core->power_enabled = false;
msm_vidc_change_core_sub_state(core, CORE_SUBSTATE_POWER_ENABLE, 0, __func__);
return rc;
}
@@ -633,9 +635,15 @@ static int __power_on_iris33(struct msm_vidc_core *core)
u32 freq = 0;
int rc = 0;
if (core->power_enabled)
if (is_core_sub_state(core, CORE_SUBSTATE_POWER_ENABLE))
return 0;
if (!core_in_valid_state(core)) {
d_vpr_e("%s: invalid core state %s\n",
__func__, core_state_name(core->state));
return -EINVAL;
}
/* Vote for all hardware resources */
rc = call_res_op(core, set_bw, core, INT_MAX, INT_MAX);
if (rc) {
@@ -655,7 +663,9 @@ static int __power_on_iris33(struct msm_vidc_core *core)
goto fail_power_on_hardware;
}
/* video controller and hardware powered on successfully */
core->power_enabled = true;
rc = msm_vidc_change_core_sub_state(core, 0, CORE_SUBSTATE_POWER_ENABLE, __func__);
if (rc)
goto fail_power_on_substate;
freq_tbl = core->resource->freq_set.freq_tbl;
freq = core->power.clk_freq ? core->power.clk_freq :
@@ -678,12 +688,14 @@ static int __power_on_iris33(struct msm_vidc_core *core)
return rc;
fail_power_on_substate:
__power_off_iris33_hardware(core);
fail_power_on_hardware:
__power_off_iris33_controller(core);
fail_power_on_controller:
call_res_op(core, set_bw, core, 0, 0);
fail_vote_buses:
core->power_enabled = false;
msm_vidc_change_core_sub_state(core, CORE_SUBSTATE_POWER_ENABLE, 0, __func__);
return rc;
}