drm/radeon: introduce a sub allocator and convert ib pool to it v4
[cascardo/linux.git] / drivers / gpu / drm / radeon / rs600.c
index 481b99e..ca6d5b6 100644 (file)
@@ -62,6 +62,7 @@ u32 rs600_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
 {
        struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
        u32 tmp = RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset);
+       int i;
 
        /* Lock the graphics update lock */
        tmp |= AVIVO_D1GRPH_UPDATE_LOCK;
@@ -74,7 +75,11 @@ u32 rs600_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
               (u32)crtc_base);
 
        /* Wait for update_pending to go high. */
-       while (!(RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING));
+       for (i = 0; i < rdev->usec_timeout; i++) {
+               if (RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING)
+                       break;
+               udelay(1);
+       }
        DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
 
        /* Unlock the lock, so double-buffering can take place inside vblank */
@@ -544,7 +549,7 @@ int rs600_irq_set(struct radeon_device *rdev)
                WREG32(R_000040_GEN_INT_CNTL, 0);
                return -EINVAL;
        }
-       if (rdev->irq.sw_int) {
+       if (rdev->irq.sw_int[RADEON_RING_TYPE_GFX_INDEX]) {
                tmp |= S_000040_SW_INT_EN(1);
        }
        if (rdev->irq.gui_idle) {
@@ -637,7 +642,7 @@ int rs600_irq_process(struct radeon_device *rdev)
        while (status || rdev->irq.stat_regs.r500.disp_int) {
                /* SW interrupt */
                if (G_000044_SW_INT(status)) {
-                       radeon_fence_process(rdev);
+                       radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
                }
                /* GUI idle */
                if (G_000040_GUI_IDLE(status)) {
@@ -844,6 +849,12 @@ static int rs600_startup(struct radeon_device *rdev)
        if (r)
                return r;
 
+       r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX);
+       if (r) {
+               dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r);
+               return r;
+       }
+
        /* Enable IRQ */
        rs600_irq_set(rdev);
        rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
@@ -853,15 +864,21 @@ static int rs600_startup(struct radeon_device *rdev)
                dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
                return r;
        }
-       r = r100_ib_init(rdev);
+
+       r = r600_audio_init(rdev);
        if (r) {
-               dev_err(rdev->dev, "failed initializing IB (%d).\n", r);
+               dev_err(rdev->dev, "failed initializing audio\n");
                return r;
        }
 
-       r = r600_audio_init(rdev);
+       r = radeon_ib_pool_start(rdev);
+       if (r)
+               return r;
+
+       r = r100_ib_test(rdev);
        if (r) {
-               dev_err(rdev->dev, "failed initializing audio\n");
+               dev_err(rdev->dev, "failed testing IB (%d).\n", r);
+               rdev->accel_working = false;
                return r;
        }
 
@@ -886,11 +903,14 @@ int rs600_resume(struct radeon_device *rdev)
        rv515_clock_startup(rdev);
        /* Initialize surface registers */
        radeon_surface_init(rdev);
+
+       rdev->accel_working = true;
        return rs600_startup(rdev);
 }
 
 int rs600_suspend(struct radeon_device *rdev)
 {
+       radeon_ib_pool_suspend(rdev);
        r600_audio_fini(rdev);
        r100_cp_disable(rdev);
        radeon_wb_disable(rdev);
@@ -971,7 +991,14 @@ int rs600_init(struct radeon_device *rdev)
        if (r)
                return r;
        rs600_set_safe_registers(rdev);
+
+       r = radeon_ib_pool_init(rdev);
        rdev->accel_working = true;
+       if (r) {
+               dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
+               rdev->accel_working = false;
+       }
+
        r = rs600_startup(rdev);
        if (r) {
                /* Somethings want wront with the accel init stop accel */