aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/r300.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/r300.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/r300.c')
-rw-r--r--drivers/gpu/drm/radeon/r300.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c
index e2dfae4b40e6..8ad5c6475d55 100644
--- a/drivers/gpu/drm/radeon/r300.c
+++ b/drivers/gpu/drm/radeon/r300.c
@@ -1414,11 +1414,18 @@ static int r300_startup(struct radeon_device *rdev)
1414 dev_err(rdev->dev, "failed initializing CP (%d).\n", r); 1414 dev_err(rdev->dev, "failed initializing CP (%d).\n", r);
1415 return r; 1415 return r;
1416 } 1416 }
1417 r = r100_ib_init(rdev); 1417
1418 r = radeon_ib_pool_start(rdev);
1419 if (r)
1420 return r;
1421
1422 r = r100_ib_test(rdev);
1418 if (r) { 1423 if (r) {
1419 dev_err(rdev->dev, "failed initializing IB (%d).\n", r); 1424 dev_err(rdev->dev, "failed testing IB (%d).\n", r);
1425 rdev->accel_working = false;
1420 return r; 1426 return r;
1421 } 1427 }
1428
1422 return 0; 1429 return 0;
1423} 1430}
1424 1431
@@ -1443,11 +1450,14 @@ int r300_resume(struct radeon_device *rdev)
1443 r300_clock_startup(rdev); 1450 r300_clock_startup(rdev);
1444 /* Initialize surface registers */ 1451 /* Initialize surface registers */
1445 radeon_surface_init(rdev); 1452 radeon_surface_init(rdev);
1453
1454 rdev->accel_working = true;
1446 return r300_startup(rdev); 1455 return r300_startup(rdev);
1447} 1456}
1448 1457
1449int r300_suspend(struct radeon_device *rdev) 1458int r300_suspend(struct radeon_device *rdev)
1450{ 1459{
1460 radeon_ib_pool_suspend(rdev);
1451 r100_cp_disable(rdev); 1461 r100_cp_disable(rdev);
1452 radeon_wb_disable(rdev); 1462 radeon_wb_disable(rdev);
1453 r100_irq_disable(rdev); 1463 r100_irq_disable(rdev);
@@ -1548,7 +1558,14 @@ int r300_init(struct radeon_device *rdev)
1548 return r; 1558 return r;
1549 } 1559 }
1550 r300_set_reg_safe(rdev); 1560 r300_set_reg_safe(rdev);
1561
1562 r = radeon_ib_pool_init(rdev);
1551 rdev->accel_working = true; 1563 rdev->accel_working = true;
1564 if (r) {
1565 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
1566 rdev->accel_working = false;
1567 }
1568
1552 r = r300_startup(rdev); 1569 r = r300_startup(rdev);
1553 if (r) { 1570 if (r) {
1554 /* Somethings want wront with the accel init stop accel */ 1571 /* Somethings want wront with the accel init stop accel */