diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 58 | 
1 files changed, 13 insertions, 45 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c index 72d9b92b1754..6ed53669f3e0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c @@ -417,9 +417,6 @@ int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring,  	}  	amdgpu_fence_write(ring, atomic_read(&ring->fence_drv.last_seq)); -	if (irq_src) -		amdgpu_irq_get(adev, irq_src, irq_type); -  	ring->fence_drv.irq_src = irq_src;  	ring->fence_drv.irq_type = irq_type;  	ring->fence_drv.initialized = true; @@ -490,7 +487,7 @@ int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring,  	r = drm_sched_init(&ring->sched, &amdgpu_sched_ops,  			   num_hw_submission, amdgpu_job_hang_limit, -			   timeout, sched_score, ring->name); +			   timeout, NULL, sched_score, ring->name);  	if (r) {  		DRM_ERROR("Failed to create scheduler on ring %s.\n",  			  ring->name); @@ -501,7 +498,7 @@ int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring,  }  /** - * amdgpu_fence_driver_init - init the fence driver + * amdgpu_fence_driver_sw_init - init the fence driver   * for all possible rings.   *   * @adev: amdgpu device pointer @@ -512,20 +509,20 @@ int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring,   * amdgpu_fence_driver_start_ring().   * Returns 0 for success.   */ -int amdgpu_fence_driver_init(struct amdgpu_device *adev) +int amdgpu_fence_driver_sw_init(struct amdgpu_device *adev)  {  	return 0;  }  /** - * amdgpu_fence_driver_fini - tear down the fence driver + * amdgpu_fence_driver_hw_fini - tear down the fence driver   * for all possible rings.   *   * @adev: amdgpu device pointer   *   * Tear down the fence driver for all possible rings (all asics).   */ -void amdgpu_fence_driver_fini_hw(struct amdgpu_device *adev) +void amdgpu_fence_driver_hw_fini(struct amdgpu_device *adev)  {  	int i, r; @@ -534,8 +531,7 @@ void amdgpu_fence_driver_fini_hw(struct amdgpu_device *adev)  		if (!ring || !ring->fence_drv.initialized)  			continue; -		if (!ring->no_scheduler) -			drm_sched_fini(&ring->sched); +  		/* You can't wait for HW to signal if it's gone */  		if (!drm_dev_is_unplugged(&adev->ddev))  			r = amdgpu_fence_wait_empty(ring); @@ -553,7 +549,7 @@ void amdgpu_fence_driver_fini_hw(struct amdgpu_device *adev)  	}  } -void amdgpu_fence_driver_fini_sw(struct amdgpu_device *adev) +void amdgpu_fence_driver_sw_fini(struct amdgpu_device *adev)  {  	unsigned int i, j; @@ -563,6 +559,9 @@ void amdgpu_fence_driver_fini_sw(struct amdgpu_device *adev)  		if (!ring || !ring->fence_drv.initialized)  			continue; +		if (!ring->no_scheduler) +			drm_sched_fini(&ring->sched); +  		for (j = 0; j <= ring->fence_drv.num_fences_mask; ++j)  			dma_fence_put(ring->fence_drv.fences[j]);  		kfree(ring->fence_drv.fences); @@ -572,49 +571,18 @@ void amdgpu_fence_driver_fini_sw(struct amdgpu_device *adev)  }  /** - * amdgpu_fence_driver_suspend - suspend the fence driver - * for all possible rings. - * - * @adev: amdgpu device pointer - * - * Suspend the fence driver for all possible rings (all asics). - */ -void amdgpu_fence_driver_suspend(struct amdgpu_device *adev) -{ -	int i, r; - -	for (i = 0; i < AMDGPU_MAX_RINGS; i++) { -		struct amdgpu_ring *ring = adev->rings[i]; -		if (!ring || !ring->fence_drv.initialized) -			continue; - -		/* wait for gpu to finish processing current batch */ -		r = amdgpu_fence_wait_empty(ring); -		if (r) { -			/* delay GPU reset to resume */ -			amdgpu_fence_driver_force_completion(ring); -		} - -		/* disable the interrupt */ -		if (ring->fence_drv.irq_src) -			amdgpu_irq_put(adev, ring->fence_drv.irq_src, -				       ring->fence_drv.irq_type); -	} -} - -/** - * amdgpu_fence_driver_resume - resume the fence driver + * amdgpu_fence_driver_hw_init - enable the fence driver   * for all possible rings.   *   * @adev: amdgpu device pointer   * - * Resume the fence driver for all possible rings (all asics). + * Enable the fence driver for all possible rings (all asics).   * Not all asics have all rings, so each asic will only   * start the fence driver on the rings it has using   * amdgpu_fence_driver_start_ring().   * Returns 0 for success.   */ -void amdgpu_fence_driver_resume(struct amdgpu_device *adev) +void amdgpu_fence_driver_hw_init(struct amdgpu_device *adev)  {  	int i; |