]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/gpu/drm/radeon/radeon_device.c
drm/radeon/kms: Rework radeon object handling
[net-next-2.6.git] / drivers / gpu / drm / radeon / radeon_device.c
index c962f34c92af6902b8a09777f610544e82e67528..a014ba4cc97c58a2849b180bb6f32ffa234485c3 100644 (file)
@@ -564,6 +564,7 @@ int radeon_device_init(struct radeon_device *rdev,
        mutex_init(&rdev->cp.mutex);
        if (rdev->family >= CHIP_R600)
                spin_lock_init(&rdev->ih.lock);
+       mutex_init(&rdev->gem.mutex);
        rwlock_init(&rdev->fence_drv.lock);
        INIT_LIST_HEAD(&rdev->gem.objects);
 
@@ -653,6 +654,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
 {
        struct radeon_device *rdev = dev->dev_private;
        struct drm_crtc *crtc;
+       int r;
 
        if (dev == NULL || rdev == NULL) {
                return -ENODEV;
@@ -663,18 +665,22 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
        /* unpin the front buffers */
        list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
                struct radeon_framebuffer *rfb = to_radeon_framebuffer(crtc->fb);
-               struct radeon_object *robj;
+               struct radeon_bo *robj;
 
                if (rfb == NULL || rfb->obj == NULL) {
                        continue;
                }
                robj = rfb->obj->driver_private;
-               if (robj != rdev->fbdev_robj) {
-                       radeon_object_unpin(robj);
+               if (robj != rdev->fbdev_rbo) {
+                       r = radeon_bo_reserve(robj, false);
+                       if (unlikely(r == 0)) {
+                               radeon_bo_unpin(robj);
+                               radeon_bo_unreserve(robj);
+                       }
                }
        }
        /* evict vram memory */
-       radeon_object_evict_vram(rdev);
+       radeon_bo_evict_vram(rdev);
        /* wait for gpu to finish processing current batch */
        radeon_fence_wait_last(rdev);
 
@@ -682,7 +688,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
 
        radeon_suspend(rdev);
        /* evict remaining vram memory */
-       radeon_object_evict_vram(rdev);
+       radeon_bo_evict_vram(rdev);
 
        pci_save_state(dev->pdev);
        if (state.event == PM_EVENT_SUSPEND) {