xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/nouveau/include/nvif/timer.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #ifndef __NVIF_TIMER_H__
2*4882a593Smuzhiyun #define __NVIF_TIMER_H__
3*4882a593Smuzhiyun #include <nvif/os.h>
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun struct nvif_timer_wait {
6*4882a593Smuzhiyun 	struct nvif_device *device;
7*4882a593Smuzhiyun 	u64 limit;
8*4882a593Smuzhiyun 	u64 time0;
9*4882a593Smuzhiyun 	u64 time1;
10*4882a593Smuzhiyun 	int reads;
11*4882a593Smuzhiyun };
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun void nvif_timer_wait_init(struct nvif_device *, u64 nsec,
14*4882a593Smuzhiyun 			  struct nvif_timer_wait *);
15*4882a593Smuzhiyun s64 nvif_timer_wait_test(struct nvif_timer_wait *);
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun /* Delay based on GPU time (ie. PTIMER).
18*4882a593Smuzhiyun  *
19*4882a593Smuzhiyun  * Will return -ETIMEDOUT unless the loop was terminated with 'break',
20*4882a593Smuzhiyun  * where it will return the number of nanoseconds taken instead.
21*4882a593Smuzhiyun  */
22*4882a593Smuzhiyun #define nvif_nsec(d,n,cond...) ({                                              \
23*4882a593Smuzhiyun 	struct nvif_timer_wait _wait;                                          \
24*4882a593Smuzhiyun 	s64 _taken = 0;                                                        \
25*4882a593Smuzhiyun                                                                                \
26*4882a593Smuzhiyun 	nvif_timer_wait_init((d), (n), &_wait);                                \
27*4882a593Smuzhiyun 	do {                                                                   \
28*4882a593Smuzhiyun 		cond                                                           \
29*4882a593Smuzhiyun 	} while ((_taken = nvif_timer_wait_test(&_wait)) >= 0);                \
30*4882a593Smuzhiyun                                                                                \
31*4882a593Smuzhiyun 	_taken;                                                                \
32*4882a593Smuzhiyun })
33*4882a593Smuzhiyun #define nvif_usec(d,u,cond...) nvif_nsec((d), (u) * 1000, ##cond)
34*4882a593Smuzhiyun #define nvif_msec(d,m,cond...) nvif_usec((d), (m) * 1000, ##cond)
35*4882a593Smuzhiyun #endif
36