Commit bc1a631e authored by Dave Airlie's avatar Dave Airlie Committed by Dave Airlie

drm/radeon/r600: fix some issues with suspend/resume.

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: default avatarDave Airlie <airlied@redhat.com>
parent 698443d9
...@@ -141,8 +141,7 @@ int r600_pcie_gart_enable(struct radeon_device *rdev) ...@@ -141,8 +141,7 @@ int r600_pcie_gart_enable(struct radeon_device *rdev)
r = radeon_gart_table_vram_pin(rdev); r = radeon_gart_table_vram_pin(rdev);
if (r) if (r)
return r; return r;
for (i = 0; i < rdev->gart.num_gpu_pages; i++)
r600_gart_clear_page(rdev, i);
/* Setup L2 cache */ /* Setup L2 cache */
WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
...@@ -1477,6 +1476,14 @@ int r600_resume(struct radeon_device *rdev) ...@@ -1477,6 +1476,14 @@ int r600_resume(struct radeon_device *rdev)
if (r) if (r)
return r; return r;
r600_gpu_init(rdev); 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); r = radeon_ring_init(rdev, rdev->cp.ring_size);
if (r) if (r)
return r; return r;
...@@ -1496,7 +1503,11 @@ int r600_suspend(struct radeon_device *rdev) ...@@ -1496,7 +1503,11 @@ int r600_suspend(struct radeon_device *rdev)
{ {
/* FIXME: we should wait for ring to be empty */ /* FIXME: we should wait for ring to be empty */
r600_cp_stop(rdev); r600_cp_stop(rdev);
rdev->cp.ready = false;
r600_pcie_gart_disable(rdev); r600_pcie_gart_disable(rdev);
/* unpin shaders bo */
radeon_object_unpin(rdev->r600_blit.shader_obj);
return 0; return 0;
} }
...@@ -1579,6 +1590,12 @@ int r600_init(struct radeon_device *rdev) ...@@ -1579,6 +1590,12 @@ int r600_init(struct radeon_device *rdev)
return r; return r;
rdev->accel_working = true; 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); r = r600_resume(rdev);
if (r) { if (r) {
if (rdev->flags & RADEON_IS_AGP) { if (rdev->flags & RADEON_IS_AGP) {
...@@ -1595,11 +1612,6 @@ int r600_init(struct radeon_device *rdev) ...@@ -1595,11 +1612,6 @@ int r600_init(struct radeon_device *rdev)
DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r); DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r);
rdev->accel_working = false; 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); r = radeon_ib_test(rdev);
if (r) { if (r) {
DRM_ERROR("radeon: failled testing IB (%d).\n", r); DRM_ERROR("radeon: failled testing IB (%d).\n", r);
......
...@@ -481,15 +481,8 @@ int r600_blit_init(struct radeon_device *rdev) ...@@ -481,15 +481,8 @@ int r600_blit_init(struct radeon_device *rdev)
return r; return r;
} }
r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM, DRM_DEBUG("r6xx blit allocated bo %08x vs %08x ps %08x\n",
&rdev->r600_blit.shader_gpu_addr); obj_size,
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,
rdev->r600_blit.vs_offset, rdev->r600_blit.ps_offset); rdev->r600_blit.vs_offset, rdev->r600_blit.ps_offset);
r = radeon_object_kmap(rdev->r600_blit.shader_obj, &ptr); r = radeon_object_kmap(rdev->r600_blit.shader_obj, &ptr);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment