summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/common
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/common')
-rw-r--r--drivers/gpu/nvgpu/common/linux/timers.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/gpu/nvgpu/common/linux/timers.c b/drivers/gpu/nvgpu/common/linux/timers.c
index 140ae80e..cfebb799 100644
--- a/drivers/gpu/nvgpu/common/linux/timers.c
+++ b/drivers/gpu/nvgpu/common/linux/timers.c
@@ -14,7 +14,7 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>. 14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */ 15 */
16 16
17#include <linux/jiffies.h> 17#include <linux/ktime.h>
18#include <linux/delay.h> 18#include <linux/delay.h>
19 19
20#include <nvgpu/timers.h> 20#include <nvgpu/timers.h>
@@ -54,6 +54,9 @@ static int nvgpu_timeout_is_pre_silicon(struct nvgpu_timeout *timeout)
54 * 54 *
55 * If neither %NVGPU_TIMER_CPU_TIMER or %NVGPU_TIMER_RETRY_TIMER is passed then 55 * If neither %NVGPU_TIMER_CPU_TIMER or %NVGPU_TIMER_RETRY_TIMER is passed then
56 * a CPU timer is used by default. 56 * a CPU timer is used by default.
57 *
58 * A negative duration is interpreted as the maximum possible, which for our
59 * purposes means infinite wait.
57 */ 60 */
58int nvgpu_timeout_init(struct gk20a *g, struct nvgpu_timeout *timeout, 61int nvgpu_timeout_init(struct gk20a *g, struct nvgpu_timeout *timeout,
59 int duration, unsigned long flags) 62 int duration, unsigned long flags)
@@ -66,10 +69,14 @@ int nvgpu_timeout_init(struct gk20a *g, struct nvgpu_timeout *timeout,
66 timeout->g = g; 69 timeout->g = g;
67 timeout->flags = flags; 70 timeout->flags = flags;
68 71
72 if (duration < 0)
73 duration = INT_MAX;
74
69 if (flags & NVGPU_TIMER_RETRY_TIMER) 75 if (flags & NVGPU_TIMER_RETRY_TIMER)
70 timeout->retries.max = duration; 76 timeout->retries.max = duration;
71 else 77 else
72 timeout->time = jiffies + msecs_to_jiffies(duration); 78 timeout->time = ktime_to_ns(ktime_add_ns(ktime_get(),
79 (s64)NSEC_PER_MSEC * duration));
73 80
74 return 0; 81 return 0;
75} 82}
@@ -79,12 +86,12 @@ static int __nvgpu_timeout_expired_msg_cpu(struct nvgpu_timeout *timeout,
79 const char *fmt, va_list args) 86 const char *fmt, va_list args)
80{ 87{
81 struct gk20a *g = timeout->g; 88 struct gk20a *g = timeout->g;
82 unsigned long now = jiffies; 89 ktime_t now = ktime_get();
83 90
84 if (nvgpu_timeout_is_pre_silicon(timeout)) 91 if (nvgpu_timeout_is_pre_silicon(timeout))
85 return 0; 92 return 0;
86 93
87 if (time_after(now, (unsigned long)timeout->time)) { 94 if (ktime_after(now, ns_to_ktime(timeout->time))) {
88 if (!(timeout->flags & NVGPU_TIMER_SILENT_TIMEOUT)) { 95 if (!(timeout->flags & NVGPU_TIMER_SILENT_TIMEOUT)) {
89 char buf[128]; 96 char buf[128];
90 97
@@ -176,7 +183,7 @@ int nvgpu_timeout_peek_expired(struct nvgpu_timeout *timeout)
176 if (timeout->flags & NVGPU_TIMER_RETRY_TIMER) 183 if (timeout->flags & NVGPU_TIMER_RETRY_TIMER)
177 return timeout->retries.attempted >= timeout->retries.max; 184 return timeout->retries.attempted >= timeout->retries.max;
178 else 185 else
179 return time_after(jiffies, (unsigned long)timeout->time); 186 return ktime_after(ktime_get(), ns_to_ktime(timeout->time));
180} 187}
181 188
182/** 189/**