Am 22.01.2015 um 10:58 schrieb Michel Dänzer: > From: Michel Dänzer <michel.daenzer at 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. > > 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 > Cc: stable at vger.kernel.org > Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
This one and the two others in the series are Reviewed-by: Christian König <christian.koenig at amd.com> > --- > drivers/gpu/drm/radeon/radeon_gart.c | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/drivers/gpu/drm/radeon/radeon_gart.c > b/drivers/gpu/drm/radeon/radeon_gart.c > index a530932..c7be612 100644 > --- a/drivers/gpu/drm/radeon/radeon_gart.c > +++ b/drivers/gpu/drm/radeon/radeon_gart.c > @@ -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; > } >