diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 49 | 
1 files changed, 26 insertions, 23 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c index 6bf5cea294f2..ab05121b9272 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c @@ -22,6 +22,7 @@   */  #include "amdgpu.h" +#define MAX_KIQ_REG_WAIT	100000  int amdgpu_allocate_static_csa(struct amdgpu_device *adev)  { @@ -45,14 +46,14 @@ int amdgpu_allocate_static_csa(struct amdgpu_device *adev)   * address within META_DATA init package to support SRIOV gfx preemption.   */ -int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm) +int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm, +			  struct amdgpu_bo_va **bo_va)  { -	int r; -	struct amdgpu_bo_va *bo_va;  	struct ww_acquire_ctx ticket;  	struct list_head list;  	struct amdgpu_bo_list_entry pd;  	struct ttm_validate_buffer csa_tv; +	int r;  	INIT_LIST_HEAD(&list);  	INIT_LIST_HEAD(&csa_tv.head); @@ -68,34 +69,33 @@ int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm)  		return r;  	} -	bo_va = amdgpu_vm_bo_add(adev, vm, adev->virt.csa_obj); -	if (!bo_va) { +	*bo_va = amdgpu_vm_bo_add(adev, vm, adev->virt.csa_obj); +	if (!*bo_va) {  		ttm_eu_backoff_reservation(&ticket, &list);  		DRM_ERROR("failed to create bo_va for static CSA\n");  		return -ENOMEM;  	} -	r = amdgpu_vm_alloc_pts(adev, bo_va->vm, AMDGPU_CSA_VADDR, -				   AMDGPU_CSA_SIZE); +	r = amdgpu_vm_alloc_pts(adev, (*bo_va)->base.vm, AMDGPU_CSA_VADDR, +				AMDGPU_CSA_SIZE);  	if (r) {  		DRM_ERROR("failed to allocate pts for static CSA, err=%d\n", r); -		amdgpu_vm_bo_rmv(adev, bo_va); +		amdgpu_vm_bo_rmv(adev, *bo_va);  		ttm_eu_backoff_reservation(&ticket, &list);  		return r;  	} -	r = amdgpu_vm_bo_map(adev, bo_va, AMDGPU_CSA_VADDR, 0,AMDGPU_CSA_SIZE, -						AMDGPU_PTE_READABLE | AMDGPU_PTE_WRITEABLE | -						AMDGPU_PTE_EXECUTABLE); +	r = amdgpu_vm_bo_map(adev, *bo_va, AMDGPU_CSA_VADDR, 0, AMDGPU_CSA_SIZE, +			     AMDGPU_PTE_READABLE | AMDGPU_PTE_WRITEABLE | +			     AMDGPU_PTE_EXECUTABLE);  	if (r) {  		DRM_ERROR("failed to do bo_map on static CSA, err=%d\n", r); -		amdgpu_vm_bo_rmv(adev, bo_va); +		amdgpu_vm_bo_rmv(adev, *bo_va);  		ttm_eu_backoff_reservation(&ticket, &list);  		return r;  	} -	vm->csa_bo_va = bo_va;  	ttm_eu_backoff_reservation(&ticket, &list);  	return 0;  } @@ -105,8 +105,9 @@ void amdgpu_virt_init_setting(struct amdgpu_device *adev)  	/* enable virtual display */  	adev->mode_info.num_crtc = 1;  	adev->enable_virtual_display = true; +	adev->cg_flags = 0; +	adev->pg_flags = 0; -	mutex_init(&adev->virt.lock_kiq);  	mutex_init(&adev->virt.lock_reset);  } @@ -120,17 +121,19 @@ uint32_t amdgpu_virt_kiq_rreg(struct amdgpu_device *adev, uint32_t reg)  	BUG_ON(!ring->funcs->emit_rreg); -	mutex_lock(&adev->virt.lock_kiq); +	mutex_lock(&kiq->ring_mutex);  	amdgpu_ring_alloc(ring, 32);  	amdgpu_ring_emit_rreg(ring, reg);  	amdgpu_fence_emit(ring, &f);  	amdgpu_ring_commit(ring); -	mutex_unlock(&adev->virt.lock_kiq); +	mutex_unlock(&kiq->ring_mutex); -	r = dma_fence_wait(f, false); -	if (r) -		DRM_ERROR("wait for kiq fence error: %ld.\n", r); +	r = dma_fence_wait_timeout(f, false, msecs_to_jiffies(MAX_KIQ_REG_WAIT));  	dma_fence_put(f); +	if (r < 1) { +		DRM_ERROR("wait for kiq fence error: %ld.\n", r); +		return ~0; +	}  	val = adev->wb.wb[adev->virt.reg_val_offs]; @@ -146,15 +149,15 @@ void amdgpu_virt_kiq_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v)  	BUG_ON(!ring->funcs->emit_wreg); -	mutex_lock(&adev->virt.lock_kiq); +	mutex_lock(&kiq->ring_mutex);  	amdgpu_ring_alloc(ring, 32);  	amdgpu_ring_emit_wreg(ring, reg, v);  	amdgpu_fence_emit(ring, &f);  	amdgpu_ring_commit(ring); -	mutex_unlock(&adev->virt.lock_kiq); +	mutex_unlock(&kiq->ring_mutex); -	r = dma_fence_wait(f, false); -	if (r) +	r = dma_fence_wait_timeout(f, false, msecs_to_jiffies(MAX_KIQ_REG_WAIT)); +	if (r < 1)  		DRM_ERROR("wait for kiq fence error: %ld.\n", r);  	dma_fence_put(f);  } |