From: Michel Dänzer michel.daenzer@amd.com
The GART table BO has to be moved out of VRAM for suspend/resume. Any updates to the GART table during that time were silently dropped without this change. This caused GPU lockups on resume in some cases, see the bug reports referenced below.
This might also make GPU reset more robust in some cases, as we no longer rely on the GART table in VRAM being preserved across the GPU lockup/reset.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=85204 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=86267 Cc: stable@vger.kernel.org Signed-off-by: Michel Dänzer michel.daenzer@amd.com ---
v2: Add logic to radeon_gart_table_vram_pin directly instead of reinstating radeon_gart_restore function
drivers/gpu/drm/radeon/radeon_gart.c | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c index a530932..0c8c739 100644 --- a/drivers/gpu/drm/radeon/radeon_gart.c +++ b/drivers/gpu/drm/radeon/radeon_gart.c @@ -163,6 +163,14 @@ int radeon_gart_table_vram_pin(struct radeon_device *rdev) r = radeon_bo_kmap(rdev->gart.robj, &rdev->gart.ptr); if (r) radeon_bo_unpin(rdev->gart.robj); + else { + int i; + + for (i = 0; i < rdev->gart.num_gpu_pages; i++) + radeon_gart_set_page(rdev, i, rdev->gart.pages_entry[i]); + mb(); + radeon_gart_tlb_flush(rdev); + } radeon_bo_unreserve(rdev->gart.robj); rdev->gart.table_addr = gpu_addr; return r;