From 982fcfa737be54fd0ab16792faf97a2741e34907 Mon Sep 17 00:00:00 2001 From: Seema Khowala Date: Mon, 30 Oct 2017 14:15:51 -0700 Subject: gpu: nvgpu: Add timeouts_disabled_refcount for enabling timeout -timeouts will be enabled only when timeouts_disabled_refcount will reach 0 -timeouts_enabled debugfs will change from u32 type to file type to avoid race enabling/disabling timeout from debugfs and ioctl -unify setting timeouts_enabled from debugfs and ioctl Bug 1982434 Change-Id: I54bab778f1ae533872146dfb8d80deafd2a685c7 Signed-off-by: Seema Khowala Reviewed-on: https://git-master.nvidia.com/r/1588690 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/gk20a/channel_gk20a.c | 6 +++--- drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | 2 +- drivers/gpu/nvgpu/gk20a/gk20a.h | 12 +++++++++--- 3 files changed, 13 insertions(+), 7 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a') diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c index a4637b8f..45ce0e77 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c @@ -1158,7 +1158,7 @@ int gk20a_channel_alloc_gpfifo(struct channel_gk20a *c, } } - if (!c->g->timeouts_enabled || !c->timeout.enabled) + if (!nvgpu_is_timeouts_enabled(c->g) || !c->timeout.enabled) acquire_timeout = 0; else acquire_timeout = c->timeout.limit_ms; @@ -1266,7 +1266,7 @@ bool gk20a_channel_update_and_check_timeout(struct channel_gk20a *ch, ch->timeout_gpfifo_get = gpfifo_get; - return ch->g->timeouts_enabled && + return nvgpu_is_timeouts_enabled(ch->g) && ch->timeout_accumulated_ms > ch->timeout_ms_max; } @@ -1303,7 +1303,7 @@ static void __gk20a_channel_timeout_start(struct channel_gk20a *ch) */ static void gk20a_channel_timeout_start(struct channel_gk20a *ch) { - if (!ch->g->timeouts_enabled) + if (!nvgpu_is_timeouts_enabled(ch->g)) return; if (!ch->timeout.enabled) diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c index 7f4a0948..964ccb03 100644 --- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c @@ -2482,7 +2482,7 @@ unsigned int gk20a_fifo_handle_pbdma_intr_0(struct gk20a *g, u32 pbdma_id, val &= ~pbdma_acquire_timeout_en_enable_f(); gk20a_writel(g, pbdma_acquire_r(pbdma_id), val); - if (g->timeouts_enabled) { + if (nvgpu_is_timeouts_enabled(g)) { rc_type = RC_TYPE_PBDMA_FAULT; nvgpu_err(g, "semaphore acquire timeout!"); diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index 84d3f639..f6318257 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h @@ -1314,7 +1314,7 @@ struct gk20a { struct railgate_stats pstats; #endif u32 gr_idle_timeout_default; - bool timeouts_enabled; + bool timeouts_disabled_by_user; unsigned int ch_wdt_timeout_ms; struct nvgpu_mutex poweron_lock; @@ -1376,7 +1376,8 @@ struct gk20a { /* also prevents debug sessions from attaching until released */ struct nvgpu_mutex dbg_sessions_lock; int dbg_powergating_disabled_refcount; /*refcount for pg disable */ - int dbg_timeout_disabled_refcount; /*refcount for timeout disable */ + /*refcount for timeout disable */ + nvgpu_atomic_t timeouts_disabled_refcount; /* must have dbg_sessions_lock before use */ struct nvgpu_dbg_reg_op *dbg_regops_tmp_buf; @@ -1508,9 +1509,14 @@ struct gk20a { struct nvgpu_list_node boardobjgrp_head; }; +static inline bool nvgpu_is_timeouts_enabled(struct gk20a *g) +{ + return nvgpu_atomic_read(&g->timeouts_disabled_refcount) == 0; +} + static inline unsigned long gk20a_get_gr_idle_timeout(struct gk20a *g) { - return g->timeouts_enabled ? + return nvgpu_is_timeouts_enabled(g) ? g->gr_idle_timeout_default : ULONG_MAX; } -- cgit v1.2.2