diff options
| author | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
|---|---|---|
| committer | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
| commit | 79828b4fa835f73cdaf4bffa48696abdcbea9d02 (patch) | |
| tree | 5e0fa7156acb75ba603022bc807df8f2fedb97a8 /drivers/gpu/drm/nouveau/include/nvkm/subdev/timer.h | |
| parent | 721b51fcf91898299d96f4b72cb9434cda29dce6 (diff) | |
| parent | 8c1a9d6323abf0fb1e5dad96cf3f1c783505ea5a (diff) | |
Merge remote-tracking branch 'asoc/fix/rt5645' into asoc-fix-rt5645
Diffstat (limited to 'drivers/gpu/drm/nouveau/include/nvkm/subdev/timer.h')
| -rw-r--r-- | drivers/gpu/drm/nouveau/include/nvkm/subdev/timer.h | 83 | 
1 files changed, 44 insertions, 39 deletions
diff --git a/drivers/gpu/drm/nouveau/include/nvkm/subdev/timer.h b/drivers/gpu/drm/nouveau/include/nvkm/subdev/timer.h index 4ad55082ef7a..62ed0880b0e1 100644 --- a/drivers/gpu/drm/nouveau/include/nvkm/subdev/timer.h +++ b/drivers/gpu/drm/nouveau/include/nvkm/subdev/timer.h @@ -9,53 +9,58 @@ struct nvkm_alarm {  };  static inline void -nvkm_alarm_init(struct nvkm_alarm *alarm, -		   void (*func)(struct nvkm_alarm *)) +nvkm_alarm_init(struct nvkm_alarm *alarm, void (*func)(struct nvkm_alarm *))  {  	INIT_LIST_HEAD(&alarm->head);  	alarm->func = func;  } -bool nvkm_timer_wait_eq(void *, u64 nsec, u32 addr, u32 mask, u32 data); -bool nvkm_timer_wait_ne(void *, u64 nsec, u32 addr, u32 mask, u32 data); -bool nvkm_timer_wait_cb(void *, u64 nsec, bool (*func)(void *), void *data); -void nvkm_timer_alarm(void *, u32 nsec, struct nvkm_alarm *); -void nvkm_timer_alarm_cancel(void *, struct nvkm_alarm *); - -#define NV_WAIT_DEFAULT 2000000000ULL -#define nv_wait(o,a,m,v)                                                       \ -	nvkm_timer_wait_eq((o), NV_WAIT_DEFAULT, (a), (m), (v)) -#define nv_wait_ne(o,a,m,v)                                                    \ -	nvkm_timer_wait_ne((o), NV_WAIT_DEFAULT, (a), (m), (v)) -#define nv_wait_cb(o,c,d)                                                      \ -	nvkm_timer_wait_cb((o), NV_WAIT_DEFAULT, (c), (d)) -  struct nvkm_timer { -	struct nvkm_subdev base; -	u64  (*read)(struct nvkm_timer *); -	void (*alarm)(struct nvkm_timer *, u64 time, struct nvkm_alarm *); -	void (*alarm_cancel)(struct nvkm_timer *, struct nvkm_alarm *); -}; +	const struct nvkm_timer_func *func; +	struct nvkm_subdev subdev; -static inline struct nvkm_timer * -nvkm_timer(void *obj) -{ -	return (void *)nvkm_subdev(obj, NVDEV_SUBDEV_TIMER); -} +	struct list_head alarms; +	spinlock_t lock; +}; -#define nvkm_timer_create(p,e,o,d)                                          \ -	nvkm_subdev_create_((p), (e), (o), 0, "PTIMER", "timer",            \ -			       sizeof(**d), (void **)d) -#define nvkm_timer_destroy(p)                                               \ -	nvkm_subdev_destroy(&(p)->base) -#define nvkm_timer_init(p)                                                  \ -	nvkm_subdev_init(&(p)->base) -#define nvkm_timer_fini(p,s)                                                \ -	nvkm_subdev_fini(&(p)->base, (s)) +u64 nvkm_timer_read(struct nvkm_timer *); +void nvkm_timer_alarm(struct nvkm_timer *, u32 nsec, struct nvkm_alarm *); +void nvkm_timer_alarm_cancel(struct nvkm_timer *, struct nvkm_alarm *); -int nvkm_timer_create_(struct nvkm_object *, struct nvkm_engine *, -			  struct nvkm_oclass *, int size, void **); +/* Delay based on GPU time (ie. PTIMER). + * + * Will return -ETIMEDOUT unless the loop was terminated with 'break', + * where it will return the number of nanoseconds taken instead. + * + * NVKM_DELAY can be passed for 'cond' to disable the timeout warning, + * which is useful for unconditional delay loops. + */ +#define NVKM_DELAY _warn = false; +#define nvkm_nsec(d,n,cond...) ({                                              \ +	struct nvkm_device *_device = (d);                                     \ +	struct nvkm_timer *_tmr = _device->timer;                              \ +	u64 _nsecs = (n), _time0 = nvkm_timer_read(_tmr);                      \ +	s64 _taken = 0;                                                        \ +	bool _warn = true;                                                     \ +                                                                               \ +	do {                                                                   \ +		cond                                                           \ +	} while (_taken = nvkm_timer_read(_tmr) - _time0, _taken < _nsecs);    \ +                                                                               \ +	if (_taken >= _nsecs) {                                                \ +		if (_warn) {                                                   \ +			dev_warn(_device->dev, "timeout at %s:%d/%s()!\n",     \ +				 __FILE__, __LINE__, __func__);                \ +		}                                                              \ +		_taken = -ETIMEDOUT;                                           \ +	}                                                                      \ +	_taken;                                                                \ +}) +#define nvkm_usec(d,u,cond...) nvkm_nsec((d), (u) * 1000, ##cond) +#define nvkm_msec(d,m,cond...) nvkm_usec((d), (m) * 1000, ##cond) -extern struct nvkm_oclass nv04_timer_oclass; -extern struct nvkm_oclass gk20a_timer_oclass; +int nv04_timer_new(struct nvkm_device *, int, struct nvkm_timer **); +int nv40_timer_new(struct nvkm_device *, int, struct nvkm_timer **); +int nv41_timer_new(struct nvkm_device *, int, struct nvkm_timer **); +int gk20a_timer_new(struct nvkm_device *, int, struct nvkm_timer **);  #endif  |