diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h | 16 | 
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h index 0649b59830a5..dd1c2eded6b9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ih.h @@ -68,20 +68,30 @@ struct amdgpu_ih_ring {  	/* For waiting on IH processing at checkpoint. */  	wait_queue_head_t wait_process; +	uint64_t		processed_timestamp;  }; +/* return true if time stamp t2 is after t1 with 48bit wrap around */ +#define amdgpu_ih_ts_after(t1, t2) \ +		(((int64_t)((t2) << 16) - (int64_t)((t1) << 16)) > 0LL) +  /* provided by the ih block */  struct amdgpu_ih_funcs {  	/* ring read/write ptr handling, called from interrupt context */  	u32 (*get_wptr)(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih);  	void (*decode_iv)(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih,  			  struct amdgpu_iv_entry *entry); +	uint64_t (*decode_iv_ts)(struct amdgpu_ih_ring *ih, u32 rptr, +				 signed int offset);  	void (*set_rptr)(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih);  };  #define amdgpu_ih_get_wptr(adev, ih) (adev)->irq.ih_funcs->get_wptr((adev), (ih))  #define amdgpu_ih_decode_iv(adev, iv) \  	(adev)->irq.ih_funcs->decode_iv((adev), (ih), (iv)) +#define amdgpu_ih_decode_iv_ts(adev, ih, rptr, offset) \ +	(WARN_ON_ONCE(!(adev)->irq.ih_funcs->decode_iv_ts) ? 0 : \ +	(adev)->irq.ih_funcs->decode_iv_ts((ih), (rptr), (offset)))  #define amdgpu_ih_set_rptr(adev, ih) (adev)->irq.ih_funcs->set_rptr((adev), (ih))  int amdgpu_ih_ring_init(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih, @@ -89,10 +99,12 @@ int amdgpu_ih_ring_init(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih,  void amdgpu_ih_ring_fini(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih);  void amdgpu_ih_ring_write(struct amdgpu_ih_ring *ih, const uint32_t *iv,  			  unsigned int num_dw); -int amdgpu_ih_wait_on_checkpoint_process(struct amdgpu_device *adev, -					struct amdgpu_ih_ring *ih); +int amdgpu_ih_wait_on_checkpoint_process_ts(struct amdgpu_device *adev, +					    struct amdgpu_ih_ring *ih);  int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih);  void amdgpu_ih_decode_iv_helper(struct amdgpu_device *adev,  				struct amdgpu_ih_ring *ih,  				struct amdgpu_iv_entry *entry); +uint64_t amdgpu_ih_decode_iv_ts_helper(struct amdgpu_ih_ring *ih, u32 rptr, +				       signed int offset);  #endif  | 
