From eee2744d497213a503de927cbbfe179753f5e370 Mon Sep 17 00:00:00 2001 From: Terje Bergstrom Date: Wed, 3 Aug 2016 13:04:38 -0700 Subject: gpu: nvgpu: When powering down, abort if not idle When trying to power down GPU the engine might be still busy. In this case delay power down by returning -EBUSY from gk20a_pm_runtime_suspend(). Bug 200224907 Change-Id: Ibad74c090add24a185bc1a7a02df367af9b95ced Signed-off-by: Terje Bergstrom Reviewed-on: http://git-master/r/1213042 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a/fifo_gk20a.c') diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c index ff052400..2e38c4b6 100644 --- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c @@ -3016,6 +3016,19 @@ bool gk20a_fifo_mmu_fault_pending(struct gk20a *g) return false; } +bool gk20a_fifo_is_engine_busy(struct gk20a *g) +{ + int i; + + for (i = 0; i < fifo_engine_status__size_1_v(); i++) { + u32 status = gk20a_readl(g, fifo_engine_status_r(i)); + if (fifo_engine_status_engine_v(status) == + fifo_engine_status_engine_busy_v()) + return true; + } + return false; +} + int gk20a_fifo_wait_engine_idle(struct gk20a *g) { unsigned long end_jiffies = jiffies + @@ -3023,7 +3036,6 @@ int gk20a_fifo_wait_engine_idle(struct gk20a *g) unsigned long delay = GR_IDLE_CHECK_DEFAULT; int ret = -ETIMEDOUT; u32 i; - struct device *d = dev_from_gk20a(g); gk20a_dbg_fn(""); @@ -3041,7 +3053,7 @@ int gk20a_fifo_wait_engine_idle(struct gk20a *g) } while (time_before(jiffies, end_jiffies) || !tegra_platform_is_silicon()); if (ret) { - gk20a_err(d, "cannot idle engine %u\n", i); + gk20a_dbg_info("cannot idle engine %u", i); break; } } -- cgit v1.2.2