Skip to content

Commit

Permalink
drm/radeon/r600: fix some issues with suspend/resume.
Browse files Browse the repository at this point in the history
a) don't zero gart table on gart enable
b) move pinning shader object into resume path
c) unpin shader object on suspend
d) set cp ready to false after cp shutdown on suspend.

Signed-off-by: Dave Airlie <airlied@redhat.com>
  • Loading branch information
Dave Airlie authored and Dave Airlie committed Sep 18, 2009
1 parent 698443d commit bc1a631
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 16 deletions.
26 changes: 19 additions & 7 deletions drivers/gpu/drm/radeon/r600.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,7 @@ int r600_pcie_gart_enable(struct radeon_device *rdev)
r = radeon_gart_table_vram_pin(rdev);
if (r)
return r;
for (i = 0; i < rdev->gart.num_gpu_pages; i++)
r600_gart_clear_page(rdev, i);

/* Setup L2 cache */
WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
Expand Down Expand Up @@ -1477,6 +1476,14 @@ int r600_resume(struct radeon_device *rdev)
if (r)
return r;
r600_gpu_init(rdev);

r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM,
&rdev->r600_blit.shader_gpu_addr);
if (r) {
DRM_ERROR("failed to pin blit object %d\n", r);
return r;
}

r = radeon_ring_init(rdev, rdev->cp.ring_size);
if (r)
return r;
Expand All @@ -1496,7 +1503,11 @@ int r600_suspend(struct radeon_device *rdev)
{
/* FIXME: we should wait for ring to be empty */
r600_cp_stop(rdev);
rdev->cp.ready = false;

r600_pcie_gart_disable(rdev);
/* unpin shaders bo */
radeon_object_unpin(rdev->r600_blit.shader_obj);
return 0;
}

Expand Down Expand Up @@ -1579,6 +1590,12 @@ int r600_init(struct radeon_device *rdev)
return r;

rdev->accel_working = true;
r = r600_blit_init(rdev);
if (r) {
DRM_ERROR("radeon: failled blitter (%d).\n", r);
return r;
}

r = r600_resume(rdev);
if (r) {
if (rdev->flags & RADEON_IS_AGP) {
Expand All @@ -1595,11 +1612,6 @@ int r600_init(struct radeon_device *rdev)
DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r);
rdev->accel_working = false;
}
r = r600_blit_init(rdev);
if (r) {
DRM_ERROR("radeon: failled blitter (%d).\n", r);
rdev->accel_working = false;
}
r = radeon_ib_test(rdev);
if (r) {
DRM_ERROR("radeon: failled testing IB (%d).\n", r);
Expand Down
11 changes: 2 additions & 9 deletions drivers/gpu/drm/radeon/r600_blit_kms.c
Original file line number Diff line number Diff line change
Expand Up @@ -481,15 +481,8 @@ int r600_blit_init(struct radeon_device *rdev)
return r;
}

r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM,
&rdev->r600_blit.shader_gpu_addr);
if (r) {
DRM_ERROR("failed to pin blit object %d\n", r);
return r;
}

DRM_DEBUG("r6xx blit allocated bo @ 0x%16llx %08x vs %08x ps %08x\n",
rdev->r600_blit.shader_gpu_addr, obj_size,
DRM_DEBUG("r6xx blit allocated bo %08x vs %08x ps %08x\n",
obj_size,
rdev->r600_blit.vs_offset, rdev->r600_blit.ps_offset);

r = radeon_object_kmap(rdev->r600_blit.shader_obj, &ptr);
Expand Down

0 comments on commit bc1a631

Please sign in to comment.