[PATCH 1/2] drm/radeon: Try placing NO_CPU_ACCESS BOs outside of CPU accessible VRAM
Christian König
deathsimple at vodafone.de
Thu Oct 9 04:30:12 PDT 2014
Am 09.10.2014 um 11:55 schrieb Michel Dänzer:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> This avoids them getting in the way of BOs which might be accessed by
> the CPU. They can still go to the CPU accessible part of VRAM though if
> there's no space outside of it.
That sounds to me like you want to increase the size of
radeon_bo.placements as well, cause we can now have one more.
Christian.
>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
> ---
> drivers/gpu/drm/radeon/radeon_object.c | 42 ++++++++++++++++++++++++++++------
> 1 file changed, 35 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
> index 99a960a..7f3b1e1 100644
> --- a/drivers/gpu/drm/radeon/radeon_object.c
> +++ b/drivers/gpu/drm/radeon/radeon_object.c
> @@ -99,22 +99,39 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
>
> rbo->placement.placement = rbo->placements;
> rbo->placement.busy_placement = rbo->placements;
> - if (domain & RADEON_GEM_DOMAIN_VRAM)
> + if (domain & RADEON_GEM_DOMAIN_VRAM) {
> + /* Try placing BOs which don't need CPU access outside of the
> + * CPU accessible part of VRAM
> + */
> + if ((rbo->flags & RADEON_GEM_NO_CPU_ACCESS) &&
> + rbo->rdev->mc.visible_vram_size < rbo->rdev->mc.real_vram_size) {
> + rbo->placements[c].fpfn =
> + rbo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
> + rbo->placements[c++].flags = TTM_PL_FLAG_WC |
> + TTM_PL_FLAG_UNCACHED |
> + TTM_PL_FLAG_VRAM;
> + }
> +
> + rbo->placements[c].fpfn = 0;
> rbo->placements[c++].flags = TTM_PL_FLAG_WC |
> TTM_PL_FLAG_UNCACHED |
> TTM_PL_FLAG_VRAM;
> + }
>
> if (domain & RADEON_GEM_DOMAIN_GTT) {
> if (rbo->flags & RADEON_GEM_GTT_UC) {
> + rbo->placements[c].fpfn = 0;
> rbo->placements[c++].flags = TTM_PL_FLAG_UNCACHED |
> TTM_PL_FLAG_TT;
>
> } else if ((rbo->flags & RADEON_GEM_GTT_WC) ||
> (rbo->rdev->flags & RADEON_IS_AGP)) {
> + rbo->placements[c].fpfn = 0;
> rbo->placements[c++].flags = TTM_PL_FLAG_WC |
> TTM_PL_FLAG_UNCACHED |
> TTM_PL_FLAG_TT;
> } else {
> + rbo->placements[c].fpfn = 0;
> rbo->placements[c++].flags = TTM_PL_FLAG_CACHED |
> TTM_PL_FLAG_TT;
> }
> @@ -122,30 +139,35 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
>
> if (domain & RADEON_GEM_DOMAIN_CPU) {
> if (rbo->flags & RADEON_GEM_GTT_UC) {
> + rbo->placements[c].fpfn = 0;
> rbo->placements[c++].flags = TTM_PL_FLAG_UNCACHED |
> TTM_PL_FLAG_SYSTEM;
>
> } else if ((rbo->flags & RADEON_GEM_GTT_WC) ||
> rbo->rdev->flags & RADEON_IS_AGP) {
> + rbo->placements[c].fpfn = 0;
> rbo->placements[c++].flags = TTM_PL_FLAG_WC |
> TTM_PL_FLAG_UNCACHED |
> TTM_PL_FLAG_SYSTEM;
> } else {
> + rbo->placements[c].fpfn = 0;
> rbo->placements[c++].flags = TTM_PL_FLAG_CACHED |
> TTM_PL_FLAG_SYSTEM;
> }
> }
> - if (!c)
> + if (!c) {
> + rbo->placements[c].fpfn = 0;
> rbo->placements[c++].flags = TTM_PL_MASK_CACHING |
> TTM_PL_FLAG_SYSTEM;
> + }
>
> rbo->placement.num_placement = c;
> rbo->placement.num_busy_placement = c;
>
> for (i = 0; i < c; ++i) {
> - rbo->placements[i].fpfn = 0;
> if ((rbo->flags & RADEON_GEM_CPU_ACCESS) &&
> - (rbo->placements[i].flags & TTM_PL_FLAG_VRAM))
> + (rbo->placements[i].flags & TTM_PL_FLAG_VRAM) &&
> + !rbo->placements[i].fpfn)
> rbo->placements[i].lpfn =
> rbo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
> else
> @@ -743,8 +765,8 @@ int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
> {
> struct radeon_device *rdev;
> struct radeon_bo *rbo;
> - unsigned long offset, size;
> - int r;
> + unsigned long offset, size, lpfn;
> + int i, r;
>
> if (!radeon_ttm_bo_is_radeon_bo(bo))
> return 0;
> @@ -761,7 +783,13 @@ int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
>
> /* hurrah the memory is not visible ! */
> radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_VRAM);
> - rbo->placements[0].lpfn = rdev->mc.visible_vram_size >> PAGE_SHIFT;
> + lpfn = rdev->mc.visible_vram_size >> PAGE_SHIFT;
> + for (i = 0; i < rbo->placement.num_placement; i++) {
> + /* Force into visible VRAM */
> + if ((rbo->placements[i].flags & TTM_PL_FLAG_VRAM) &&
> + (!rbo->placements[i].lpfn || rbo->placements[i].lpfn > lpfn))
> + rbo->placements[i].lpfn = lpfn;
> + }
> r = ttm_bo_validate(bo, &rbo->placement, false, false);
> if (unlikely(r == -ENOMEM)) {
> radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT);
More information about the dri-devel
mailing list