All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] drm/radeon: Try placing NO_CPU_ACCESS BOs outside of CPU accessible VRAM
@ 2014-10-09  9:55 Michel Dänzer
  2014-10-09  9:55 ` [PATCH 2/2] drm/radeon: Try evicting from CPU accessible to inaccessible VRAM first Michel Dänzer
  2014-10-09 11:30 ` [PATCH 1/2] drm/radeon: Try placing NO_CPU_ACCESS BOs outside of CPU accessible VRAM Christian König
  0 siblings, 2 replies; 5+ messages in thread
From: Michel Dänzer @ 2014-10-09  9:55 UTC (permalink / raw)
  To: dri-devel

From: Michel Dänzer <michel.daenzer@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.

Signed-off-by: Michel Dänzer <michel.daenzer@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);
-- 
2.1.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/2] drm/radeon: Try evicting from CPU accessible to inaccessible VRAM first
  2014-10-09  9:55 [PATCH 1/2] drm/radeon: Try placing NO_CPU_ACCESS BOs outside of CPU accessible VRAM Michel Dänzer
@ 2014-10-09  9:55 ` Michel Dänzer
  2014-10-09 11:30 ` [PATCH 1/2] drm/radeon: Try placing NO_CPU_ACCESS BOs outside of CPU accessible VRAM Christian König
  1 sibling, 0 replies; 5+ messages in thread
From: Michel Dänzer @ 2014-10-09  9:55 UTC (permalink / raw)
  To: dri-devel

From: Michel Dänzer <michel.daenzer@amd.com>

Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
---
 drivers/gpu/drm/radeon/radeon_ttm.c | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index 8624979..cbe7b32 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -198,7 +198,30 @@ static void radeon_evict_flags(struct ttm_buffer_object *bo,
 	case TTM_PL_VRAM:
 		if (rbo->rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready == false)
 			radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_CPU);
-		else
+		else if (rbo->rdev->mc.visible_vram_size < rbo->rdev->mc.real_vram_size &&
+			 bo->mem.start < (rbo->rdev->mc.visible_vram_size >> PAGE_SHIFT)) {
+			unsigned fpfn = rbo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
+			int i;
+
+			/* Try evicting to the CPU inaccessible part of VRAM
+			 * first, but only set GTT as busy placement, so this
+			 * BO will be evicted to GTT rather than causing other
+			 * BOs to be evicted from VRAM
+			 */
+			radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_VRAM |
+							 RADEON_GEM_DOMAIN_GTT);
+			rbo->placement.num_busy_placement = 0;
+			for (i = 0; i < rbo->placement.num_placement; i++) {
+				if (rbo->placements[i].flags & TTM_PL_FLAG_VRAM) {
+					if (rbo->placements[0].fpfn < fpfn)
+						rbo->placements[0].fpfn = fpfn;
+				} else {
+					rbo->placement.busy_placement =
+						&rbo->placements[i];
+					rbo->placement.num_busy_placement = 1;
+				}
+			}
+		} else
 			radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT);
 		break;
 	case TTM_PL_TT:
-- 
2.1.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/2] drm/radeon: Try placing NO_CPU_ACCESS BOs outside of CPU accessible VRAM
  2014-10-09  9:55 [PATCH 1/2] drm/radeon: Try placing NO_CPU_ACCESS BOs outside of CPU accessible VRAM Michel Dänzer
  2014-10-09  9:55 ` [PATCH 2/2] drm/radeon: Try evicting from CPU accessible to inaccessible VRAM first Michel Dänzer
@ 2014-10-09 11:30 ` Christian König
  2014-10-10  3:28   ` [PATCH v2 " Michel Dänzer
  1 sibling, 1 reply; 5+ messages in thread
From: Christian König @ 2014-10-09 11:30 UTC (permalink / raw)
  To: Michel Dänzer, dri-devel

Am 09.10.2014 um 11:55 schrieb Michel Dänzer:
> From: Michel Dänzer <michel.daenzer@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@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);

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 1/2] drm/radeon: Try placing NO_CPU_ACCESS BOs outside of CPU accessible VRAM
  2014-10-09 11:30 ` [PATCH 1/2] drm/radeon: Try placing NO_CPU_ACCESS BOs outside of CPU accessible VRAM Christian König
@ 2014-10-10  3:28   ` Michel Dänzer
  2014-10-13 18:25     ` Alex Deucher
  0 siblings, 1 reply; 5+ messages in thread
From: Michel Dänzer @ 2014-10-10  3:28 UTC (permalink / raw)
  To: dri-devel

From: Michel Dänzer <michel.daenzer@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.

Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
---

v2: Bump size of struct radeon_bo placements array.

 drivers/gpu/drm/radeon/radeon.h        |  2 +-
 drivers/gpu/drm/radeon/radeon_object.c | 42 ++++++++++++++++++++++++++++------
 2 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index f7c4b22..11e56ff 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -474,7 +474,7 @@ struct radeon_bo {
 	struct list_head		list;
 	/* Protected by tbo.reserved */
 	u32				initial_domain;
-	struct ttm_place		placements[3];
+	struct ttm_place		placements[4];
 	struct ttm_placement		placement;
 	struct ttm_buffer_object	tbo;
 	struct ttm_bo_kmap_obj		kmap;
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);
-- 
2.1.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 1/2] drm/radeon: Try placing NO_CPU_ACCESS BOs outside of CPU accessible VRAM
  2014-10-10  3:28   ` [PATCH v2 " Michel Dänzer
@ 2014-10-13 18:25     ` Alex Deucher
  0 siblings, 0 replies; 5+ messages in thread
From: Alex Deucher @ 2014-10-13 18:25 UTC (permalink / raw)
  To: Michel Dänzer; +Cc: Maling list - DRI developers

On Thu, Oct 9, 2014 at 11:28 PM, Michel Dänzer <michel@daenzer.net> wrote:
> From: Michel Dänzer <michel.daenzer@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.
>
> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>

Applied this series to my 3.19 tree.

Alex

> ---
>
> v2: Bump size of struct radeon_bo placements array.
>
>  drivers/gpu/drm/radeon/radeon.h        |  2 +-
>  drivers/gpu/drm/radeon/radeon_object.c | 42 ++++++++++++++++++++++++++++------
>  2 files changed, 36 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> index f7c4b22..11e56ff 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -474,7 +474,7 @@ struct radeon_bo {
>         struct list_head                list;
>         /* Protected by tbo.reserved */
>         u32                             initial_domain;
> -       struct ttm_place                placements[3];
> +       struct ttm_place                placements[4];
>         struct ttm_placement            placement;
>         struct ttm_buffer_object        tbo;
>         struct ttm_bo_kmap_obj          kmap;
> 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);
> --
> 2.1.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2014-10-13 18:25 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-10-09  9:55 [PATCH 1/2] drm/radeon: Try placing NO_CPU_ACCESS BOs outside of CPU accessible VRAM Michel Dänzer
2014-10-09  9:55 ` [PATCH 2/2] drm/radeon: Try evicting from CPU accessible to inaccessible VRAM first Michel Dänzer
2014-10-09 11:30 ` [PATCH 1/2] drm/radeon: Try placing NO_CPU_ACCESS BOs outside of CPU accessible VRAM Christian König
2014-10-10  3:28   ` [PATCH v2 " Michel Dänzer
2014-10-13 18:25     ` Alex Deucher

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.