drm/radeon/r600: fix some issues with suspend/resume.
authorDave Airlie <airlied@linux.ie>
Tue, 15 Sep 2009 01:07:52 +0000 (11:07 +1000)
committerDave Airlie <airlied@redhat.com>
Fri, 18 Sep 2009 06:17:30 +0000 (16:17 +1000)
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>
drivers/gpu/drm/radeon/r600.c
drivers/gpu/drm/radeon/r600_blit_kms.c

index aafdb8edc11d4daf5c48d2c99f24923a4f216842..9844783cd8d7a2b84776ac09aa79c1de9e2a82d1 100644 (file)
@@ -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 |
@@ -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;
@@ -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;
 }
 
@@ -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) {
@@ -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);
index 1287f4d3fb211d33503ba3286cf69b432e4f7d7c..0a6f4681f468025dc0712d66c729cd4c7a40a90c 100644 (file)
@@ -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);