diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_reset.h')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_reset.h | 40 | 
1 files changed, 40 insertions, 0 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_reset.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_reset.h index e00d38d9160a..1949dbe28a86 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_reset.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_reset.h @@ -70,6 +70,21 @@ struct amdgpu_reset_control {  	void (*async_reset)(struct work_struct *work);  }; + +enum amdgpu_reset_domain_type { +	SINGLE_DEVICE, +	XGMI_HIVE +}; + +struct amdgpu_reset_domain { +	struct kref refcount; +	struct workqueue_struct *wq; +	enum amdgpu_reset_domain_type type; +	struct rw_semaphore sem; +	atomic_t in_gpu_reset; +}; + +  int amdgpu_reset_init(struct amdgpu_device *adev);  int amdgpu_reset_fini(struct amdgpu_device *adev); @@ -82,4 +97,29 @@ int amdgpu_reset_perform_reset(struct amdgpu_device *adev,  int amdgpu_reset_add_handler(struct amdgpu_reset_control *reset_ctl,  			     struct amdgpu_reset_handler *handler); +struct amdgpu_reset_domain *amdgpu_reset_create_reset_domain(enum amdgpu_reset_domain_type type, +							     char *wq_name); + +void amdgpu_reset_destroy_reset_domain(struct kref *ref); + +static inline bool amdgpu_reset_get_reset_domain(struct amdgpu_reset_domain *domain) +{ +	return kref_get_unless_zero(&domain->refcount) != 0; +} + +static inline void amdgpu_reset_put_reset_domain(struct amdgpu_reset_domain *domain) +{ +	kref_put(&domain->refcount, amdgpu_reset_destroy_reset_domain); +} + +static inline bool amdgpu_reset_domain_schedule(struct amdgpu_reset_domain *domain, +						struct work_struct *work) +{ +	return queue_work(domain->wq, work); +} + +void amdgpu_device_lock_reset_domain(struct amdgpu_reset_domain *reset_domain); + +void amdgpu_device_unlock_reset_domain(struct amdgpu_reset_domain *reset_domain); +  #endif |