aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/r420.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/r420.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/r420.c')
-rw-r--r--drivers/gpu/drm/radeon/r420.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c
index 17ecff1000e7..666e28fe509c 100644
--- a/drivers/gpu/drm/radeon/r420.c
+++ b/drivers/gpu/drm/radeon/r420.c
@@ -274,11 +274,18 @@ static int r420_startup(struct radeon_device *rdev)
274 return r; 274 return r;
275 } 275 }
276 r420_cp_errata_init(rdev); 276 r420_cp_errata_init(rdev);
277 r = r100_ib_init(rdev); 277
278 r = radeon_ib_pool_start(rdev);
279 if (r)
280 return r;
281
282 r = r100_ib_test(rdev);
278 if (r) { 283 if (r) {
279 dev_err(rdev->dev, "failed initializing IB (%d).\n", r); 284 dev_err(rdev->dev, "failed testing IB (%d).\n", r);
285 rdev->accel_working = false;
280 return r; 286 return r;
281 } 287 }
288
282 return 0; 289 return 0;
283} 290}
284 291
@@ -307,11 +314,14 @@ int r420_resume(struct radeon_device *rdev)
307 r420_clock_resume(rdev); 314 r420_clock_resume(rdev);
308 /* Initialize surface registers */ 315 /* Initialize surface registers */
309 radeon_surface_init(rdev); 316 radeon_surface_init(rdev);
317
318 rdev->accel_working = true;
310 return r420_startup(rdev); 319 return r420_startup(rdev);
311} 320}
312 321
313int r420_suspend(struct radeon_device *rdev) 322int r420_suspend(struct radeon_device *rdev)
314{ 323{
324 radeon_ib_pool_suspend(rdev);
315 r420_cp_errata_fini(rdev); 325 r420_cp_errata_fini(rdev);
316 r100_cp_disable(rdev); 326 r100_cp_disable(rdev);
317 radeon_wb_disable(rdev); 327 radeon_wb_disable(rdev);
@@ -424,7 +434,14 @@ int r420_init(struct radeon_device *rdev)
424 return r; 434 return r;
425 } 435 }
426 r420_set_reg_safe(rdev); 436 r420_set_reg_safe(rdev);
437
438 r = radeon_ib_pool_init(rdev);
427 rdev->accel_working = true; 439 rdev->accel_working = true;
440 if (r) {
441 dev_err(rdev->dev, "IB initialization failed (%d).\n", r);
442 rdev->accel_working = false;
443 }
444
428 r = r420_startup(rdev); 445 r = r420_startup(rdev);
429 if (r) { 446 if (r) {
430 /* Somethings want wront with the accel init stop accel */ 447 /* Somethings want wront with the accel init stop accel */