From a20bb7dde2de191cb18545d6ccd98b30a6faaf84 Mon Sep 17 00:00:00 2001 From: Deepak Nibade Date: Mon, 28 Jul 2014 18:17:07 +0530 Subject: gpu: nvgpu: fix error handling for mutex_acquire() Currently if pmu_mutex_acquire() fails, we disable ELPG and move ahead. But it is not clear why it is required to disable ELPG in case where we fail to acquire mutex. Hence skip disabling ELPG if mutex_acquire() fails Bug 1533644 Change-Id: I7e8e99a701d0ba071eb31ac17582b04072ee55eb Signed-off-by: Deepak Nibade Reviewed-on: http://git-master/r/448131 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Vijayakumar Subbu Reviewed-by: Terje Bergstrom --- drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | 48 +++++++++--------------------------- 1 file changed, 12 insertions(+), 36 deletions(-) diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c index 1f7b78f9..c8cc4373 100644 --- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c @@ -1527,7 +1527,7 @@ int gk20a_fifo_preempt_channel(struct gk20a *g, u32 hw_chid) u32 delay = GR_IDLE_CHECK_DEFAULT; u32 ret = 0; u32 token = PMU_INVALID_MUTEX_OWNER_ID; - u32 elpg_off = 0; + u32 mutex_ret = 0; u32 i; gk20a_dbg_fn("%d", hw_chid); @@ -1536,10 +1536,7 @@ int gk20a_fifo_preempt_channel(struct gk20a *g, u32 hw_chid) for (i = 0; i < g->fifo.max_runlists; i++) mutex_lock(&f->runlist_info[i].mutex); - /* disable elpg if failed to acquire pmu mutex */ - elpg_off = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token); - if (elpg_off) - gk20a_pmu_disable_elpg(g); + mutex_ret = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token); /* issue preempt */ gk20a_writel(g, fifo_preempt_r(), @@ -1571,10 +1568,7 @@ int gk20a_fifo_preempt_channel(struct gk20a *g, u32 hw_chid) gk20a_fifo_recover_ch(g, hw_chid, true); } - /* re-enable elpg or release pmu mutex */ - if (elpg_off) - gk20a_pmu_enable_elpg(g); - else + if (!mutex_ret) pmu_mutex_release(&g->pmu, PMU_MUTEX_ID_FIFO, &token); for (i = 0; i < g->fifo.max_runlists; i++) @@ -1587,24 +1581,18 @@ int gk20a_fifo_enable_engine_activity(struct gk20a *g, struct fifo_engine_info_gk20a *eng_info) { u32 token = PMU_INVALID_MUTEX_OWNER_ID; - u32 elpg_off; + u32 mutex_ret; u32 enable; gk20a_dbg_fn(""); - /* disable elpg if failed to acquire pmu mutex */ - elpg_off = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token); - if (elpg_off) - gk20a_pmu_disable_elpg(g); + mutex_ret = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token); enable = gk20a_readl(g, fifo_sched_disable_r()); enable &= ~(fifo_sched_disable_true_v() >> eng_info->runlist_id); gk20a_writel(g, fifo_sched_disable_r(), enable); - /* re-enable elpg or release pmu mutex */ - if (elpg_off) - gk20a_pmu_enable_elpg(g); - else + if (!mutex_ret) pmu_mutex_release(&g->pmu, PMU_MUTEX_ID_FIFO, &token); gk20a_dbg_fn("done"); @@ -1618,7 +1606,7 @@ int gk20a_fifo_disable_engine_activity(struct gk20a *g, u32 gr_stat, pbdma_stat, chan_stat, eng_stat, ctx_stat; u32 pbdma_chid = ~0, engine_chid = ~0, disable; u32 token = PMU_INVALID_MUTEX_OWNER_ID; - u32 elpg_off; + u32 mutex_ret; u32 err = 0; gk20a_dbg_fn(""); @@ -1629,10 +1617,7 @@ int gk20a_fifo_disable_engine_activity(struct gk20a *g, fifo_engine_status_engine_busy_v() && !wait_for_idle) return -EBUSY; - /* disable elpg if failed to acquire pmu mutex */ - elpg_off = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token); - if (elpg_off) - gk20a_pmu_disable_elpg(g); + mutex_ret = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token); disable = gk20a_readl(g, fifo_sched_disable_r()); disable = set_field(disable, @@ -1674,10 +1659,7 @@ int gk20a_fifo_disable_engine_activity(struct gk20a *g, } clean_up: - /* re-enable elpg or release pmu mutex */ - if (elpg_off) - gk20a_pmu_enable_elpg(g); - else + if (!mutex_ret) pmu_mutex_release(&g->pmu, PMU_MUTEX_ID_FIFO, &token); if (err) { @@ -1903,25 +1885,19 @@ int gk20a_fifo_update_runlist(struct gk20a *g, u32 runlist_id, u32 hw_chid, struct fifo_runlist_info_gk20a *runlist = NULL; struct fifo_gk20a *f = &g->fifo; u32 token = PMU_INVALID_MUTEX_OWNER_ID; - u32 elpg_off; + u32 mutex_ret; u32 ret = 0; runlist = &f->runlist_info[runlist_id]; mutex_lock(&runlist->mutex); - /* disable elpg if failed to acquire pmu mutex */ - elpg_off = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token); - if (elpg_off) - gk20a_pmu_disable_elpg(g); + mutex_ret = pmu_mutex_acquire(&g->pmu, PMU_MUTEX_ID_FIFO, &token); ret = gk20a_fifo_update_runlist_locked(g, runlist_id, hw_chid, add, wait_for_finish); - /* re-enable elpg or release pmu mutex */ - if (elpg_off) - gk20a_pmu_enable_elpg(g); - else + if (!mutex_ret) pmu_mutex_release(&g->pmu, PMU_MUTEX_ID_FIFO, &token); mutex_unlock(&runlist->mutex); -- cgit v1.2.2