forked from mirrors/linux
		
	drm/amdgpu: fix for suspend/resume sequence under sriov
- clear kiq ring after suspend/resume under sriov to aviod kiq ring test failure - update irq after resume to fix kiq interrput loss Signed-off-by: Victor Zhao <Victor.Zhao@amd.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
		
							parent
							
								
									5cefe31b2a
								
							
						
					
					
						commit
						ec4927d463
					
				
					 5 changed files with 10 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -4197,6 +4197,8 @@ int amdgpu_device_resume(struct drm_device *dev, bool fbcon)
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	/* Make sure IB tests flushed */
 | 
			
		||||
	if (amdgpu_sriov_vf(adev))
 | 
			
		||||
		amdgpu_irq_gpu_reset_resume_helper(adev);
 | 
			
		||||
	flush_delayed_work(&adev->delayed_init_work);
 | 
			
		||||
 | 
			
		||||
	if (adev->in_s0ix) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6909,6 +6909,8 @@ static int gfx_v10_0_kiq_init_queue(struct amdgpu_ring *ring)
 | 
			
		|||
		mutex_unlock(&adev->srbm_mutex);
 | 
			
		||||
	} else {
 | 
			
		||||
		memset((void *)mqd, 0, sizeof(*mqd));
 | 
			
		||||
		if (amdgpu_sriov_vf(adev) && adev->in_suspend)
 | 
			
		||||
			amdgpu_ring_clear_ring(ring);
 | 
			
		||||
		mutex_lock(&adev->srbm_mutex);
 | 
			
		||||
		nv_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
 | 
			
		||||
		amdgpu_ring_init_mqd(ring);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4004,6 +4004,8 @@ static int gfx_v11_0_kiq_init_queue(struct amdgpu_ring *ring)
 | 
			
		|||
		mutex_unlock(&adev->srbm_mutex);
 | 
			
		||||
	} else {
 | 
			
		||||
		memset((void *)mqd, 0, sizeof(*mqd));
 | 
			
		||||
		if (amdgpu_sriov_vf(adev) && adev->in_suspend)
 | 
			
		||||
			amdgpu_ring_clear_ring(ring);
 | 
			
		||||
		mutex_lock(&adev->srbm_mutex);
 | 
			
		||||
		soc21_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
 | 
			
		||||
		amdgpu_ring_init_mqd(ring);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4643,6 +4643,8 @@ static int gfx_v8_0_kiq_init_queue(struct amdgpu_ring *ring)
 | 
			
		|||
		memset((void *)mqd, 0, sizeof(struct vi_mqd_allocation));
 | 
			
		||||
		((struct vi_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF;
 | 
			
		||||
		((struct vi_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF;
 | 
			
		||||
		if (amdgpu_sriov_vf(adev) && adev->in_suspend)
 | 
			
		||||
			amdgpu_ring_clear_ring(ring);
 | 
			
		||||
		mutex_lock(&adev->srbm_mutex);
 | 
			
		||||
		vi_srbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
 | 
			
		||||
		gfx_v8_0_mqd_init(ring);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3581,6 +3581,8 @@ static int gfx_v9_0_kiq_init_queue(struct amdgpu_ring *ring)
 | 
			
		|||
		memset((void *)mqd, 0, sizeof(struct v9_mqd_allocation));
 | 
			
		||||
		((struct v9_mqd_allocation *)mqd)->dynamic_cu_mask = 0xFFFFFFFF;
 | 
			
		||||
		((struct v9_mqd_allocation *)mqd)->dynamic_rb_mask = 0xFFFFFFFF;
 | 
			
		||||
		if (amdgpu_sriov_vf(adev) && adev->in_suspend)
 | 
			
		||||
			amdgpu_ring_clear_ring(ring);
 | 
			
		||||
		mutex_lock(&adev->srbm_mutex);
 | 
			
		||||
		soc15_grbm_select(adev, ring->me, ring->pipe, ring->queue, 0);
 | 
			
		||||
		gfx_v9_0_mqd_init(ring);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue