diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 101 | 
1 files changed, 48 insertions, 53 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c index d56f4023ebb3..47ea46859618 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c @@ -36,8 +36,6 @@  #include <linux/firmware.h>  #include <linux/pm_runtime.h> -#include <drm/drm_debugfs.h> -  #include "amdgpu.h"  #include "amdgpu_trace.h" @@ -441,7 +439,8 @@ int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring,   * Helper function for amdgpu_fence_driver_init().   */  int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring, -				  unsigned num_hw_submission) +				  unsigned num_hw_submission, +				  atomic_t *sched_score)  {  	struct amdgpu_device *adev = ring->adev;  	long timeout; @@ -469,30 +468,31 @@ int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring,  		return -ENOMEM;  	/* No need to setup the GPU scheduler for rings that don't need it */ -	if (!ring->no_scheduler) { -		switch (ring->funcs->type) { -		case AMDGPU_RING_TYPE_GFX: -			timeout = adev->gfx_timeout; -			break; -		case AMDGPU_RING_TYPE_COMPUTE: -			timeout = adev->compute_timeout; -			break; -		case AMDGPU_RING_TYPE_SDMA: -			timeout = adev->sdma_timeout; -			break; -		default: -			timeout = adev->video_timeout; -			break; -		} +	if (ring->no_scheduler) +		return 0; -		r = drm_sched_init(&ring->sched, &amdgpu_sched_ops, -				   num_hw_submission, amdgpu_job_hang_limit, -				   timeout, ring->name); -		if (r) { -			DRM_ERROR("Failed to create scheduler on ring %s.\n", -				  ring->name); -			return r; -		} +	switch (ring->funcs->type) { +	case AMDGPU_RING_TYPE_GFX: +		timeout = adev->gfx_timeout; +		break; +	case AMDGPU_RING_TYPE_COMPUTE: +		timeout = adev->compute_timeout; +		break; +	case AMDGPU_RING_TYPE_SDMA: +		timeout = adev->sdma_timeout; +		break; +	default: +		timeout = adev->video_timeout; +		break; +	} + +	r = drm_sched_init(&ring->sched, &amdgpu_sched_ops, +			   num_hw_submission, amdgpu_job_hang_limit, +			   timeout, sched_score, ring->name); +	if (r) { +		DRM_ERROR("Failed to create scheduler on ring %s.\n", +			  ring->name); +		return r;  	}  	return 0; @@ -533,6 +533,8 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev)  		if (!ring || !ring->fence_drv.initialized)  			continue; +		if (!ring->no_scheduler) +			drm_sched_fini(&ring->sched);  		r = amdgpu_fence_wait_empty(ring);  		if (r) {  			/* no need to trigger GPU reset as we are unloading */ @@ -541,8 +543,7 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev)  		if (ring->fence_drv.irq_src)  			amdgpu_irq_put(adev, ring->fence_drv.irq_src,  				       ring->fence_drv.irq_type); -		if (!ring->no_scheduler) -			drm_sched_fini(&ring->sched); +  		del_timer_sync(&ring->fence_drv.fallback_timer);  		for (j = 0; j <= ring->fence_drv.num_fences_mask; ++j)  			dma_fence_put(ring->fence_drv.fences[j]); @@ -697,11 +698,9 @@ static const struct dma_fence_ops amdgpu_fence_ops = {   * Fence debugfs   */  #if defined(CONFIG_DEBUG_FS) -static int amdgpu_debugfs_fence_info(struct seq_file *m, void *data) +static int amdgpu_debugfs_fence_info_show(struct seq_file *m, void *unused)  { -	struct drm_info_node *node = (struct drm_info_node *)m->private; -	struct drm_device *dev = node->minor->dev; -	struct amdgpu_device *adev = drm_to_adev(dev); +	struct amdgpu_device *adev = (struct amdgpu_device *)m->private;  	int i;  	for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { @@ -746,11 +745,10 @@ static int amdgpu_debugfs_fence_info(struct seq_file *m, void *data)   *   * Manually trigger a gpu reset at the next fence wait.   */ -static int amdgpu_debugfs_gpu_recover(struct seq_file *m, void *data) +static int gpu_recover_get(void *data, u64 *val)  { -	struct drm_info_node *node = (struct drm_info_node *) m->private; -	struct drm_device *dev = node->minor->dev; -	struct amdgpu_device *adev = drm_to_adev(dev); +	struct amdgpu_device *adev = (struct amdgpu_device *)data; +	struct drm_device *dev = adev_to_drm(adev);  	int r;  	r = pm_runtime_get_sync(dev->dev); @@ -759,8 +757,7 @@ static int amdgpu_debugfs_gpu_recover(struct seq_file *m, void *data)  		return 0;  	} -	seq_printf(m, "gpu recover\n"); -	amdgpu_device_gpu_recover(adev, NULL); +	*val = amdgpu_device_gpu_recover(adev, NULL);  	pm_runtime_mark_last_busy(dev->dev);  	pm_runtime_put_autosuspend(dev->dev); @@ -768,26 +765,24 @@ static int amdgpu_debugfs_gpu_recover(struct seq_file *m, void *data)  	return 0;  } -static const struct drm_info_list amdgpu_debugfs_fence_list[] = { -	{"amdgpu_fence_info", &amdgpu_debugfs_fence_info, 0, NULL}, -	{"amdgpu_gpu_recover", &amdgpu_debugfs_gpu_recover, 0, NULL} -}; +DEFINE_SHOW_ATTRIBUTE(amdgpu_debugfs_fence_info); +DEFINE_DEBUGFS_ATTRIBUTE(amdgpu_debugfs_gpu_recover_fops, gpu_recover_get, NULL, +			 "%lld\n"); -static const struct drm_info_list amdgpu_debugfs_fence_list_sriov[] = { -	{"amdgpu_fence_info", &amdgpu_debugfs_fence_info, 0, NULL}, -};  #endif -int amdgpu_debugfs_fence_init(struct amdgpu_device *adev) +void amdgpu_debugfs_fence_init(struct amdgpu_device *adev)  {  #if defined(CONFIG_DEBUG_FS) -	if (amdgpu_sriov_vf(adev)) -		return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_fence_list_sriov, -						ARRAY_SIZE(amdgpu_debugfs_fence_list_sriov)); -	return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_fence_list, -					ARRAY_SIZE(amdgpu_debugfs_fence_list)); -#else -	return 0; +	struct drm_minor *minor = adev_to_drm(adev)->primary; +	struct dentry *root = minor->debugfs_root; + +	debugfs_create_file("amdgpu_fence_info", 0444, root, adev, +			    &amdgpu_debugfs_fence_info_fops); + +	if (!amdgpu_sriov_vf(adev)) +		debugfs_create_file("amdgpu_gpu_recover", 0444, root, adev, +				    &amdgpu_debugfs_gpu_recover_fops);  #endif  } | 
