aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2010-04-09 08:39:24 -0400
committerDave Airlie <airlied@redhat.com>2010-04-20 00:12:22 -0400
commit0a2d50e3a8faaf36cde36920431586090411ea15 (patch)
treed002e9418728c091a012546f5cc86973fdde70bd /drivers
parent82c5da6bf8b55a931b042fb531083863d26c8020 (diff)
drm/radeon/kms: add support for new fault callback V7
This add the support for the new fault callback and also the infrastructure for supporting unmappable VRAM. V2 validate BO with no_wait = true V3 don't derefence bo->mem.mm_node as it's not NULL only for VRAM or GTT V4 update to splitted no_wait ttm change V5 update to new balanced io_mem_reserve/free change V6 callback is responsible for iomapping memory V7 move back iomapping to ttm Signed-off-by: Jerome Glisse <jglisse@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/radeon/radeon_object.c26
-rw-r--r--drivers/gpu/drm/radeon/radeon_object.h2
-rw-r--r--drivers/gpu/drm/radeon/radeon_ttm.c51
3 files changed, 72 insertions, 7 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 4b441f87f47a..57b3f95c0efa 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -498,11 +498,33 @@ void radeon_bo_move_notify(struct ttm_buffer_object *bo,
498 radeon_bo_check_tiling(rbo, 0, 1); 498 radeon_bo_check_tiling(rbo, 0, 1);
499} 499}
500 500
501void radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo) 501int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
502{ 502{
503 struct radeon_device *rdev;
503 struct radeon_bo *rbo; 504 struct radeon_bo *rbo;
505 unsigned long offset, size;
506 int r;
507
504 if (!radeon_ttm_bo_is_radeon_bo(bo)) 508 if (!radeon_ttm_bo_is_radeon_bo(bo))
505 return; 509 return 0;
506 rbo = container_of(bo, struct radeon_bo, tbo); 510 rbo = container_of(bo, struct radeon_bo, tbo);
507 radeon_bo_check_tiling(rbo, 0, 0); 511 radeon_bo_check_tiling(rbo, 0, 0);
512 rdev = rbo->rdev;
513 if (bo->mem.mem_type == TTM_PL_VRAM) {
514 size = bo->mem.num_pages << PAGE_SHIFT;
515 offset = bo->mem.mm_node->start << PAGE_SHIFT;
516 if ((offset + size) > rdev->mc.visible_vram_size) {
517 /* hurrah the memory is not visible ! */
518 radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_VRAM);
519 rbo->placement.lpfn = rdev->mc.visible_vram_size >> PAGE_SHIFT;
520 r = ttm_bo_validate(bo, &rbo->placement, false, true, false);
521 if (unlikely(r != 0))
522 return r;
523 offset = bo->mem.mm_node->start << PAGE_SHIFT;
524 /* this should not happen */
525 if ((offset + size) > rdev->mc.visible_vram_size)
526 return -EINVAL;
527 }
528 }
529 return 0;
508} 530}
diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h
index 7ab43de1e244..353998dc2c03 100644
--- a/drivers/gpu/drm/radeon/radeon_object.h
+++ b/drivers/gpu/drm/radeon/radeon_object.h
@@ -168,6 +168,6 @@ extern int radeon_bo_check_tiling(struct radeon_bo *bo, bool has_moved,
168 bool force_drop); 168 bool force_drop);
169extern void radeon_bo_move_notify(struct ttm_buffer_object *bo, 169extern void radeon_bo_move_notify(struct ttm_buffer_object *bo,
170 struct ttm_mem_reg *mem); 170 struct ttm_mem_reg *mem);
171extern void radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo); 171extern int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo);
172extern int radeon_bo_get_surface_reg(struct radeon_bo *bo); 172extern int radeon_bo_get_surface_reg(struct radeon_bo *bo);
173#endif 173#endif
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index ba4724c38ac0..62b4b800e0a3 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -165,8 +165,7 @@ static int radeon_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
165 man->io_size = rdev->mc.gtt_size; 165 man->io_size = rdev->mc.gtt_size;
166 man->io_addr = NULL; 166 man->io_addr = NULL;
167 if (!rdev->ddev->agp->cant_use_aperture) 167 if (!rdev->ddev->agp->cant_use_aperture)
168 man->flags = TTM_MEMTYPE_FLAG_NEEDS_IOREMAP | 168 man->flags = TTM_MEMTYPE_FLAG_MAPPABLE;
169 TTM_MEMTYPE_FLAG_MAPPABLE;
170 man->available_caching = TTM_PL_FLAG_UNCACHED | 169 man->available_caching = TTM_PL_FLAG_UNCACHED |
171 TTM_PL_FLAG_WC; 170 TTM_PL_FLAG_WC;
172 man->default_caching = TTM_PL_FLAG_WC; 171 man->default_caching = TTM_PL_FLAG_WC;
@@ -182,7 +181,6 @@ static int radeon_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
182 /* "On-card" video ram */ 181 /* "On-card" video ram */
183 man->gpu_offset = rdev->mc.vram_start; 182 man->gpu_offset = rdev->mc.vram_start;
184 man->flags = TTM_MEMTYPE_FLAG_FIXED | 183 man->flags = TTM_MEMTYPE_FLAG_FIXED |
185 TTM_MEMTYPE_FLAG_NEEDS_IOREMAP |
186 TTM_MEMTYPE_FLAG_MAPPABLE; 184 TTM_MEMTYPE_FLAG_MAPPABLE;
187 man->available_caching = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_WC; 185 man->available_caching = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_WC;
188 man->default_caching = TTM_PL_FLAG_WC; 186 man->default_caching = TTM_PL_FLAG_WC;
@@ -437,10 +435,53 @@ static int radeon_bo_move(struct ttm_buffer_object *bo,
437memcpy: 435memcpy:
438 r = ttm_bo_move_memcpy(bo, evict, no_wait_reserve, no_wait_gpu, new_mem); 436 r = ttm_bo_move_memcpy(bo, evict, no_wait_reserve, no_wait_gpu, new_mem);
439 } 437 }
440
441 return r; 438 return r;
442} 439}
443 440
441static int radeon_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
442{
443 struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type];
444 struct radeon_device *rdev = radeon_get_rdev(bdev);
445
446 mem->bus.addr = NULL;
447 mem->bus.offset = 0;
448 mem->bus.size = mem->num_pages << PAGE_SHIFT;
449 mem->bus.base = 0;
450 mem->bus.is_iomem = false;
451 if (!(man->flags & TTM_MEMTYPE_FLAG_MAPPABLE))
452 return -EINVAL;
453 switch (mem->mem_type) {
454 case TTM_PL_SYSTEM:
455 /* system memory */
456 return 0;
457 case TTM_PL_TT:
458#if __OS_HAS_AGP
459 if (rdev->flags & RADEON_IS_AGP) {
460 /* RADEON_IS_AGP is set only if AGP is active */
461 mem->bus.offset = mem->mm_node->start << PAGE_SHIFT;
462 mem->bus.base = rdev->mc.agp_base;
463 mem->bus.is_iomem = true;
464 }
465#endif
466 break;
467 case TTM_PL_VRAM:
468 mem->bus.offset = mem->mm_node->start << PAGE_SHIFT;
469 /* check if it's visible */
470 if ((mem->bus.offset + mem->bus.size) > rdev->mc.visible_vram_size)
471 return -EINVAL;
472 mem->bus.base = rdev->mc.aper_base;
473 mem->bus.is_iomem = true;
474 break;
475 default:
476 return -EINVAL;
477 }
478 return 0;
479}
480
481static void radeon_ttm_io_mem_free(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem)
482{
483}
484
444static int radeon_sync_obj_wait(void *sync_obj, void *sync_arg, 485static int radeon_sync_obj_wait(void *sync_obj, void *sync_arg,
445 bool lazy, bool interruptible) 486 bool lazy, bool interruptible)
446{ 487{
@@ -481,6 +522,8 @@ static struct ttm_bo_driver radeon_bo_driver = {
481 .sync_obj_ref = &radeon_sync_obj_ref, 522 .sync_obj_ref = &radeon_sync_obj_ref,
482 .move_notify = &radeon_bo_move_notify, 523 .move_notify = &radeon_bo_move_notify,
483 .fault_reserve_notify = &radeon_bo_fault_reserve_notify, 524 .fault_reserve_notify = &radeon_bo_fault_reserve_notify,
525 .io_mem_reserve = &radeon_ttm_io_mem_reserve,
526 .io_mem_free = &radeon_ttm_io_mem_free,
484}; 527};
485 528
486int radeon_ttm_init(struct radeon_device *rdev) 529int radeon_ttm_init(struct radeon_device *rdev)