From 1ab4754c052b639427f38202860d064c2fa03b57 Mon Sep 17 00:00:00 2001 From: Mahantesh Kumbar Date: Fri, 20 Oct 2017 16:30:42 +0530 Subject: gpu: nvgpu: Kill pg init thread if pmu boot fails - Created nvgpu_kill_task_pg_init() method to set pmu state to PMU_STATE_EXIT & make thread stop, and poll to confirm thread stopped. - Check for PMU/SEC2 ACR secure boot completion status & initiate pg init thread kill if ACR boot exits with error, which fails to validate & boot LS-PMU. - Set pmu state to PMU_STATE_OFF after thread kill during ACR boot failure. Issue: pg init task blocks if PMU boot fails & cause kernel to show message "task nvgpu_pg_init_g:2120 blocked for more than 120 seconds" Bug 200346134 Change-Id: I5270426080dcd628ccca4df798005294c19767a0 Signed-off-by: Mahantesh Kumbar Reviewed-on: https://git-master.nvidia.com/r/1582593 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Vijayakumar Subbu Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/pmu/pmu.c | 45 ++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 19 deletions(-) (limited to 'drivers/gpu/nvgpu/common/pmu') diff --git a/drivers/gpu/nvgpu/common/pmu/pmu.c b/drivers/gpu/nvgpu/common/pmu/pmu.c index 3447f40d..d595097b 100644 --- a/drivers/gpu/nvgpu/common/pmu/pmu.c +++ b/drivers/gpu/nvgpu/common/pmu/pmu.c @@ -155,6 +155,31 @@ static int nvgpu_init_task_pg_init(struct gk20a *g) return err; } +void nvgpu_kill_task_pg_init(struct gk20a *g) +{ + struct nvgpu_pmu *pmu = &g->pmu; + struct nvgpu_timeout timeout; + + /* make sure the pending operations are finished before we continue */ + if (nvgpu_thread_is_running(&pmu->pg_init.state_task)) { + + /* post PMU_STATE_EXIT to exit PMU state machine loop */ + nvgpu_pmu_state_change(g, PMU_STATE_EXIT, true); + + /* Make thread stop*/ + nvgpu_thread_stop(&pmu->pg_init.state_task); + + /* wait to confirm thread stopped */ + nvgpu_timeout_init(g, &timeout, 1000, NVGPU_TIMER_RETRY_TIMER); + do { + if (!nvgpu_thread_is_running(&pmu->pg_init.state_task)) + break; + nvgpu_udelay(2); + } while (!nvgpu_timeout_expired_msg(&timeout, + "timeout - waiting PMU state machine thread stop")); + } +} + static int nvgpu_init_pmu_setup_sw(struct gk20a *g) { struct nvgpu_pmu *pmu = &g->pmu; @@ -469,7 +494,6 @@ int nvgpu_pmu_destroy(struct gk20a *g) { struct nvgpu_pmu *pmu = &g->pmu; struct pmu_pg_stats_data pg_stat_data = { 0 }; - struct nvgpu_timeout timeout; int i; nvgpu_log_fn(g, " "); @@ -477,24 +501,7 @@ int nvgpu_pmu_destroy(struct gk20a *g) if (!g->support_pmu) return 0; - /* make sure the pending operations are finished before we continue */ - if (nvgpu_thread_is_running(&pmu->pg_init.state_task)) { - - /* post PMU_STATE_EXIT to exit PMU state machine loop */ - nvgpu_pmu_state_change(g, PMU_STATE_EXIT, true); - - /* Make thread stop*/ - nvgpu_thread_stop(&pmu->pg_init.state_task); - - /* wait to confirm thread stopped */ - nvgpu_timeout_init(g, &timeout, 1000, NVGPU_TIMER_RETRY_TIMER); - do { - if (!nvgpu_thread_is_running(&pmu->pg_init.state_task)) - break; - nvgpu_udelay(2); - } while (!nvgpu_timeout_expired_msg(&timeout, - "timeout - waiting PMU state machine thread stop")); - } + nvgpu_kill_task_pg_init(g); nvgpu_pmu_get_pg_stats(g, PMU_PG_ELPG_ENGINE_ID_GRAPHICS, &pg_stat_data); -- cgit v1.2.2