]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/gpu/drm/radeon/ni.c
drm/radeon: disable compute rings on cayman for now
[mv-sheeva.git] / drivers / gpu / drm / radeon / ni.c
index fdb93f88457533046819ef1c0082994ad42d3954..7c953579a405c2e58766bdf44420a07374bd88c1 100644 (file)
@@ -262,8 +262,11 @@ int ni_mc_load_microcode(struct radeon_device *rdev)
                WREG32(MC_SEQ_SUP_CNTL, 0x00000001);
 
                /* wait for training to complete */
-               while (!(RREG32(MC_IO_PAD_CNTL_D0) & MEM_FALL_OUT_CMD))
-                       udelay(10);
+               for (i = 0; i < rdev->usec_timeout; i++) {
+                       if (RREG32(MC_IO_PAD_CNTL_D0) & MEM_FALL_OUT_CMD)
+                               break;
+                       udelay(1);
+               }
 
                if (running)
                        WREG32(MC_SHARED_BLACKOUT_CNTL, blackout);
@@ -933,7 +936,7 @@ int cayman_pcie_gart_enable(struct radeon_device *rdev)
 {
        int r;
 
-       if (rdev->gart.table.vram.robj == NULL) {
+       if (rdev->gart.robj == NULL) {
                dev_err(rdev->dev, "No VRAM object for PCIE GART.\n");
                return -EINVAL;
        }
@@ -978,8 +981,6 @@ int cayman_pcie_gart_enable(struct radeon_device *rdev)
 
 void cayman_pcie_gart_disable(struct radeon_device *rdev)
 {
-       int r;
-
        /* Disable all tables */
        WREG32(VM_CONTEXT0_CNTL, 0);
        WREG32(VM_CONTEXT1_CNTL, 0);
@@ -995,14 +996,7 @@ void cayman_pcie_gart_disable(struct radeon_device *rdev)
        WREG32(VM_L2_CNTL2, 0);
        WREG32(VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY |
               L2_CACHE_BIGK_FRAGMENT_SIZE(6));
-       if (rdev->gart.table.vram.robj) {
-               r = radeon_bo_reserve(rdev->gart.table.vram.robj, false);
-               if (likely(r == 0)) {
-                       radeon_bo_kunmap(rdev->gart.table.vram.robj);
-                       radeon_bo_unpin(rdev->gart.table.vram.robj);
-                       radeon_bo_unreserve(rdev->gart.table.vram.robj);
-               }
-       }
+       radeon_gart_table_vram_unpin(rdev);
 }
 
 void cayman_pcie_gart_fini(struct radeon_device *rdev)
@@ -1055,63 +1049,64 @@ static int cayman_cp_load_microcode(struct radeon_device *rdev)
 
 static int cayman_cp_start(struct radeon_device *rdev)
 {
+       struct radeon_cp *cp = &rdev->cp[RADEON_RING_TYPE_GFX_INDEX];
        int r, i;
 
-       r = radeon_ring_lock(rdev, 7);
+       r = radeon_ring_lock(rdev, cp, 7);
        if (r) {
                DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
                return r;
        }
-       radeon_ring_write(rdev, PACKET3(PACKET3_ME_INITIALIZE, 5));
-       radeon_ring_write(rdev, 0x1);
-       radeon_ring_write(rdev, 0x0);
-       radeon_ring_write(rdev, rdev->config.cayman.max_hw_contexts - 1);
-       radeon_ring_write(rdev, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
-       radeon_ring_write(rdev, 0);
-       radeon_ring_write(rdev, 0);
-       radeon_ring_unlock_commit(rdev);
+       radeon_ring_write(cp, PACKET3(PACKET3_ME_INITIALIZE, 5));
+       radeon_ring_write(cp, 0x1);
+       radeon_ring_write(cp, 0x0);
+       radeon_ring_write(cp, rdev->config.cayman.max_hw_contexts - 1);
+       radeon_ring_write(cp, PACKET3_ME_INITIALIZE_DEVICE_ID(1));
+       radeon_ring_write(cp, 0);
+       radeon_ring_write(cp, 0);
+       radeon_ring_unlock_commit(rdev, cp);
 
        cayman_cp_enable(rdev, true);
 
-       r = radeon_ring_lock(rdev, cayman_default_size + 19);
+       r = radeon_ring_lock(rdev, cp, cayman_default_size + 19);
        if (r) {
                DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r);
                return r;
        }
 
        /* setup clear context state */
-       radeon_ring_write(rdev, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
-       radeon_ring_write(rdev, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
+       radeon_ring_write(cp, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
+       radeon_ring_write(cp, PACKET3_PREAMBLE_BEGIN_CLEAR_STATE);
 
        for (i = 0; i < cayman_default_size; i++)
-               radeon_ring_write(rdev, cayman_default_state[i]);
+               radeon_ring_write(cp, cayman_default_state[i]);
 
-       radeon_ring_write(rdev, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
-       radeon_ring_write(rdev, PACKET3_PREAMBLE_END_CLEAR_STATE);
+       radeon_ring_write(cp, PACKET3(PACKET3_PREAMBLE_CNTL, 0));
+       radeon_ring_write(cp, PACKET3_PREAMBLE_END_CLEAR_STATE);
 
        /* set clear context state */
-       radeon_ring_write(rdev, PACKET3(PACKET3_CLEAR_STATE, 0));
-       radeon_ring_write(rdev, 0);
+       radeon_ring_write(cp, PACKET3(PACKET3_CLEAR_STATE, 0));
+       radeon_ring_write(cp, 0);
 
        /* SQ_VTX_BASE_VTX_LOC */
-       radeon_ring_write(rdev, 0xc0026f00);
-       radeon_ring_write(rdev, 0x00000000);
-       radeon_ring_write(rdev, 0x00000000);
-       radeon_ring_write(rdev, 0x00000000);
+       radeon_ring_write(cp, 0xc0026f00);
+       radeon_ring_write(cp, 0x00000000);
+       radeon_ring_write(cp, 0x00000000);
+       radeon_ring_write(cp, 0x00000000);
 
        /* Clear consts */
-       radeon_ring_write(rdev, 0xc0036f00);
-       radeon_ring_write(rdev, 0x00000bc4);
-       radeon_ring_write(rdev, 0xffffffff);
-       radeon_ring_write(rdev, 0xffffffff);
-       radeon_ring_write(rdev, 0xffffffff);
+       radeon_ring_write(cp, 0xc0036f00);
+       radeon_ring_write(cp, 0x00000bc4);
+       radeon_ring_write(cp, 0xffffffff);
+       radeon_ring_write(cp, 0xffffffff);
+       radeon_ring_write(cp, 0xffffffff);
 
-       radeon_ring_write(rdev, 0xc0026900);
-       radeon_ring_write(rdev, 0x00000316);
-       radeon_ring_write(rdev, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
-       radeon_ring_write(rdev, 0x00000010); /*  */
+       radeon_ring_write(cp, 0xc0026900);
+       radeon_ring_write(cp, 0x00000316);
+       radeon_ring_write(cp, 0x0000000e); /* VGT_VERTEX_REUSE_BLOCK_CNTL */
+       radeon_ring_write(cp, 0x00000010); /*  */
 
-       radeon_ring_unlock_commit(rdev);
+       radeon_ring_unlock_commit(rdev, cp);
 
        /* XXX init other rings */
 
@@ -1121,11 +1116,12 @@ static int cayman_cp_start(struct radeon_device *rdev)
 static void cayman_cp_fini(struct radeon_device *rdev)
 {
        cayman_cp_enable(rdev, false);
-       radeon_ring_fini(rdev);
+       radeon_ring_fini(rdev, &rdev->cp[RADEON_RING_TYPE_GFX_INDEX]);
 }
 
 int cayman_cp_resume(struct radeon_device *rdev)
 {
+       struct radeon_cp *cp;
        u32 tmp;
        u32 rb_bufsz;
        int r;
@@ -1142,7 +1138,7 @@ int cayman_cp_resume(struct radeon_device *rdev)
        WREG32(GRBM_SOFT_RESET, 0);
        RREG32(GRBM_SOFT_RESET);
 
-       WREG32(CP_SEM_WAIT_TIMER, 0x4);
+       WREG32(CP_SEM_WAIT_TIMER, 0x0);
 
        /* Set the write pointer delay */
        WREG32(CP_RB_WPTR_DELAY, 0);
@@ -1151,7 +1147,8 @@ int cayman_cp_resume(struct radeon_device *rdev)
 
        /* ring 0 - compute and gfx */
        /* Set ring buffer size */
-       rb_bufsz = drm_order(rdev->cp.ring_size / 8);
+       cp = &rdev->cp[RADEON_RING_TYPE_GFX_INDEX];
+       rb_bufsz = drm_order(cp->ring_size / 8);
        tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
 #ifdef __BIG_ENDIAN
        tmp |= BUF_SWAP_32BIT;
@@ -1160,8 +1157,8 @@ int cayman_cp_resume(struct radeon_device *rdev)
 
        /* Initialize the ring buffer's read and write pointers */
        WREG32(CP_RB0_CNTL, tmp | RB_RPTR_WR_ENA);
-       rdev->cp.wptr = 0;
-       WREG32(CP_RB0_WPTR, rdev->cp.wptr);
+       cp->wptr = 0;
+       WREG32(CP_RB0_WPTR, cp->wptr);
 
        /* set the wb address wether it's enabled or not */
        WREG32(CP_RB0_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC);
@@ -1178,13 +1175,14 @@ int cayman_cp_resume(struct radeon_device *rdev)
        mdelay(1);
        WREG32(CP_RB0_CNTL, tmp);
 
-       WREG32(CP_RB0_BASE, rdev->cp.gpu_addr >> 8);
+       WREG32(CP_RB0_BASE, cp->gpu_addr >> 8);
 
-       rdev->cp.rptr = RREG32(CP_RB0_RPTR);
+       cp->rptr = RREG32(CP_RB0_RPTR);
 
        /* ring1  - compute only */
        /* Set ring buffer size */
-       rb_bufsz = drm_order(rdev->cp1.ring_size / 8);
+       cp = &rdev->cp[CAYMAN_RING_TYPE_CP1_INDEX];
+       rb_bufsz = drm_order(cp->ring_size / 8);
        tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
 #ifdef __BIG_ENDIAN
        tmp |= BUF_SWAP_32BIT;
@@ -1193,8 +1191,8 @@ int cayman_cp_resume(struct radeon_device *rdev)
 
        /* Initialize the ring buffer's read and write pointers */
        WREG32(CP_RB1_CNTL, tmp | RB_RPTR_WR_ENA);
-       rdev->cp1.wptr = 0;
-       WREG32(CP_RB1_WPTR, rdev->cp1.wptr);
+       cp->wptr = 0;
+       WREG32(CP_RB1_WPTR, cp->wptr);
 
        /* set the wb address wether it's enabled or not */
        WREG32(CP_RB1_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP1_RPTR_OFFSET) & 0xFFFFFFFC);
@@ -1203,13 +1201,14 @@ int cayman_cp_resume(struct radeon_device *rdev)
        mdelay(1);
        WREG32(CP_RB1_CNTL, tmp);
 
-       WREG32(CP_RB1_BASE, rdev->cp1.gpu_addr >> 8);
+       WREG32(CP_RB1_BASE, cp->gpu_addr >> 8);
 
-       rdev->cp1.rptr = RREG32(CP_RB1_RPTR);
+       cp->rptr = RREG32(CP_RB1_RPTR);
 
        /* ring2 - compute only */
        /* Set ring buffer size */
-       rb_bufsz = drm_order(rdev->cp2.ring_size / 8);
+       cp = &rdev->cp[CAYMAN_RING_TYPE_CP2_INDEX];
+       rb_bufsz = drm_order(cp->ring_size / 8);
        tmp = (drm_order(RADEON_GPU_PAGE_SIZE/8) << 8) | rb_bufsz;
 #ifdef __BIG_ENDIAN
        tmp |= BUF_SWAP_32BIT;
@@ -1218,8 +1217,8 @@ int cayman_cp_resume(struct radeon_device *rdev)
 
        /* Initialize the ring buffer's read and write pointers */
        WREG32(CP_RB2_CNTL, tmp | RB_RPTR_WR_ENA);
-       rdev->cp2.wptr = 0;
-       WREG32(CP_RB2_WPTR, rdev->cp2.wptr);
+       cp->wptr = 0;
+       WREG32(CP_RB2_WPTR, cp->wptr);
 
        /* set the wb address wether it's enabled or not */
        WREG32(CP_RB2_RPTR_ADDR, (rdev->wb.gpu_addr + RADEON_WB_CP2_RPTR_OFFSET) & 0xFFFFFFFC);
@@ -1228,28 +1227,28 @@ int cayman_cp_resume(struct radeon_device *rdev)
        mdelay(1);
        WREG32(CP_RB2_CNTL, tmp);
 
-       WREG32(CP_RB2_BASE, rdev->cp2.gpu_addr >> 8);
+       WREG32(CP_RB2_BASE, cp->gpu_addr >> 8);
 
-       rdev->cp2.rptr = RREG32(CP_RB2_RPTR);
+       cp->rptr = RREG32(CP_RB2_RPTR);
 
        /* start the rings */
        cayman_cp_start(rdev);
-       rdev->cp.ready = true;
-       rdev->cp1.ready = true;
-       rdev->cp2.ready = true;
+       rdev->cp[RADEON_RING_TYPE_GFX_INDEX].ready = true;
+       rdev->cp[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
+       rdev->cp[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
        /* this only test cp0 */
-       r = radeon_ring_test(rdev);
+       r = radeon_ring_test(rdev, &rdev->cp[RADEON_RING_TYPE_GFX_INDEX]);
        if (r) {
-               rdev->cp.ready = false;
-               rdev->cp1.ready = false;
-               rdev->cp2.ready = false;
+               rdev->cp[RADEON_RING_TYPE_GFX_INDEX].ready = false;
+               rdev->cp[CAYMAN_RING_TYPE_CP1_INDEX].ready = false;
+               rdev->cp[CAYMAN_RING_TYPE_CP2_INDEX].ready = false;
                return r;
        }
 
        return 0;
 }
 
-bool cayman_gpu_is_lockup(struct radeon_device *rdev)
+bool cayman_gpu_is_lockup(struct radeon_device *rdev, struct radeon_cp *cp)
 {
        u32 srbm_status;
        u32 grbm_status;
@@ -1262,20 +1261,20 @@ bool cayman_gpu_is_lockup(struct radeon_device *rdev)
        grbm_status_se0 = RREG32(GRBM_STATUS_SE0);
        grbm_status_se1 = RREG32(GRBM_STATUS_SE1);
        if (!(grbm_status & GUI_ACTIVE)) {
-               r100_gpu_lockup_update(lockup, &rdev->cp);
+               r100_gpu_lockup_update(lockup, cp);
                return false;
        }
        /* force CP activities */
-       r = radeon_ring_lock(rdev, 2);
+       r = radeon_ring_lock(rdev, cp, 2);
        if (!r) {
                /* PACKET2 NOP */
-               radeon_ring_write(rdev, 0x80000000);
-               radeon_ring_write(rdev, 0x80000000);
-               radeon_ring_unlock_commit(rdev);
+               radeon_ring_write(cp, 0x80000000);
+               radeon_ring_write(cp, 0x80000000);
+               radeon_ring_unlock_commit(rdev, cp);
        }
        /* XXX deal with CP0,1,2 */
-       rdev->cp.rptr = RREG32(CP_RB0_RPTR);
-       return r100_gpu_cp_is_lockup(rdev, lockup, &rdev->cp);
+       cp->rptr = RREG32(cp->rptr_reg);
+       return r100_gpu_cp_is_lockup(rdev, lockup, cp);
 }
 
 static int cayman_gpu_soft_reset(struct radeon_device *rdev)
@@ -1344,6 +1343,7 @@ int cayman_asic_reset(struct radeon_device *rdev)
 
 static int cayman_startup(struct radeon_device *rdev)
 {
+       struct radeon_cp *cp = &rdev->cp[RADEON_RING_TYPE_GFX_INDEX];
        int r;
 
        /* enable pcie gen2 link */
@@ -1362,6 +1362,10 @@ static int cayman_startup(struct radeon_device *rdev)
                return r;
        }
 
+       r = r600_vram_scratch_init(rdev);
+       if (r)
+               return r;
+
        evergreen_mc_program(rdev);
        r = cayman_pcie_gart_enable(rdev);
        if (r)
@@ -1389,7 +1393,8 @@ static int cayman_startup(struct radeon_device *rdev)
        }
        evergreen_irq_set(rdev);
 
-       r = radeon_ring_init(rdev, rdev->cp.ring_size);
+       r = radeon_ring_init(rdev, cp, cp->ring_size, RADEON_WB_CP_RPTR_OFFSET,
+                            CP_RB0_RPTR, CP_RB0_WPTR);
        if (r)
                return r;
        r = cayman_cp_load_microcode(rdev);
@@ -1419,7 +1424,7 @@ int cayman_resume(struct radeon_device *rdev)
                return r;
        }
 
-       r = r600_ib_test(rdev);
+       r = r600_ib_test(rdev, RADEON_RING_TYPE_GFX_INDEX);
        if (r) {
                DRM_ERROR("radeon: failled testing IB (%d).\n", r);
                return r;
@@ -1433,7 +1438,7 @@ int cayman_suspend(struct radeon_device *rdev)
 {
        /* FIXME: we should wait for ring to be empty */
        cayman_cp_enable(rdev, false);
-       rdev->cp.ready = false;
+       rdev->cp[RADEON_RING_TYPE_GFX_INDEX].ready = false;
        evergreen_irq_suspend(rdev);
        radeon_wb_disable(rdev);
        cayman_pcie_gart_disable(rdev);
@@ -1450,6 +1455,7 @@ int cayman_suspend(struct radeon_device *rdev)
  */
 int cayman_init(struct radeon_device *rdev)
 {
+       struct radeon_cp *cp = &rdev->cp[RADEON_RING_TYPE_GFX_INDEX];
        int r;
 
        /* This don't do much */
@@ -1486,7 +1492,7 @@ int cayman_init(struct radeon_device *rdev)
        /* Initialize clocks */
        radeon_get_clock_info(rdev->ddev);
        /* Fence driver */
-       r = radeon_fence_driver_init(rdev);
+       r = radeon_fence_driver_init(rdev, 3);
        if (r)
                return r;
        /* initialize memory controller */
@@ -1502,8 +1508,8 @@ int cayman_init(struct radeon_device *rdev)
        if (r)
                return r;
 
-       rdev->cp.ring_obj = NULL;
-       r600_ring_init(rdev, 1024 * 1024);
+       cp->ring_obj = NULL;
+       r600_ring_init(rdev, cp, 1024 * 1024);
 
        rdev->ih.ring_obj = NULL;
        r600_ih_ring_init(rdev, 64 * 1024);
@@ -1529,7 +1535,7 @@ int cayman_init(struct radeon_device *rdev)
                        DRM_ERROR("radeon: failed initializing IB pool (%d).\n", r);
                        rdev->accel_working = false;
                }
-               r = r600_ib_test(rdev);
+               r = r600_ib_test(rdev, RADEON_RING_TYPE_GFX_INDEX);
                if (r) {
                        DRM_ERROR("radeon: failed testing IB (%d).\n", r);
                        rdev->accel_working = false;
@@ -1557,7 +1563,9 @@ void cayman_fini(struct radeon_device *rdev)
        radeon_ib_pool_fini(rdev);
        radeon_irq_kms_fini(rdev);
        cayman_pcie_gart_fini(rdev);
+       r600_vram_scratch_fini(rdev);
        radeon_gem_fini(rdev);
+       radeon_semaphore_driver_fini(rdev);
        radeon_fence_driver_fini(rdev);
        radeon_bo_fini(rdev);
        radeon_atombios_fini(rdev);