aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/r600.c
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2011-11-15 11:48:34 -0500
committerDave Airlie <airlied@redhat.com>2011-12-20 14:52:12 -0500
commitb15ba51207e54245409d6f46e20dab36f906eed1 (patch)
treeb34a37395efa5be0a9af4ba5b627e43813713ed3 /drivers/gpu/drm/radeon/r600.c
parent1b37078b7ddf35cab12ac6544187e3636d50c0dc (diff)
drm/radeon: introduce a sub allocator and convert ib pool to it v4
Somewhat specializaed sub-allocator designed to perform sub-allocation for command buffer not only for current cs ioctl but for future command submission ioctl as well. Patch also convert current ib pool to use the sub allocator. Idea is that ib poll buffer can be share with other command buffer submission not having 64K granularity. v2 Harmonize pool handling and add suspend/resume callback to pin/unpin sa bo (tested on rv280, rv370, r420, rv515, rv610, rv710, redwood, cayman, rs480, rs690, rs880) v3 Simplify allocator v4 Fix radeon_ib_get error path to properly free fence Signed-off-by: Jerome Glisse <jglisse@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/r600.c')
-rw-r--r--drivers/gpu/drm/radeon/r600.c43
1 files changed, 22 insertions, 21 deletions
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index 0f39cc661a7e..951566f1de9e 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -2486,6 +2486,17 @@ int r600_startup(struct radeon_device *rdev)
2486 if (r) 2486 if (r)
2487 return r; 2487 return r;
2488 2488
2489 r = radeon_ib_pool_start(rdev);
2490 if (r)
2491 return r;
2492
2493 r = r600_ib_test(rdev, RADEON_RING_TYPE_GFX_INDEX);
2494 if (r) {
2495 DRM_ERROR("radeon: failed testing IB (%d).\n", r);
2496 rdev->accel_working = false;
2497 return r;
2498 }
2499
2489 return 0; 2500 return 0;
2490} 2501}
2491 2502
@@ -2514,18 +2525,13 @@ int r600_resume(struct radeon_device *rdev)
2514 /* post card */ 2525 /* post card */
2515 atom_asic_init(rdev->mode_info.atom_context); 2526 atom_asic_init(rdev->mode_info.atom_context);
2516 2527
2528 rdev->accel_working = true;
2517 r = r600_startup(rdev); 2529 r = r600_startup(rdev);
2518 if (r) { 2530 if (r) {
2519 DRM_ERROR("r600 startup failed on resume\n"); 2531 DRM_ERROR("r600 startup failed on resume\n");
2520 return r; 2532 return r;
2521 } 2533 }
2522 2534
2523 r = r600_ib_test(rdev, RADEON_RING_TYPE_GFX_INDEX);
2524 if (r) {
2525 DRM_ERROR("radeon: failed testing IB (%d).\n", r);
2526 return r;
2527 }
2528
2529 r = r600_audio_init(rdev); 2535 r = r600_audio_init(rdev);
2530 if (r) { 2536 if (r) {
2531 DRM_ERROR("radeon: audio resume failed\n"); 2537 DRM_ERROR("radeon: audio resume failed\n");
@@ -2538,13 +2544,14 @@ int r600_resume(struct radeon_device *rdev)
2538int r600_suspend(struct radeon_device *rdev) 2544int r600_suspend(struct radeon_device *rdev)
2539{ 2545{
2540 r600_audio_fini(rdev); 2546 r600_audio_fini(rdev);
2547 radeon_ib_pool_suspend(rdev);
2548 r600_blit_suspend(rdev);
2541 /* FIXME: we should wait for ring to be empty */ 2549 /* FIXME: we should wait for ring to be empty */
2542 r600_cp_stop(rdev); 2550 r600_cp_stop(rdev);
2543 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false; 2551 rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready = false;
2544 r600_irq_suspend(rdev); 2552 r600_irq_suspend(rdev);
2545 radeon_wb_disable(rdev); 2553 radeon_wb_disable(rdev);
2546 r600_pcie_gart_disable(rdev); 2554 r600_pcie_gart_disable(rdev);
2547 r600_blit_suspend(rdev);
2548 2555
2549 return 0; 2556 return 0;
2550} 2557}
@@ -2625,30 +2632,24 @@ int r600_init(struct radeon_device *rdev)
2625 if (r) 2632 if (r)
2626 return r; 2633 return r;
2627 2634
2635 r = radeon_ib_pool_init(rdev);
2628 rdev->accel_working = true; 2636 rdev->accel_working = true;
2637 if (r) {
2638 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
2639 rdev->accel_working = false;
2640 }
2641
2629 r = r600_startup(rdev); 2642 r = r600_startup(rdev);
2630 if (r) { 2643 if (r) {
2631 dev_err(rdev->dev, "disabling GPU acceleration\n"); 2644 dev_err(rdev->dev, "disabling GPU acceleration\n");
2632 r600_cp_fini(rdev); 2645 r600_cp_fini(rdev);
2633 r600_irq_fini(rdev); 2646 r600_irq_fini(rdev);
2634 radeon_wb_fini(rdev); 2647 radeon_wb_fini(rdev);
2648 r100_ib_fini(rdev);
2635 radeon_irq_kms_fini(rdev); 2649 radeon_irq_kms_fini(rdev);
2636 r600_pcie_gart_fini(rdev); 2650 r600_pcie_gart_fini(rdev);
2637 rdev->accel_working = false; 2651 rdev->accel_working = false;
2638 } 2652 }
2639 if (rdev->accel_working) {
2640 r = radeon_ib_pool_init(rdev);
2641 if (r) {
2642 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
2643 rdev->accel_working = false;
2644 } else {
2645 r = r600_ib_test(rdev, RADEON_RING_TYPE_GFX_INDEX);
2646 if (r) {
2647 dev_err(rdev->dev, "IB test failed (%d).\n", r);
2648 rdev->accel_working = false;
2649 }
2650 }
2651 }
2652 2653
2653 r = r600_audio_init(rdev); 2654 r = r600_audio_init(rdev);
2654 if (r) 2655 if (r)
@@ -2663,7 +2664,7 @@ void r600_fini(struct radeon_device *rdev)
2663 r600_cp_fini(rdev); 2664 r600_cp_fini(rdev);
2664 r600_irq_fini(rdev); 2665 r600_irq_fini(rdev);
2665 radeon_wb_fini(rdev); 2666 radeon_wb_fini(rdev);
2666 radeon_ib_pool_fini(rdev); 2667 r100_ib_fini(rdev);
2667 radeon_irq_kms_fini(rdev); 2668 radeon_irq_kms_fini(rdev);
2668 r600_pcie_gart_fini(rdev); 2669 r600_pcie_gart_fini(rdev);
2669 r600_vram_scratch_fini(rdev); 2670 r600_vram_scratch_fini(rdev);