diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 44 | 
1 files changed, 26 insertions, 18 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c index d878fe7fee51..58d4c219178a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c @@ -416,15 +416,16 @@ int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring,  		ring->fence_drv.gpu_addr = adev->uvd.inst[ring->me].gpu_addr + index;  	}  	amdgpu_fence_write(ring, atomic_read(&ring->fence_drv.last_seq)); -	amdgpu_irq_get(adev, irq_src, irq_type); + +	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; -	DRM_DEV_DEBUG(adev->dev, "fence driver on ring %s use gpu addr " -		      "0x%016llx, cpu addr 0x%p\n", ring->name, -		      ring->fence_drv.gpu_addr, ring->fence_drv.cpu_addr); +	DRM_DEV_DEBUG(adev->dev, "fence driver on ring %s use gpu addr 0x%016llx\n", +		      ring->name, ring->fence_drv.gpu_addr);  	return 0;  } @@ -448,8 +449,7 @@ int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring,  	if (!adev)  		return -EINVAL; -	/* Check that num_hw_submission is a power of two */ -	if ((num_hw_submission & (num_hw_submission - 1)) != 0) +	if (!is_power_of_2(num_hw_submission))  		return -EINVAL;  	ring->fence_drv.cpu_addr = NULL; @@ -467,8 +467,8 @@ int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring,  	if (!ring->fence_drv.fences)  		return -ENOMEM; -	/* No need to setup the GPU scheduler for KIQ ring */ -	if (ring->funcs->type != AMDGPU_RING_TYPE_KIQ) { +	/* 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; @@ -537,9 +537,11 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev)  			/* no need to trigger GPU reset as we are unloading */  			amdgpu_fence_driver_force_completion(ring);  		} -		amdgpu_irq_put(adev, ring->fence_drv.irq_src, -			       ring->fence_drv.irq_type); -		drm_sched_fini(&ring->sched); +		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]); @@ -574,8 +576,9 @@ void amdgpu_fence_driver_suspend(struct amdgpu_device *adev)  		}  		/* disable the interrupt */ -		amdgpu_irq_put(adev, ring->fence_drv.irq_src, -			       ring->fence_drv.irq_type); +		if (ring->fence_drv.irq_src) +			amdgpu_irq_put(adev, ring->fence_drv.irq_src, +				       ring->fence_drv.irq_type);  	}  } @@ -601,8 +604,9 @@ void amdgpu_fence_driver_resume(struct amdgpu_device *adev)  			continue;  		/* enable the interrupt */ -		amdgpu_irq_get(adev, ring->fence_drv.irq_src, -			       ring->fence_drv.irq_type); +		if (ring->fence_drv.irq_src) +			amdgpu_irq_get(adev, ring->fence_drv.irq_src, +				       ring->fence_drv.irq_type);  	}  } @@ -749,8 +753,10 @@ static int amdgpu_debugfs_gpu_recover(struct seq_file *m, void *data)  	int r;  	r = pm_runtime_get_sync(dev->dev); -	if (r < 0) +	if (r < 0) { +		pm_runtime_put_autosuspend(dev->dev);  		return 0; +	}  	seq_printf(m, "gpu recover\n");  	amdgpu_device_gpu_recover(adev, NULL); @@ -775,8 +781,10 @@ int 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, 1); -	return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_fence_list, 2); +		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;  #endif | 
