diff options
author | Jerome Glisse <jglisse@redhat.com> | 2010-04-09 08:39:24 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-04-20 00:12:22 -0400 |
commit | 0a2d50e3a8faaf36cde36920431586090411ea15 (patch) | |
tree | d002e9418728c091a012546f5cc86973fdde70bd /drivers | |
parent | 82c5da6bf8b55a931b042fb531083863d26c8020 (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.c | 26 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_object.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_ttm.c | 51 |
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 | ||
501 | void radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo) | 501 | int 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); |
169 | extern void radeon_bo_move_notify(struct ttm_buffer_object *bo, | 169 | extern void radeon_bo_move_notify(struct ttm_buffer_object *bo, |
170 | struct ttm_mem_reg *mem); | 170 | struct ttm_mem_reg *mem); |
171 | extern void radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo); | 171 | extern int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo); |
172 | extern int radeon_bo_get_surface_reg(struct radeon_bo *bo); | 172 | extern 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, | |||
437 | memcpy: | 435 | memcpy: |
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 | ||
441 | static 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 | |||
481 | static void radeon_ttm_io_mem_free(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) | ||
482 | { | ||
483 | } | ||
484 | |||
444 | static int radeon_sync_obj_wait(void *sync_obj, void *sync_arg, | 485 | static 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 | ||
486 | int radeon_ttm_init(struct radeon_device *rdev) | 529 | int radeon_ttm_init(struct radeon_device *rdev) |