diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_display.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 23 | 
1 files changed, 18 insertions, 5 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c index 535650967b1a..1d4aaa9580f4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c @@ -191,7 +191,8 @@ int amdgpu_display_crtc_page_flip_target(struct drm_crtc *crtc,  	}  	if (!adev->enable_virtual_display) { -		r = amdgpu_bo_pin(new_abo, amdgpu_display_supported_domains(adev)); +		r = amdgpu_bo_pin(new_abo, +				  amdgpu_display_supported_domains(adev, new_abo->flags));  		if (unlikely(r != 0)) {  			DRM_ERROR("failed to pin new abo buffer before flip\n");  			goto unreserve; @@ -204,7 +205,7 @@ int amdgpu_display_crtc_page_flip_target(struct drm_crtc *crtc,  		goto unpin;  	} -	r = reservation_object_get_fences_rcu(new_abo->tbo.resv, &work->excl, +	r = dma_resv_get_fences_rcu(new_abo->tbo.base.resv, &work->excl,  					      &work->shared_count,  					      &work->shared);  	if (unlikely(r != 0)) { @@ -495,13 +496,25 @@ static const struct drm_framebuffer_funcs amdgpu_fb_funcs = {  	.create_handle = drm_gem_fb_create_handle,  }; -uint32_t amdgpu_display_supported_domains(struct amdgpu_device *adev) +uint32_t amdgpu_display_supported_domains(struct amdgpu_device *adev, +					  uint64_t bo_flags)  {  	uint32_t domain = AMDGPU_GEM_DOMAIN_VRAM;  #if defined(CONFIG_DRM_AMD_DC) -	if (adev->asic_type >= CHIP_CARRIZO && adev->asic_type < CHIP_RAVEN && -	    adev->flags & AMD_IS_APU && +	/* +	 * if amdgpu_bo_support_uswc returns false it means that USWC mappings +	 * is not supported for this board. But this mapping is required +	 * to avoid hang caused by placement of scanout BO in GTT on certain +	 * APUs. So force the BO placement to VRAM in case this architecture +	 * will not allow USWC mappings. +	 * Also, don't allow GTT domain if the BO doens't have USWC falg set. +	 */ +	if (adev->asic_type >= CHIP_CARRIZO && +	    adev->asic_type <= CHIP_RAVEN && +	    (adev->flags & AMD_IS_APU) && +	    (bo_flags & AMDGPU_GEM_CREATE_CPU_GTT_USWC) && +	    amdgpu_bo_support_uswc(bo_flags) &&  	    amdgpu_device_asic_has_dc_support(adev->asic_type))  		domain |= AMDGPU_GEM_DOMAIN_GTT;  #endif | 
