1ed3d1489SBen Skeggs /*
2ed3d1489SBen Skeggs * Copyright 2020 Red Hat Inc.
3ed3d1489SBen Skeggs *
4ed3d1489SBen Skeggs * Permission is hereby granted, free of charge, to any person obtaining a
5ed3d1489SBen Skeggs * copy of this software and associated documentation files (the "Software"),
6ed3d1489SBen Skeggs * to deal in the Software without restriction, including without limitation
7ed3d1489SBen Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8ed3d1489SBen Skeggs * and/or sell copies of the Software, and to permit persons to whom the
9ed3d1489SBen Skeggs * Software is furnished to do so, subject to the following conditions:
10ed3d1489SBen Skeggs *
11ed3d1489SBen Skeggs * The above copyright notice and this permission notice shall be included in
12ed3d1489SBen Skeggs * all copies or substantial portions of the Software.
13ed3d1489SBen Skeggs *
14ed3d1489SBen Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15ed3d1489SBen Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16ed3d1489SBen Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17ed3d1489SBen Skeggs * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18ed3d1489SBen Skeggs * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19ed3d1489SBen Skeggs * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20ed3d1489SBen Skeggs * OTHER DEALINGS IN THE SOFTWARE.
21ed3d1489SBen Skeggs */
22ed3d1489SBen Skeggs #include <nvif/timer.h>
23ed3d1489SBen Skeggs #include <nvif/device.h>
24ed3d1489SBen Skeggs
25ed3d1489SBen Skeggs s64
nvif_timer_wait_test(struct nvif_timer_wait * wait)26ed3d1489SBen Skeggs nvif_timer_wait_test(struct nvif_timer_wait *wait)
27ed3d1489SBen Skeggs {
28ed3d1489SBen Skeggs u64 time = nvif_device_time(wait->device);
29ed3d1489SBen Skeggs
30ed3d1489SBen Skeggs if (wait->reads == 0) {
31ed3d1489SBen Skeggs wait->time0 = time;
32ed3d1489SBen Skeggs wait->time1 = time;
33ed3d1489SBen Skeggs }
34ed3d1489SBen Skeggs
35ed3d1489SBen Skeggs if (wait->time1 == time) {
36ed3d1489SBen Skeggs if (WARN_ON(wait->reads++ == 16))
37ed3d1489SBen Skeggs return -ETIMEDOUT;
38ed3d1489SBen Skeggs } else {
39ed3d1489SBen Skeggs wait->time1 = time;
40ed3d1489SBen Skeggs wait->reads = 1;
41ed3d1489SBen Skeggs }
42ed3d1489SBen Skeggs
43ed3d1489SBen Skeggs if (wait->time1 - wait->time0 > wait->limit)
44ed3d1489SBen Skeggs return -ETIMEDOUT;
45ed3d1489SBen Skeggs
46ed3d1489SBen Skeggs return wait->time1 - wait->time0;
47ed3d1489SBen Skeggs }
48ed3d1489SBen Skeggs
49ed3d1489SBen Skeggs void
nvif_timer_wait_init(struct nvif_device * device,u64 nsec,struct nvif_timer_wait * wait)50ed3d1489SBen Skeggs nvif_timer_wait_init(struct nvif_device *device, u64 nsec,
51ed3d1489SBen Skeggs struct nvif_timer_wait *wait)
52ed3d1489SBen Skeggs {
53ed3d1489SBen Skeggs wait->device = device;
54ed3d1489SBen Skeggs wait->limit = nsec;
55ed3d1489SBen Skeggs wait->reads = 0;
56ed3d1489SBen Skeggs }
57