summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/channel_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/channel_gk20a.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
index d5901354..d36b5d34 100644
--- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
@@ -36,6 +36,8 @@
36#include "fence_gk20a.h" 36#include "fence_gk20a.h"
37#include "semaphore_gk20a.h" 37#include "semaphore_gk20a.h"
38 38
39#include <nvgpu/timers.h>
40
39#include <nvgpu/hw/gk20a/hw_ram_gk20a.h> 41#include <nvgpu/hw/gk20a/hw_ram_gk20a.h>
40#include <nvgpu/hw/gk20a/hw_fifo_gk20a.h> 42#include <nvgpu/hw/gk20a/hw_fifo_gk20a.h>
41#include <nvgpu/hw/gk20a/hw_pbdma_gk20a.h> 43#include <nvgpu/hw/gk20a/hw_pbdma_gk20a.h>
@@ -557,8 +559,10 @@ void gk20a_channel_abort(struct channel_gk20a *ch, bool channel_preempt)
557int gk20a_wait_channel_idle(struct channel_gk20a *ch) 559int gk20a_wait_channel_idle(struct channel_gk20a *ch)
558{ 560{
559 bool channel_idle = false; 561 bool channel_idle = false;
560 unsigned long end_jiffies = jiffies + 562 struct nvgpu_timeout timeout;
561 msecs_to_jiffies(gk20a_get_gr_idle_timeout(ch->g)); 563
564 nvgpu_timeout_init(ch->g, &timeout, gk20a_get_gr_idle_timeout(ch->g),
565 NVGPU_TIMER_CPU_TIMER);
562 566
563 do { 567 do {
564 channel_gk20a_joblist_lock(ch); 568 channel_gk20a_joblist_lock(ch);
@@ -568,8 +572,7 @@ int gk20a_wait_channel_idle(struct channel_gk20a *ch)
568 break; 572 break;
569 573
570 usleep_range(1000, 3000); 574 usleep_range(1000, 3000);
571 } while (time_before(jiffies, end_jiffies) 575 } while (!nvgpu_timeout_expired(&timeout));
572 || !tegra_platform_is_silicon());
573 576
574 if (!channel_idle) { 577 if (!channel_idle) {
575 gk20a_err(dev_from_gk20a(ch->g), "jobs not freed for channel %d\n", 578 gk20a_err(dev_from_gk20a(ch->g), "jobs not freed for channel %d\n",