mirror of https://gitee.com/openkylin/linux.git
drm/radeon: Restore GART table contents after pinning it in VRAM v3
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. v2: Add logic to radeon_gart_table_vram_pin directly instead of reinstating radeon_gart_restore v3: Move code after assignment of rdev->gart.table_addr so that the GART TLB flush can work as intended, add code comment explaining why we're doing this Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=85204 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=86267 Reviewed-by: Christian König <christian.koenig@amd.com> Cc: stable@vger.kernel.org Signed-off-by: Michel Dänzer <michel.daenzer@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
cb65890610
commit
5636d2f842
|
@ -165,6 +165,19 @@ int radeon_gart_table_vram_pin(struct radeon_device *rdev)
|
|||
radeon_bo_unpin(rdev->gart.robj);
|
||||
radeon_bo_unreserve(rdev->gart.robj);
|
||||
rdev->gart.table_addr = gpu_addr;
|
||||
|
||||
if (!r) {
|
||||
int i;
|
||||
|
||||
/* We might have dropped some GART table updates while it wasn't
|
||||
* mapped, restore all entries
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue