All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] drm/radeon: Add RADEON_GEM_CPU_ACCESS BO creation flag
@ 2014-08-28  6:56 Michel Dänzer
  2014-08-28  6:56 ` [PATCH] r600g, radeonsi: Inform the kernel if a BO will likely be accessed by the CPU Michel Dänzer
  2014-08-28  8:57 ` [PATCH] drm/radeon: Add RADEON_GEM_CPU_ACCESS BO creation flag Christian König
  0 siblings, 2 replies; 12+ messages in thread
From: Michel Dänzer @ 2014-08-28  6:56 UTC (permalink / raw)
  To: dri-devel, mesa-dev

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

This flag is a hint that userspace expects the BO to be accessed by the
CPU. We can use that hint to prevent such BOs from ever being stored in
the CPU inaccessible part of VRAM.

Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
---
 drivers/gpu/drm/radeon/radeon_object.c | 11 +++++++++--
 include/uapi/drm/radeon_drm.h          |  2 ++
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index dc74cc5..908ea541 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -143,7 +143,12 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
 
 	for (i = 0; i < c; ++i) {
 		rbo->placements[i].fpfn = 0;
-		rbo->placements[i].lpfn = 0;
+		if ((rbo->flags & RADEON_GEM_CPU_ACCESS) &&
+		    (rbo->placements[i].flags & TTM_PL_FLAG_VRAM))
+			rbo->placements[i].lpfn =
+				rbo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
+		else
+			rbo->placements[i].lpfn = 0;
 	}
 
 	/*
@@ -151,7 +156,9 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
 	 * improve fragmentation quality.
 	 * 512kb was measured as the most optimal number.
 	 */
-	if (rbo->tbo.mem.size > 512 * 1024) {
+	if (!((rbo->flags & RADEON_GEM_CPU_ACCESS) &&
+	      (rbo->placements[i].flags & TTM_PL_FLAG_VRAM)) &&
+	    rbo->tbo.mem.size > 512 * 1024) {
 		for (i = 0; i < c; i++) {
 			rbo->placements[i].flags |= TTM_PL_FLAG_TOPDOWN;
 		}
diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h
index 509b2d7..bf0067b 100644
--- a/include/uapi/drm/radeon_drm.h
+++ b/include/uapi/drm/radeon_drm.h
@@ -799,6 +799,8 @@ struct drm_radeon_gem_info {
 #define RADEON_GEM_NO_BACKING_STORE	(1 << 0)
 #define RADEON_GEM_GTT_UC		(1 << 1)
 #define RADEON_GEM_GTT_WC		(1 << 2)
+/* BO is expected to be accessed by the CPU */
+#define RADEON_GEM_CPU_ACCESS		(1 << 3)
 
 struct drm_radeon_gem_create {
 	uint64_t	size;
-- 
2.1.0

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

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

* [PATCH] r600g, radeonsi: Inform the kernel if a BO will likely be accessed by the CPU
  2014-08-28  6:56 [PATCH] drm/radeon: Add RADEON_GEM_CPU_ACCESS BO creation flag Michel Dänzer
@ 2014-08-28  6:56 ` Michel Dänzer
  2014-09-01 10:21   ` [Mesa-dev] " Marek Olšák
  2014-08-28  8:57 ` [PATCH] drm/radeon: Add RADEON_GEM_CPU_ACCESS BO creation flag Christian König
  1 sibling, 1 reply; 12+ messages in thread
From: Michel Dänzer @ 2014-08-28  6:56 UTC (permalink / raw)
  To: dri-devel, mesa-dev

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

This allows the kernel to prevent such BOs from ever being stored in the
CPU inaccessible part of VRAM.

Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
---
 src/gallium/drivers/radeon/r600_buffer_common.c | 23 ++++++++++++++---------
 src/gallium/winsys/radeon/drm/radeon_drm_bo.c   |  8 +++++++-
 src/gallium/winsys/radeon/drm/radeon_winsys.h   |  3 ++-
 3 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/src/gallium/drivers/radeon/r600_buffer_common.c b/src/gallium/drivers/radeon/r600_buffer_common.c
index acdabc0..1a6e97d 100644
--- a/src/gallium/drivers/radeon/r600_buffer_common.c
+++ b/src/gallium/drivers/radeon/r600_buffer_common.c
@@ -126,6 +126,7 @@ bool r600_init_resource(struct r600_common_screen *rscreen,
 			flags = RADEON_FLAG_GTT_WC;
 			break;
 		}
+		flags = RADEON_FLAG_CPU_ACCESS;
 		/* fall through */
 	case PIPE_USAGE_DEFAULT:
 	case PIPE_USAGE_IMMUTABLE:
@@ -136,23 +137,27 @@ bool r600_init_resource(struct r600_common_screen *rscreen,
 		break;
 	}
 
-	/* Use GTT for all persistent mappings with older kernels, because they
-	 * didn't always flush the HDP cache before CS execution.
-	 *
-	 * Write-combined CPU mappings are fine, the kernel ensures all CPU
-	 * writes finish before the GPU executes a command stream.
-	 */
-	if (rscreen->info.drm_minor < 40 &&
-	    res->b.b.target == PIPE_BUFFER &&
+	if (res->b.b.target == PIPE_BUFFER &&
 	    res->b.b.flags & (PIPE_RESOURCE_FLAG_MAP_PERSISTENT |
 			      PIPE_RESOURCE_FLAG_MAP_COHERENT)) {
-		res->domains = RADEON_DOMAIN_GTT;
+		/* Use GTT for all persistent mappings with older kernels,
+		 * because they didn't always flush the HDP cache before CS
+		 * execution.
+		 *
+		 * Write-combined CPU mappings are fine, the kernel ensures all CPU
+		 * writes finish before the GPU executes a command stream.
+		 */
+		if (rscreen->info.drm_minor < 40)
+			res->domains = RADEON_DOMAIN_GTT;
+		else if (res->domains & RADEON_DOMAIN_VRAM)
+			flags |= RADEON_FLAG_CPU_ACCESS;
 	}
 
 	/* Tiled textures are unmappable. Always put them in VRAM. */
 	if (res->b.b.target != PIPE_BUFFER &&
 	    rtex->surface.level[0].mode >= RADEON_SURF_MODE_1D) {
 		res->domains = RADEON_DOMAIN_VRAM;
+		flags &= ~RADEON_FLAG_CPU_ACCESS;
 	}
 
 	/* Allocate a new resource. */
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
index 73f8d38..03b9b1d 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
@@ -478,7 +478,11 @@ const struct pb_vtbl radeon_bo_vtbl = {
 };
 
 #ifndef RADEON_GEM_GTT_WC
-#define RADEON_GEM_GTT_WC (1 << 2)
+#define RADEON_GEM_GTT_WC	(1 << 2)
+#endif
+#ifndef RADEON_GTM_CPU_ACCESS
+/* BO is expected to be accessed by the CPU */
+#define RADEON_GEM_CPU_ACCESS	(1 << 3)
 #endif
 
 static struct pb_buffer *radeon_bomgr_create_bo(struct pb_manager *_mgr,
@@ -505,6 +509,8 @@ static struct pb_buffer *radeon_bomgr_create_bo(struct pb_manager *_mgr,
 
     if (rdesc->flags & RADEON_FLAG_GTT_WC)
         args.flags |= RADEON_GEM_GTT_WC;
+    if (rdesc->flags & RADEON_FLAG_CPU_ACCESS)
+        args.flags |= RADEON_GEM_CPU_ACCESS;
 
     if (drmCommandWriteRead(rws->fd, DRM_RADEON_GEM_CREATE,
                             &args, sizeof(args))) {
diff --git a/src/gallium/winsys/radeon/drm/radeon_winsys.h b/src/gallium/winsys/radeon/drm/radeon_winsys.h
index dbd58f1..69bf6ed 100644
--- a/src/gallium/winsys/radeon/drm/radeon_winsys.h
+++ b/src/gallium/winsys/radeon/drm/radeon_winsys.h
@@ -66,7 +66,8 @@ enum radeon_bo_domain { /* bitfield */
 };
 
 enum radeon_bo_flag { /* bitfield */
-   RADEON_FLAG_GTT_WC = (1 << 0)
+    RADEON_FLAG_GTT_WC =     (1 << 0),
+    RADEON_FLAG_CPU_ACCESS = (1 << 1),
 };
 
 enum radeon_bo_usage { /* bitfield */
-- 
2.1.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

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

* Re: [PATCH] drm/radeon: Add RADEON_GEM_CPU_ACCESS BO creation flag
  2014-08-28  6:56 [PATCH] drm/radeon: Add RADEON_GEM_CPU_ACCESS BO creation flag Michel Dänzer
  2014-08-28  6:56 ` [PATCH] r600g, radeonsi: Inform the kernel if a BO will likely be accessed by the CPU Michel Dänzer
@ 2014-08-28  8:57 ` Christian König
  2014-08-28 15:01   ` Alex Deucher
  1 sibling, 1 reply; 12+ messages in thread
From: Christian König @ 2014-08-28  8:57 UTC (permalink / raw)
  To: Michel Dänzer, dri-devel, mesa-dev

Am 28.08.2014 um 08:56 schrieb Michel Dänzer:
> From: Michel Dänzer <michel.daenzer@amd.com>
>
> This flag is a hint that userspace expects the BO to be accessed by the
> CPU. We can use that hint to prevent such BOs from ever being stored in
> the CPU inaccessible part of VRAM.
>
> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>

This patch is Reviewed-by: Christian König <christian.koenig@amd.com>

I think we need a similar negative flags as well, e.g. 
RADEON_GEM_NO_CPU_ACCESS.

This way we can stop forcing buffers into the visible VRAM while pinning 
them for scanout.

Regards,
Christian.

> ---
>   drivers/gpu/drm/radeon/radeon_object.c | 11 +++++++++--
>   include/uapi/drm/radeon_drm.h          |  2 ++
>   2 files changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
> index dc74cc5..908ea541 100644
> --- a/drivers/gpu/drm/radeon/radeon_object.c
> +++ b/drivers/gpu/drm/radeon/radeon_object.c
> @@ -143,7 +143,12 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
>   
>   	for (i = 0; i < c; ++i) {
>   		rbo->placements[i].fpfn = 0;
> -		rbo->placements[i].lpfn = 0;
> +		if ((rbo->flags & RADEON_GEM_CPU_ACCESS) &&
> +		    (rbo->placements[i].flags & TTM_PL_FLAG_VRAM))
> +			rbo->placements[i].lpfn =
> +				rbo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
> +		else
> +			rbo->placements[i].lpfn = 0;
>   	}
>   
>   	/*
> @@ -151,7 +156,9 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
>   	 * improve fragmentation quality.
>   	 * 512kb was measured as the most optimal number.
>   	 */
> -	if (rbo->tbo.mem.size > 512 * 1024) {
> +	if (!((rbo->flags & RADEON_GEM_CPU_ACCESS) &&
> +	      (rbo->placements[i].flags & TTM_PL_FLAG_VRAM)) &&
> +	    rbo->tbo.mem.size > 512 * 1024) {
>   		for (i = 0; i < c; i++) {
>   			rbo->placements[i].flags |= TTM_PL_FLAG_TOPDOWN;
>   		}
> diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h
> index 509b2d7..bf0067b 100644
> --- a/include/uapi/drm/radeon_drm.h
> +++ b/include/uapi/drm/radeon_drm.h
> @@ -799,6 +799,8 @@ struct drm_radeon_gem_info {
>   #define RADEON_GEM_NO_BACKING_STORE	(1 << 0)
>   #define RADEON_GEM_GTT_UC		(1 << 1)
>   #define RADEON_GEM_GTT_WC		(1 << 2)
> +/* BO is expected to be accessed by the CPU */
> +#define RADEON_GEM_CPU_ACCESS		(1 << 3)
>   
>   struct drm_radeon_gem_create {
>   	uint64_t	size;

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

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

* Re: [PATCH] drm/radeon: Add RADEON_GEM_CPU_ACCESS BO creation flag
  2014-08-28  8:57 ` [PATCH] drm/radeon: Add RADEON_GEM_CPU_ACCESS BO creation flag Christian König
@ 2014-08-28 15:01   ` Alex Deucher
  2014-08-29  1:46     ` [Mesa-dev] " Michel Dänzer
  0 siblings, 1 reply; 12+ messages in thread
From: Alex Deucher @ 2014-08-28 15:01 UTC (permalink / raw)
  To: Christian König
  Cc: mesa-dev, Michel Dänzer, Maling list - DRI developers

[-- Attachment #1: Type: text/plain, Size: 3222 bytes --]

On Thu, Aug 28, 2014 at 4:57 AM, Christian König
<deathsimple@vodafone.de> wrote:
> Am 28.08.2014 um 08:56 schrieb Michel Dänzer:
>
>> From: Michel Dänzer <michel.daenzer@amd.com>
>>
>> This flag is a hint that userspace expects the BO to be accessed by the
>> CPU. We can use that hint to prevent such BOs from ever being stored in
>> the CPU inaccessible part of VRAM.
>>
>> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
>
>
> This patch is Reviewed-by: Christian König <christian.koenig@amd.com>

Applied to my -next tree.

>
> I think we need a similar negative flags as well, e.g.
> RADEON_GEM_NO_CPU_ACCESS.
>
> This way we can stop forcing buffers into the visible VRAM while pinning
> them for scanout.


How about the attached patch?

Alex

>
> Regards,
> Christian.
>
>
>> ---
>>   drivers/gpu/drm/radeon/radeon_object.c | 11 +++++++++--
>>   include/uapi/drm/radeon_drm.h          |  2 ++
>>   2 files changed, 11 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/radeon/radeon_object.c
>> b/drivers/gpu/drm/radeon/radeon_object.c
>> index dc74cc5..908ea541 100644
>> --- a/drivers/gpu/drm/radeon/radeon_object.c
>> +++ b/drivers/gpu/drm/radeon/radeon_object.c
>> @@ -143,7 +143,12 @@ void radeon_ttm_placement_from_domain(struct
>> radeon_bo *rbo, u32 domain)
>>         for (i = 0; i < c; ++i) {
>>                 rbo->placements[i].fpfn = 0;
>> -               rbo->placements[i].lpfn = 0;
>> +               if ((rbo->flags & RADEON_GEM_CPU_ACCESS) &&
>> +                   (rbo->placements[i].flags & TTM_PL_FLAG_VRAM))
>> +                       rbo->placements[i].lpfn =
>> +                               rbo->rdev->mc.visible_vram_size >>
>> PAGE_SHIFT;
>> +               else
>> +                       rbo->placements[i].lpfn = 0;
>>         }
>>         /*
>> @@ -151,7 +156,9 @@ void radeon_ttm_placement_from_domain(struct radeon_bo
>> *rbo, u32 domain)
>>          * improve fragmentation quality.
>>          * 512kb was measured as the most optimal number.
>>          */
>> -       if (rbo->tbo.mem.size > 512 * 1024) {
>> +       if (!((rbo->flags & RADEON_GEM_CPU_ACCESS) &&
>> +             (rbo->placements[i].flags & TTM_PL_FLAG_VRAM)) &&
>> +           rbo->tbo.mem.size > 512 * 1024) {
>>                 for (i = 0; i < c; i++) {
>>                         rbo->placements[i].flags |= TTM_PL_FLAG_TOPDOWN;
>>                 }
>> diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h
>> index 509b2d7..bf0067b 100644
>> --- a/include/uapi/drm/radeon_drm.h
>> +++ b/include/uapi/drm/radeon_drm.h
>> @@ -799,6 +799,8 @@ struct drm_radeon_gem_info {
>>   #define RADEON_GEM_NO_BACKING_STORE   (1 << 0)
>>   #define RADEON_GEM_GTT_UC             (1 << 1)
>>   #define RADEON_GEM_GTT_WC             (1 << 2)
>> +/* BO is expected to be accessed by the CPU */
>> +#define RADEON_GEM_CPU_ACCESS          (1 << 3)
>>     struct drm_radeon_gem_create {
>>         uint64_t        size;
>
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev

[-- Attachment #2: 0001-drm-radeon-add-RADEON_GEM_NO_CPU_ACCESS-BO-creation-.patch --]
[-- Type: text/x-diff, Size: 1902 bytes --]

From d6a65c62241fe2b3c1a0dd799f2af0802297446c Mon Sep 17 00:00:00 2001
From: Alex Deucher <alexander.deucher@amd.com>
Date: Thu, 28 Aug 2014 10:59:05 -0400
Subject: [PATCH] drm/radeon: add RADEON_GEM_NO_CPU_ACCESS BO creation flag

Allows pinning of buffers in the non-CPU visible portion of
vram.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
---
 drivers/gpu/drm/radeon/radeon_object.c | 10 +++++++---
 include/uapi/drm/radeon_drm.h          |  2 ++
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 09b039a..b71e8e0 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -314,10 +314,14 @@ int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset,
 		unsigned lpfn = 0;
 
 		/* force to pin into visible video ram */
-		if (bo->placements[i].flags & TTM_PL_FLAG_VRAM)
-			lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
-		else
+		if (bo->placements[i].flags & TTM_PL_FLAG_VRAM) {
+			if (bo->flags & RADEON_GEM_NO_CPU_ACCESS)
+				lpfn = bo->rdev->mc.real_vram_size >> PAGE_SHIFT;
+			else
+				lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
+		} else {
 			lpfn = bo->rdev->mc.gtt_size >> PAGE_SHIFT; /* ??? */
+		}
 
 		if (max_offset)
 			lpfn = min (lpfn, (unsigned)(max_offset >> PAGE_SHIFT));
diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h
index f755f20..d2346fd 100644
--- a/include/uapi/drm/radeon_drm.h
+++ b/include/uapi/drm/radeon_drm.h
@@ -803,6 +803,8 @@ struct drm_radeon_gem_info {
 #define RADEON_GEM_GTT_WC		(1 << 2)
 /* BO is expected to be accessed by the CPU */
 #define RADEON_GEM_CPU_ACCESS		(1 << 3)
+/* BO is expected to not be accessed by the CPU */
+#define RADEON_GEM_NO_CPU_ACCESS	(1 << 4)
 
 struct drm_radeon_gem_create {
 	uint64_t	size;
-- 
1.8.3.1


[-- Attachment #3: Type: text/plain, Size: 156 bytes --]

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

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

* Re: [Mesa-dev] [PATCH] drm/radeon: Add RADEON_GEM_CPU_ACCESS BO creation flag
  2014-08-28 15:01   ` Alex Deucher
@ 2014-08-29  1:46     ` Michel Dänzer
  2014-09-08 17:36       ` Alex Deucher
  0 siblings, 1 reply; 12+ messages in thread
From: Michel Dänzer @ 2014-08-29  1:46 UTC (permalink / raw)
  To: Alex Deucher, Christian König; +Cc: mesa-dev, Maling list - DRI developers

On 29.08.2014 00:01, Alex Deucher wrote:
> On Thu, Aug 28, 2014 at 4:57 AM, Christian König
> <deathsimple@vodafone.de> wrote:
>> Am 28.08.2014 um 08:56 schrieb Michel Dänzer:
>>
>>> From: Michel Dänzer <michel.daenzer@amd.com>
>>>
>>> This flag is a hint that userspace expects the BO to be accessed by the
>>> CPU. We can use that hint to prevent such BOs from ever being stored in
>>> the CPU inaccessible part of VRAM.
>>>
>>> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
>>
>>
>> This patch is Reviewed-by: Christian König <christian.koenig@amd.com>
> 
> Applied to my -next tree.

Thanks!


>> I think we need a similar negative flags as well, e.g.
>> RADEON_GEM_NO_CPU_ACCESS.
>>
>> This way we can stop forcing buffers into the visible VRAM while pinning
>> them for scanout.
> 
> How about the attached patch?

[...]

> diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
> index 09b039a..b71e8e0 100644
> --- a/drivers/gpu/drm/radeon/radeon_object.c
> +++ b/drivers/gpu/drm/radeon/radeon_object.c
> @@ -314,10 +314,14 @@ int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset,
>  		unsigned lpfn = 0;
>  
>  		/* force to pin into visible video ram */
> -		if (bo->placements[i].flags & TTM_PL_FLAG_VRAM)
> -			lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
> -		else
> +		if (bo->placements[i].flags & TTM_PL_FLAG_VRAM) {
> +			if (bo->flags & RADEON_GEM_NO_CPU_ACCESS)
> +				lpfn = bo->rdev->mc.real_vram_size >> PAGE_SHIFT;
> +			else
> +				lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;

lpfn can be left at 0 if RADEON_GEM_NO_CPU_ACCESS is set, so this can
be simplified to:

			if (!(bo->flags & RADEON_GEM_NO_CPU_ACCESS))
				lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;


> diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h
> index f755f20..d2346fd 100644
> --- a/include/uapi/drm/radeon_drm.h
> +++ b/include/uapi/drm/radeon_drm.h
> @@ -803,6 +803,8 @@ struct drm_radeon_gem_info {
>  #define RADEON_GEM_GTT_WC		(1 << 2)
>  /* BO is expected to be accessed by the CPU */
>  #define RADEON_GEM_CPU_ACCESS		(1 << 3)
> +/* BO is expected to not be accessed by the CPU */
> +#define RADEON_GEM_NO_CPU_ACCESS	(1 << 4)

I'd use stronger wording for this, e.g.

/* CPU access is not expected to work for this BO */


-- 
Earthling Michel Dänzer            |                  http://www.amd.com
Libre software enthusiast          |                Mesa and X developer

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

* Re: [Mesa-dev] [PATCH] r600g, radeonsi: Inform the kernel if a BO will likely be accessed by the CPU
  2014-08-28  6:56 ` [PATCH] r600g, radeonsi: Inform the kernel if a BO will likely be accessed by the CPU Michel Dänzer
@ 2014-09-01 10:21   ` Marek Olšák
  0 siblings, 0 replies; 12+ messages in thread
From: Marek Olšák @ 2014-09-01 10:21 UTC (permalink / raw)
  To: Michel Dänzer; +Cc: mesa-dev, dri-devel

Reviewed-by: Marek Olšák <marek.olsak@amd.com>

Marek

On Thu, Aug 28, 2014 at 8:56 AM, Michel Dänzer <michel@daenzer.net> wrote:
> From: Michel Dänzer <michel.daenzer@amd.com>
>
> This allows the kernel to prevent such BOs from ever being stored in the
> CPU inaccessible part of VRAM.
>
> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
> ---
>  src/gallium/drivers/radeon/r600_buffer_common.c | 23 ++++++++++++++---------
>  src/gallium/winsys/radeon/drm/radeon_drm_bo.c   |  8 +++++++-
>  src/gallium/winsys/radeon/drm/radeon_winsys.h   |  3 ++-
>  3 files changed, 23 insertions(+), 11 deletions(-)
>
> diff --git a/src/gallium/drivers/radeon/r600_buffer_common.c b/src/gallium/drivers/radeon/r600_buffer_common.c
> index acdabc0..1a6e97d 100644
> --- a/src/gallium/drivers/radeon/r600_buffer_common.c
> +++ b/src/gallium/drivers/radeon/r600_buffer_common.c
> @@ -126,6 +126,7 @@ bool r600_init_resource(struct r600_common_screen *rscreen,
>                         flags = RADEON_FLAG_GTT_WC;
>                         break;
>                 }
> +               flags = RADEON_FLAG_CPU_ACCESS;
>                 /* fall through */
>         case PIPE_USAGE_DEFAULT:
>         case PIPE_USAGE_IMMUTABLE:
> @@ -136,23 +137,27 @@ bool r600_init_resource(struct r600_common_screen *rscreen,
>                 break;
>         }
>
> -       /* Use GTT for all persistent mappings with older kernels, because they
> -        * didn't always flush the HDP cache before CS execution.
> -        *
> -        * Write-combined CPU mappings are fine, the kernel ensures all CPU
> -        * writes finish before the GPU executes a command stream.
> -        */
> -       if (rscreen->info.drm_minor < 40 &&
> -           res->b.b.target == PIPE_BUFFER &&
> +       if (res->b.b.target == PIPE_BUFFER &&
>             res->b.b.flags & (PIPE_RESOURCE_FLAG_MAP_PERSISTENT |
>                               PIPE_RESOURCE_FLAG_MAP_COHERENT)) {
> -               res->domains = RADEON_DOMAIN_GTT;
> +               /* Use GTT for all persistent mappings with older kernels,
> +                * because they didn't always flush the HDP cache before CS
> +                * execution.
> +                *
> +                * Write-combined CPU mappings are fine, the kernel ensures all CPU
> +                * writes finish before the GPU executes a command stream.
> +                */
> +               if (rscreen->info.drm_minor < 40)
> +                       res->domains = RADEON_DOMAIN_GTT;
> +               else if (res->domains & RADEON_DOMAIN_VRAM)
> +                       flags |= RADEON_FLAG_CPU_ACCESS;
>         }
>
>         /* Tiled textures are unmappable. Always put them in VRAM. */
>         if (res->b.b.target != PIPE_BUFFER &&
>             rtex->surface.level[0].mode >= RADEON_SURF_MODE_1D) {
>                 res->domains = RADEON_DOMAIN_VRAM;
> +               flags &= ~RADEON_FLAG_CPU_ACCESS;
>         }
>
>         /* Allocate a new resource. */
> diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
> index 73f8d38..03b9b1d 100644
> --- a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
> +++ b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
> @@ -478,7 +478,11 @@ const struct pb_vtbl radeon_bo_vtbl = {
>  };
>
>  #ifndef RADEON_GEM_GTT_WC
> -#define RADEON_GEM_GTT_WC (1 << 2)
> +#define RADEON_GEM_GTT_WC      (1 << 2)
> +#endif
> +#ifndef RADEON_GTM_CPU_ACCESS
> +/* BO is expected to be accessed by the CPU */
> +#define RADEON_GEM_CPU_ACCESS  (1 << 3)
>  #endif
>
>  static struct pb_buffer *radeon_bomgr_create_bo(struct pb_manager *_mgr,
> @@ -505,6 +509,8 @@ static struct pb_buffer *radeon_bomgr_create_bo(struct pb_manager *_mgr,
>
>      if (rdesc->flags & RADEON_FLAG_GTT_WC)
>          args.flags |= RADEON_GEM_GTT_WC;
> +    if (rdesc->flags & RADEON_FLAG_CPU_ACCESS)
> +        args.flags |= RADEON_GEM_CPU_ACCESS;
>
>      if (drmCommandWriteRead(rws->fd, DRM_RADEON_GEM_CREATE,
>                              &args, sizeof(args))) {
> diff --git a/src/gallium/winsys/radeon/drm/radeon_winsys.h b/src/gallium/winsys/radeon/drm/radeon_winsys.h
> index dbd58f1..69bf6ed 100644
> --- a/src/gallium/winsys/radeon/drm/radeon_winsys.h
> +++ b/src/gallium/winsys/radeon/drm/radeon_winsys.h
> @@ -66,7 +66,8 @@ enum radeon_bo_domain { /* bitfield */
>  };
>
>  enum radeon_bo_flag { /* bitfield */
> -   RADEON_FLAG_GTT_WC = (1 << 0)
> +    RADEON_FLAG_GTT_WC =     (1 << 0),
> +    RADEON_FLAG_CPU_ACCESS = (1 << 1),
>  };
>
>  enum radeon_bo_usage { /* bitfield */
> --
> 2.1.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [PATCH] drm/radeon: Add RADEON_GEM_CPU_ACCESS BO creation flag
  2014-08-29  1:46     ` [Mesa-dev] " Michel Dänzer
@ 2014-09-08 17:36       ` Alex Deucher
  2014-09-09  0:47         ` [Mesa-dev] " Michel Dänzer
  0 siblings, 1 reply; 12+ messages in thread
From: Alex Deucher @ 2014-09-08 17:36 UTC (permalink / raw)
  To: Michel Dänzer; +Cc: mesa-dev, Maling list - DRI developers

[-- Attachment #1: Type: text/plain, Size: 2861 bytes --]

On Thu, Aug 28, 2014 at 9:46 PM, Michel Dänzer <michel@daenzer.net> wrote:
> On 29.08.2014 00:01, Alex Deucher wrote:
>> On Thu, Aug 28, 2014 at 4:57 AM, Christian König
>> <deathsimple@vodafone.de> wrote:
>>> Am 28.08.2014 um 08:56 schrieb Michel Dänzer:
>>>
>>>> From: Michel Dänzer <michel.daenzer@amd.com>
>>>>
>>>> This flag is a hint that userspace expects the BO to be accessed by the
>>>> CPU. We can use that hint to prevent such BOs from ever being stored in
>>>> the CPU inaccessible part of VRAM.
>>>>
>>>> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
>>>
>>>
>>> This patch is Reviewed-by: Christian König <christian.koenig@amd.com>
>>
>> Applied to my -next tree.
>
> Thanks!
>
>
>>> I think we need a similar negative flags as well, e.g.
>>> RADEON_GEM_NO_CPU_ACCESS.
>>>
>>> This way we can stop forcing buffers into the visible VRAM while pinning
>>> them for scanout.
>>
>> How about the attached patch?
>
> [...]
>
>> diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
>> index 09b039a..b71e8e0 100644
>> --- a/drivers/gpu/drm/radeon/radeon_object.c
>> +++ b/drivers/gpu/drm/radeon/radeon_object.c
>> @@ -314,10 +314,14 @@ int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset,
>>               unsigned lpfn = 0;
>>
>>               /* force to pin into visible video ram */
>> -             if (bo->placements[i].flags & TTM_PL_FLAG_VRAM)
>> -                     lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
>> -             else
>> +             if (bo->placements[i].flags & TTM_PL_FLAG_VRAM) {
>> +                     if (bo->flags & RADEON_GEM_NO_CPU_ACCESS)
>> +                             lpfn = bo->rdev->mc.real_vram_size >> PAGE_SHIFT;
>> +                     else
>> +                             lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
>
> lpfn can be left at 0 if RADEON_GEM_NO_CPU_ACCESS is set, so this can
> be simplified to:
>
>                         if (!(bo->flags & RADEON_GEM_NO_CPU_ACCESS))
>                                 lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
>
>
>> diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h
>> index f755f20..d2346fd 100644
>> --- a/include/uapi/drm/radeon_drm.h
>> +++ b/include/uapi/drm/radeon_drm.h
>> @@ -803,6 +803,8 @@ struct drm_radeon_gem_info {
>>  #define RADEON_GEM_GTT_WC            (1 << 2)
>>  /* BO is expected to be accessed by the CPU */
>>  #define RADEON_GEM_CPU_ACCESS                (1 << 3)
>> +/* BO is expected to not be accessed by the CPU */
>> +#define RADEON_GEM_NO_CPU_ACCESS     (1 << 4)
>
> I'd use stronger wording for this, e.g.
>
> /* CPU access is not expected to work for this BO */

Updated version with comments integrated.

Alex

[-- Attachment #2: 0001-drm-radeon-add-RADEON_GEM_NO_CPU_ACCESS-BO-creation-.patch --]
[-- Type: text/x-diff, Size: 1882 bytes --]

From 8e0fe1b090f75e5b7cadc9c316d1a9e3668c8ed2 Mon Sep 17 00:00:00 2001
From: Alex Deucher <alexander.deucher@amd.com>
Date: Thu, 28 Aug 2014 10:59:05 -0400
Subject: [PATCH] drm/radeon: add RADEON_GEM_NO_CPU_ACCESS BO creation flag
 (v2)

Allows pinning of buffers in the non-CPU visible portion of
vram.

v2: incorporate Michel's comments.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
---
 drivers/gpu/drm/radeon/radeon_object.c | 8 +++++---
 include/uapi/drm/radeon_drm.h          | 2 ++
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index eef60aa..c7ad231d 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -314,10 +314,12 @@ int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset,
 		unsigned lpfn = 0;
 
 		/* force to pin into visible video ram */
-		if (bo->placements[i].flags & TTM_PL_FLAG_VRAM)
-			lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
-		else
+		if (bo->placements[i].flags & TTM_PL_FLAG_VRAM) {
+			if (!(bo->flags & RADEON_GEM_NO_CPU_ACCESS))
+				lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
+		} else {
 			lpfn = bo->rdev->mc.gtt_size >> PAGE_SHIFT; /* ??? */
+		}
 
 		if (max_offset)
 			lpfn = min (lpfn, (unsigned)(max_offset >> PAGE_SHIFT));
diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h
index f755f20..50d0fb4 100644
--- a/include/uapi/drm/radeon_drm.h
+++ b/include/uapi/drm/radeon_drm.h
@@ -803,6 +803,8 @@ struct drm_radeon_gem_info {
 #define RADEON_GEM_GTT_WC		(1 << 2)
 /* BO is expected to be accessed by the CPU */
 #define RADEON_GEM_CPU_ACCESS		(1 << 3)
+/* CPU access is not expected to work for this BO */
+#define RADEON_GEM_NO_CPU_ACCESS	(1 << 4)
 
 struct drm_radeon_gem_create {
 	uint64_t	size;
-- 
1.8.3.1


[-- Attachment #3: Type: text/plain, Size: 156 bytes --]

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

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

* Re: [Mesa-dev] [PATCH] drm/radeon: Add RADEON_GEM_CPU_ACCESS BO creation flag
  2014-09-08 17:36       ` Alex Deucher
@ 2014-09-09  0:47         ` Michel Dänzer
  2014-09-09  1:15           ` Michel Dänzer
  0 siblings, 1 reply; 12+ messages in thread
From: Michel Dänzer @ 2014-09-09  0:47 UTC (permalink / raw)
  To: Alex Deucher; +Cc: mesa-dev, Maling list - DRI developers

On 09.09.2014 02:36, Alex Deucher wrote:
>
> Updated version with comments integrated.

[...]

> @@ -314,10 +314,12 @@ int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset,
>  		unsigned lpfn = 0;
>
>  		/* force to pin into visible video ram */
> -		if (bo->placements[i].flags & TTM_PL_FLAG_VRAM)
> -			lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
> -		else
> +		if (bo->placements[i].flags & TTM_PL_FLAG_VRAM) {
> +			if (!(bo->flags & RADEON_GEM_NO_CPU_ACCESS))
> +				lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
> +		} else {
>  			lpfn = bo->rdev->mc.gtt_size >> PAGE_SHIFT; /* ??? */
> +		}

The else block can be removed as well, but that can be done in another 
patch.

Either way, v2 is

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


-- 
Earthling Michel Dänzer            |                  http://www.amd.com
Libre software enthusiast          |                Mesa and X developer

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

* Re: [PATCH] drm/radeon: Add RADEON_GEM_CPU_ACCESS BO creation flag
  2014-09-09  0:47         ` [Mesa-dev] " Michel Dänzer
@ 2014-09-09  1:15           ` Michel Dänzer
  2014-09-09 16:28             ` Alex Deucher
  0 siblings, 1 reply; 12+ messages in thread
From: Michel Dänzer @ 2014-09-09  1:15 UTC (permalink / raw)
  To: Alex Deucher; +Cc: mesa-dev, Maling list - DRI developers

On 09.09.2014 09:47, Michel Dänzer wrote:
> On 09.09.2014 02:36, Alex Deucher wrote:
>>
>> Updated version with comments integrated.
> 
> [...]
> 
>> @@ -314,10 +314,12 @@ int radeon_bo_pin_restricted(struct radeon_bo 
>> *bo, u32 domain, u64 max_offset,
>>          unsigned lpfn = 0;
>>
>>          /* force to pin into visible video ram */
>> -        if (bo->placements[i].flags & TTM_PL_FLAG_VRAM)
>> -            lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
>> -        else
>> +        if (bo->placements[i].flags & TTM_PL_FLAG_VRAM) {
>> +            if (!(bo->flags & RADEON_GEM_NO_CPU_ACCESS))
>> +                lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
>> +        } else {
>>              lpfn = bo->rdev->mc.gtt_size >> PAGE_SHIFT; /* ??? */
>> +        }
> 
> The else block can be removed as well, but that can be done in another 
> patch.

Actually, I just noticed a problem, the following if statement:

>  		if (max_offset)
>  			lpfn = min (lpfn, (unsigned)(max_offset >> PAGE_SHIFT));

This will ignore max_offset if lpfn is 0. So either go with v1 of this hunk,
or rebase on top of the patch below.


From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <michel.daenzer@amd.com>
Date: Tue, 9 Sep 2014 10:09:23 +0900
Subject: [PATCH] drm/radeon: Clean up assignment of TTM placement lpfn member
 for pinning
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
---
 drivers/gpu/drm/radeon/radeon_object.c | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 908ea541..8ec8150 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -307,18 +307,14 @@ int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset,
 	}
 	radeon_ttm_placement_from_domain(bo, domain);
 	for (i = 0; i < bo->placement.num_placement; i++) {
-		unsigned lpfn = 0;
-
 		/* force to pin into visible video ram */
 		if (bo->placements[i].flags & TTM_PL_FLAG_VRAM)
-			lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
+			bo->placements[i].lpfn =
+				min(bo->rdev->mc.visible_vram_size, max_offset)
+				>> PAGE_SHIFT;
 		else
-			lpfn = bo->rdev->mc.gtt_size >> PAGE_SHIFT; /* ??? */
-
-		if (max_offset)
-			lpfn = min (lpfn, (unsigned)(max_offset >> PAGE_SHIFT));
+			bo->placements[i].lpfn = max_offset >> PAGE_SHIFT;
 
-		bo->placements[i].lpfn = lpfn;
 		bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
 	}
 
-- 
2.1.0


-- 
Earthling Michel Dänzer            |                  http://www.amd.com
Libre software enthusiast          |                Mesa and X developer

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

* Re: [PATCH] drm/radeon: Add RADEON_GEM_CPU_ACCESS BO creation flag
  2014-09-09  1:15           ` Michel Dänzer
@ 2014-09-09 16:28             ` Alex Deucher
  2014-09-10  4:03               ` Michel Dänzer
  0 siblings, 1 reply; 12+ messages in thread
From: Alex Deucher @ 2014-09-09 16:28 UTC (permalink / raw)
  To: Michel Dänzer; +Cc: mesa-dev, Maling list - DRI developers

[-- Attachment #1: Type: text/plain, Size: 3375 bytes --]

On Mon, Sep 8, 2014 at 9:15 PM, Michel Dänzer <michel@daenzer.net> wrote:
> On 09.09.2014 09:47, Michel Dänzer wrote:
>> On 09.09.2014 02:36, Alex Deucher wrote:
>>>
>>> Updated version with comments integrated.
>>
>> [...]
>>
>>> @@ -314,10 +314,12 @@ int radeon_bo_pin_restricted(struct radeon_bo
>>> *bo, u32 domain, u64 max_offset,
>>>          unsigned lpfn = 0;
>>>
>>>          /* force to pin into visible video ram */
>>> -        if (bo->placements[i].flags & TTM_PL_FLAG_VRAM)
>>> -            lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
>>> -        else
>>> +        if (bo->placements[i].flags & TTM_PL_FLAG_VRAM) {
>>> +            if (!(bo->flags & RADEON_GEM_NO_CPU_ACCESS))
>>> +                lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
>>> +        } else {
>>>              lpfn = bo->rdev->mc.gtt_size >> PAGE_SHIFT; /* ??? */
>>> +        }
>>
>> The else block can be removed as well, but that can be done in another
>> patch.
>
> Actually, I just noticed a problem, the following if statement:
>
>>               if (max_offset)
>>                       lpfn = min (lpfn, (unsigned)(max_offset >> PAGE_SHIFT));
>
> This will ignore max_offset if lpfn is 0. So either go with v1 of this hunk,
> or rebase on top of the patch below.
>

Rebased on your patch and attached.

Alex

>
> From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <michel.daenzer@amd.com>
> Date: Tue, 9 Sep 2014 10:09:23 +0900
> Subject: [PATCH] drm/radeon: Clean up assignment of TTM placement lpfn member
>  for pinning
> MIME-Version: 1.0
> Content-Type: text/plain; charset=UTF-8
> Content-Transfer-Encoding: 8bit
>
> Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
> ---
>  drivers/gpu/drm/radeon/radeon_object.c | 12 ++++--------
>  1 file changed, 4 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
> index 908ea541..8ec8150 100644
> --- a/drivers/gpu/drm/radeon/radeon_object.c
> +++ b/drivers/gpu/drm/radeon/radeon_object.c
> @@ -307,18 +307,14 @@ int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset,
>         }
>         radeon_ttm_placement_from_domain(bo, domain);
>         for (i = 0; i < bo->placement.num_placement; i++) {
> -               unsigned lpfn = 0;
> -
>                 /* force to pin into visible video ram */
>                 if (bo->placements[i].flags & TTM_PL_FLAG_VRAM)
> -                       lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
> +                       bo->placements[i].lpfn =
> +                               min(bo->rdev->mc.visible_vram_size, max_offset)
> +                               >> PAGE_SHIFT;
>                 else
> -                       lpfn = bo->rdev->mc.gtt_size >> PAGE_SHIFT; /* ??? */
> -
> -               if (max_offset)
> -                       lpfn = min (lpfn, (unsigned)(max_offset >> PAGE_SHIFT));
> +                       bo->placements[i].lpfn = max_offset >> PAGE_SHIFT;
>
> -               bo->placements[i].lpfn = lpfn;
>                 bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
>         }
>
> --
> 2.1.0
>
>
> --
> Earthling Michel Dänzer            |                  http://www.amd.com
> Libre software enthusiast          |                Mesa and X developer

[-- Attachment #2: 0001-drm-radeon-add-RADEON_GEM_NO_CPU_ACCESS-BO-creation-.patch --]
[-- Type: text/x-diff, Size: 1804 bytes --]

From 998fabb91851cef7c70e0f3920e45c70da301647 Mon Sep 17 00:00:00 2001
From: Alex Deucher <alexander.deucher@amd.com>
Date: Tue, 9 Sep 2014 12:24:33 -0400
Subject: [PATCH] drm/radeon: add RADEON_GEM_NO_CPU_ACCESS BO creation flag
 (v3)

Allows pinning of buffers in the non-CPU visible portion of
vram.

v2: incorporate Michel's comments.
v3: rebase on Michel's patch

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
---
 drivers/gpu/drm/radeon/radeon_object.c | 3 ++-
 include/uapi/drm/radeon_drm.h          | 2 ++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 68ab122..0d54993 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -312,7 +312,8 @@ int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset,
 	radeon_ttm_placement_from_domain(bo, domain);
 	for (i = 0; i < bo->placement.num_placement; i++) {
 		/* force to pin into visible video ram */
-		if (bo->placements[i].flags & TTM_PL_FLAG_VRAM)
+		if ((bo->placements[i].flags & TTM_PL_FLAG_VRAM) &&
+		    (!(bo->flags & RADEON_GEM_NO_CPU_ACCESS)))
 			bo->placements[i].lpfn =
 				min(bo->rdev->mc.visible_vram_size, max_offset)
 				>> PAGE_SHIFT;
diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h
index f755f20..50d0fb4 100644
--- a/include/uapi/drm/radeon_drm.h
+++ b/include/uapi/drm/radeon_drm.h
@@ -803,6 +803,8 @@ struct drm_radeon_gem_info {
 #define RADEON_GEM_GTT_WC		(1 << 2)
 /* BO is expected to be accessed by the CPU */
 #define RADEON_GEM_CPU_ACCESS		(1 << 3)
+/* CPU access is not expected to work for this BO */
+#define RADEON_GEM_NO_CPU_ACCESS	(1 << 4)
 
 struct drm_radeon_gem_create {
 	uint64_t	size;
-- 
1.8.3.1


[-- Attachment #3: Type: text/plain, Size: 156 bytes --]

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

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

* Re: [PATCH] drm/radeon: Add RADEON_GEM_CPU_ACCESS BO creation flag
  2014-09-09 16:28             ` Alex Deucher
@ 2014-09-10  4:03               ` Michel Dänzer
  2014-09-10 13:40                 ` Alex Deucher
  0 siblings, 1 reply; 12+ messages in thread
From: Michel Dänzer @ 2014-09-10  4:03 UTC (permalink / raw)
  To: Alex Deucher; +Cc: mesa-dev, Maling list - DRI developers

[-- Attachment #1: Type: text/plain, Size: 1713 bytes --]

On 10.09.2014 01:28, Alex Deucher wrote:
> On Mon, Sep 8, 2014 at 9:15 PM, Michel Dänzer <michel@daenzer.net> wrote:
>> On 09.09.2014 09:47, Michel Dänzer wrote:
>>> On 09.09.2014 02:36, Alex Deucher wrote:
>>>>
>>>> Updated version with comments integrated.
>>>
>>> [...]
>>>
>>>> @@ -314,10 +314,12 @@ int radeon_bo_pin_restricted(struct radeon_bo
>>>> *bo, u32 domain, u64 max_offset,
>>>>           unsigned lpfn = 0;
>>>>
>>>>           /* force to pin into visible video ram */
>>>> -        if (bo->placements[i].flags & TTM_PL_FLAG_VRAM)
>>>> -            lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
>>>> -        else
>>>> +        if (bo->placements[i].flags & TTM_PL_FLAG_VRAM) {
>>>> +            if (!(bo->flags & RADEON_GEM_NO_CPU_ACCESS))
>>>> +                lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
>>>> +        } else {
>>>>               lpfn = bo->rdev->mc.gtt_size >> PAGE_SHIFT; /* ??? */
>>>> +        }
>>>
>>> The else block can be removed as well, but that can be done in another
>>> patch.
>>
>> Actually, I just noticed a problem, the following if statement:
>>
>>>                if (max_offset)
>>>                        lpfn = min (lpfn, (unsigned)(max_offset >> PAGE_SHIFT));
>>
>> This will ignore max_offset if lpfn is 0. So either go with v1 of this hunk,
>> or rebase on top of the patch below.
>>
>
> Rebased on your patch and attached.

My patch didn't handle max_offset == 0 correctly. Attaching a fixed v2 
patch and your patch rebased on top of that.


-- 
Earthling Michel Dänzer            |                  http://www.amd.com
Libre software enthusiast          |                Mesa and X developer

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-drm-radeon-Clean-up-assignment-of-TTM-placement-lpfn.patch --]
[-- Type: text/x-patch; name="0001-drm-radeon-Clean-up-assignment-of-TTM-placement-lpfn.patch", Size: 1842 bytes --]

>From 0428f396173e458288a5f0e1807033ebe9931ce0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <michel.daenzer@amd.com>
Date: Tue, 9 Sep 2014 10:09:23 +0900
Subject: [PATCH v2 1/2] drm/radeon: Clean up assignment of TTM placement lpfn
 member for pinning
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This sets the lpfn member to 0 instead of the full domain size. TTM uses
the full domain size when lpfn is 0.

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

v2: Handle max_offset == 0 correctly

 drivers/gpu/drm/radeon/radeon_object.c | 14 +++++---------
 1 file changed, 5 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 908ea541..24c8772 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -307,18 +307,14 @@ int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset,
 	}
 	radeon_ttm_placement_from_domain(bo, domain);
 	for (i = 0; i < bo->placement.num_placement; i++) {
-		unsigned lpfn = 0;
-
 		/* force to pin into visible video ram */
-		if (bo->placements[i].flags & TTM_PL_FLAG_VRAM)
-			lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
+		if ((bo->placements[i].flags & TTM_PL_FLAG_VRAM) &&
+		    (!max_offset || max_offset > bo->rdev->mc.visible_vram_size))
+			bo->placements[i].lpfn =
+				bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
 		else
-			lpfn = bo->rdev->mc.gtt_size >> PAGE_SHIFT; /* ??? */
-
-		if (max_offset)
-			lpfn = min (lpfn, (unsigned)(max_offset >> PAGE_SHIFT));
+			bo->placements[i].lpfn = max_offset >> PAGE_SHIFT;
 
-		bo->placements[i].lpfn = lpfn;
 		bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
 	}
 
-- 
2.1.0


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-drm-radeon-add-RADEON_GEM_NO_CPU_ACCESS-BO-creation-.patch --]
[-- Type: text/x-patch; name="0002-drm-radeon-add-RADEON_GEM_NO_CPU_ACCESS-BO-creation-.patch", Size: 1965 bytes --]

>From 8e896486464526add633b6809b6d020ad810315c Mon Sep 17 00:00:00 2001
From: Alex Deucher <alexander.deucher@amd.com>
Date: Thu, 28 Aug 2014 10:59:05 -0400
Subject: [PATCH 2/2] drm/radeon: add RADEON_GEM_NO_CPU_ACCESS BO creation flag
 (v4)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Allows pinning of buffers in the non-CPU visible portion of
vram.

v2: incorporate Michel's comments.
v3: rebase on Michel's patch
v4: rebase on Michel's v2 patch

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
---
 drivers/gpu/drm/radeon/radeon_object.c | 1 +
 include/uapi/drm/radeon_drm.h          | 2 ++
 2 files changed, 3 insertions(+)

diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 24c8772..d3f0a19 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -309,6 +309,7 @@ int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset,
 	for (i = 0; i < bo->placement.num_placement; i++) {
 		/* force to pin into visible video ram */
 		if ((bo->placements[i].flags & TTM_PL_FLAG_VRAM) &&
+		    !(bo->flags & RADEON_GEM_NO_CPU_ACCESS) &&
 		    (!max_offset || max_offset > bo->rdev->mc.visible_vram_size))
 			bo->placements[i].lpfn =
 				bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h
index bf0067b..017f869 100644
--- a/include/uapi/drm/radeon_drm.h
+++ b/include/uapi/drm/radeon_drm.h
@@ -801,6 +801,8 @@ struct drm_radeon_gem_info {
 #define RADEON_GEM_GTT_WC		(1 << 2)
 /* BO is expected to be accessed by the CPU */
 #define RADEON_GEM_CPU_ACCESS		(1 << 3)
+/* CPU access is not expected to work for this BO */
+#define RADEON_GEM_NO_CPU_ACCESS	(1 << 4)
 
 struct drm_radeon_gem_create {
 	uint64_t	size;
-- 
2.1.0


[-- Attachment #4: Type: text/plain, Size: 156 bytes --]

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

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

* Re: [PATCH] drm/radeon: Add RADEON_GEM_CPU_ACCESS BO creation flag
  2014-09-10  4:03               ` Michel Dänzer
@ 2014-09-10 13:40                 ` Alex Deucher
  0 siblings, 0 replies; 12+ messages in thread
From: Alex Deucher @ 2014-09-10 13:40 UTC (permalink / raw)
  To: Michel Dänzer; +Cc: mesa-dev, Maling list - DRI developers

On Wed, Sep 10, 2014 at 12:03 AM, Michel Dänzer <michel@daenzer.net> wrote:
> On 10.09.2014 01:28, Alex Deucher wrote:
>>
>> On Mon, Sep 8, 2014 at 9:15 PM, Michel Dänzer <michel@daenzer.net> wrote:
>>>
>>> On 09.09.2014 09:47, Michel Dänzer wrote:
>>>>
>>>> On 09.09.2014 02:36, Alex Deucher wrote:
>>>>>
>>>>>
>>>>> Updated version with comments integrated.
>>>>
>>>>
>>>> [...]
>>>>
>>>>> @@ -314,10 +314,12 @@ int radeon_bo_pin_restricted(struct radeon_bo
>>>>> *bo, u32 domain, u64 max_offset,
>>>>>           unsigned lpfn = 0;
>>>>>
>>>>>           /* force to pin into visible video ram */
>>>>> -        if (bo->placements[i].flags & TTM_PL_FLAG_VRAM)
>>>>> -            lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
>>>>> -        else
>>>>> +        if (bo->placements[i].flags & TTM_PL_FLAG_VRAM) {
>>>>> +            if (!(bo->flags & RADEON_GEM_NO_CPU_ACCESS))
>>>>> +                lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
>>>>> +        } else {
>>>>>               lpfn = bo->rdev->mc.gtt_size >> PAGE_SHIFT; /* ??? */
>>>>> +        }
>>>>
>>>>
>>>> The else block can be removed as well, but that can be done in another
>>>> patch.
>>>
>>>
>>> Actually, I just noticed a problem, the following if statement:
>>>
>>>>                if (max_offset)
>>>>                        lpfn = min (lpfn, (unsigned)(max_offset >>
>>>> PAGE_SHIFT));
>>>
>>>
>>> This will ignore max_offset if lpfn is 0. So either go with v1 of this
>>> hunk,
>>> or rebase on top of the patch below.
>>>
>>
>> Rebased on your patch and attached.
>
>
> My patch didn't handle max_offset == 0 correctly. Attaching a fixed v2 patch
> and your patch rebased on top of that.

Applied.  thanks!

Alex
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

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

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

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-08-28  6:56 [PATCH] drm/radeon: Add RADEON_GEM_CPU_ACCESS BO creation flag Michel Dänzer
2014-08-28  6:56 ` [PATCH] r600g, radeonsi: Inform the kernel if a BO will likely be accessed by the CPU Michel Dänzer
2014-09-01 10:21   ` [Mesa-dev] " Marek Olšák
2014-08-28  8:57 ` [PATCH] drm/radeon: Add RADEON_GEM_CPU_ACCESS BO creation flag Christian König
2014-08-28 15:01   ` Alex Deucher
2014-08-29  1:46     ` [Mesa-dev] " Michel Dänzer
2014-09-08 17:36       ` Alex Deucher
2014-09-09  0:47         ` [Mesa-dev] " Michel Dänzer
2014-09-09  1:15           ` Michel Dänzer
2014-09-09 16:28             ` Alex Deucher
2014-09-10  4:03               ` Michel Dänzer
2014-09-10 13:40                 ` 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.