xref: /openbmc/linux/drivers/gpu/drm/nouveau/nvif/timer.c (revision ed3d1489)
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