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