drm/radeon: move radeon_ib_ring_tests out of chipset code
[deliverable/linux.git] / drivers / gpu / drm / radeon / radeon_device.c
index 066c98b888a51b4409323d5300863cf9b9fd7381..bbd09718e9568e6df253807e2e343e7039b7d588 100644 (file)
@@ -728,20 +728,20 @@ int radeon_device_init(struct radeon_device *rdev,
 
        /* mutex initialization are all done here so we
         * can recall function without having locking issues */
-       radeon_mutex_init(&rdev->cs_mutex);
        mutex_init(&rdev->ring_lock);
        mutex_init(&rdev->dc_hw_i2c_mutex);
-       if (rdev->family >= CHIP_R600)
-               spin_lock_init(&rdev->ih.lock);
+       atomic_set(&rdev->ih.lock, 0);
        mutex_init(&rdev->gem.mutex);
        mutex_init(&rdev->pm.mutex);
-       mutex_init(&rdev->vram_mutex);
+       init_rwsem(&rdev->pm.mclk_lock);
+       init_rwsem(&rdev->exclusive_lock);
        init_waitqueue_head(&rdev->irq.vblank_queue);
        init_waitqueue_head(&rdev->irq.idle_queue);
        r = radeon_gem_init(rdev);
        if (r)
                return r;
        /* initialize vm here */
+       mutex_init(&rdev->vm_manager.lock);
        rdev->vm_manager.use_bitmap = 1;
        rdev->vm_manager.max_pfn = 1 << 20;
        INIT_LIST_HEAD(&rdev->vm_manager.lru_vm);
@@ -822,6 +822,10 @@ int radeon_device_init(struct radeon_device *rdev,
        if (r)
                return r;
 
+       r = radeon_ib_ring_tests(rdev);
+       if (r)
+               DRM_ERROR("ib ring test failed (%d).\n", r);
+
        if (rdev->flags & RADEON_IS_AGP && !rdev->accel_working) {
                /* Acceleration not working on AGP card try again
                 * with fallback to PCI or PCIE GART
@@ -946,6 +950,7 @@ int radeon_resume_kms(struct drm_device *dev)
 {
        struct drm_connector *connector;
        struct radeon_device *rdev = dev->dev_private;
+       int r;
 
        if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
                return 0;
@@ -960,6 +965,11 @@ int radeon_resume_kms(struct drm_device *dev)
        /* resume AGP if in use */
        radeon_agp_resume(rdev);
        radeon_resume(rdev);
+
+       r = radeon_ib_ring_tests(rdev);
+       if (r)
+               DRM_ERROR("ib ring test failed (%d).\n", r);
+
        radeon_pm_resume(rdev);
        radeon_restore_bios_scratch_regs(rdev);
 
@@ -989,6 +999,7 @@ int radeon_gpu_reset(struct radeon_device *rdev)
        int r;
        int resched;
 
+       down_write(&rdev->exclusive_lock);
        radeon_save_bios_scratch_regs(rdev);
        /* block TTM */
        resched = ttm_bo_lock_delayed_workqueue(&rdev->mman.bdev);
@@ -998,6 +1009,11 @@ int radeon_gpu_reset(struct radeon_device *rdev)
        if (!r) {
                dev_info(rdev->dev, "GPU reset succeed\n");
                radeon_resume(rdev);
+
+               r = radeon_ib_ring_tests(rdev);
+               if (r)
+                       DRM_ERROR("ib ring test failed (%d).\n", r);
+
                radeon_restore_bios_scratch_regs(rdev);
                drm_helper_resume_force_mode(rdev->ddev);
                ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched);
@@ -1008,6 +1024,7 @@ int radeon_gpu_reset(struct radeon_device *rdev)
                dev_info(rdev->dev, "GPU reset failed\n");
        }
 
+       up_write(&rdev->exclusive_lock);
        return r;
 }
 
This page took 0.052674 seconds and 5 git commands to generate.