drm/radeon: also try GART for CPU accessed buffers
Placing them exclusively into VRAM might not work all the time. Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=78297 Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org
This commit is contained in:
Родитель
4ba4801d73
Коммит
544092596e
|
@ -699,22 +699,30 @@ int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
|
||||||
rbo = container_of(bo, struct radeon_bo, tbo);
|
rbo = container_of(bo, struct radeon_bo, tbo);
|
||||||
radeon_bo_check_tiling(rbo, 0, 0);
|
radeon_bo_check_tiling(rbo, 0, 0);
|
||||||
rdev = rbo->rdev;
|
rdev = rbo->rdev;
|
||||||
if (bo->mem.mem_type == TTM_PL_VRAM) {
|
if (bo->mem.mem_type != TTM_PL_VRAM)
|
||||||
|
return 0;
|
||||||
|
|
||||||
size = bo->mem.num_pages << PAGE_SHIFT;
|
size = bo->mem.num_pages << PAGE_SHIFT;
|
||||||
offset = bo->mem.start << PAGE_SHIFT;
|
offset = bo->mem.start << PAGE_SHIFT;
|
||||||
if ((offset + size) > rdev->mc.visible_vram_size) {
|
if ((offset + size) <= rdev->mc.visible_vram_size)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* hurrah the memory is not visible ! */
|
/* hurrah the memory is not visible ! */
|
||||||
radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_VRAM);
|
radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_VRAM);
|
||||||
rbo->placement.lpfn = rdev->mc.visible_vram_size >> PAGE_SHIFT;
|
rbo->placement.lpfn = rdev->mc.visible_vram_size >> PAGE_SHIFT;
|
||||||
r = ttm_bo_validate(bo, &rbo->placement, false, false);
|
r = ttm_bo_validate(bo, &rbo->placement, false, false);
|
||||||
if (unlikely(r != 0))
|
if (unlikely(r == -ENOMEM)) {
|
||||||
|
radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT);
|
||||||
|
return ttm_bo_validate(bo, &rbo->placement, false, false);
|
||||||
|
} else if (unlikely(r != 0)) {
|
||||||
return r;
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
offset = bo->mem.start << PAGE_SHIFT;
|
offset = bo->mem.start << PAGE_SHIFT;
|
||||||
/* this should not happen */
|
/* this should never happen */
|
||||||
if ((offset + size) > rdev->mc.visible_vram_size)
|
if ((offset + size) > rdev->mc.visible_vram_size)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче