Re: [PATCH 1/2] drm/amdgpu: implement amdgpu_gem_map_(attach/detach)

2018-02-19 Thread Alex Deucher
On Mon, Feb 19, 2018 at 8:57 AM, Christian König
 wrote:
> Instead of the pin/unpin callback implement the attach/detach ones.
>
> Functional identical, but allows us access to the attachment.
>
> Signed-off-by: Christian König 

Series is:
Reviewed-by: Alex Deucher 

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu.h   |  2 --
>  drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c   |  2 --
>  drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c | 52 
> ---
>  3 files changed, 34 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index 9df563149a68..b0bb956bb9d1 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -393,8 +393,6 @@ struct dma_buf *amdgpu_gem_prime_export(struct drm_device 
> *dev,
> int flags);
>  struct drm_gem_object *amdgpu_gem_prime_import(struct drm_device *dev,
> struct dma_buf *dma_buf);
> -int amdgpu_gem_prime_pin(struct drm_gem_object *obj);
> -void amdgpu_gem_prime_unpin(struct drm_gem_object *obj);
>  struct reservation_object *amdgpu_gem_prime_res_obj(struct drm_gem_object *);
>  void *amdgpu_gem_prime_vmap(struct drm_gem_object *obj);
>  void amdgpu_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> index 6c8ae59d4d94..88ec9280a67a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> @@ -885,8 +885,6 @@ static struct drm_driver kms_driver = {
> .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
> .gem_prime_export = amdgpu_gem_prime_export,
> .gem_prime_import = amdgpu_gem_prime_import,
> -   .gem_prime_pin = amdgpu_gem_prime_pin,
> -   .gem_prime_unpin = amdgpu_gem_prime_unpin,
> .gem_prime_res_obj = amdgpu_gem_prime_res_obj,
> .gem_prime_get_sg_table = amdgpu_gem_prime_get_sg_table,
> .gem_prime_import_sg_table = amdgpu_gem_prime_import_sg_table,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
> index 2a8d980d17f6..f6d7f6404a07 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
> @@ -113,49 +113,65 @@ amdgpu_gem_prime_import_sg_table(struct drm_device *dev,
> return >gem_base;
>  }
>
> -int amdgpu_gem_prime_pin(struct drm_gem_object *obj)
> +static int amdgpu_gem_map_attach(struct dma_buf *dma_buf,
> +struct device *target_dev,
> +struct dma_buf_attachment *attach)
>  {
> +   struct drm_gem_object *obj = dma_buf->priv;
> struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
> -   long ret = 0;
> +   long r;
>
> -   ret = amdgpu_bo_reserve(bo, false);
> -   if (unlikely(ret != 0))
> -   return ret;
> +   r = drm_gem_map_attach(dma_buf, target_dev, attach);
> +   if (r)
> +   return r;
> +
> +   r = amdgpu_bo_reserve(bo, false);
> +   if (unlikely(r != 0))
> +   goto error_detach;
>
> /*
>  * Wait for all shared fences to complete before we switch to future
>  * use of exclusive fence on this prime shared bo.
>  */
> -   ret = reservation_object_wait_timeout_rcu(bo->tbo.resv, true, false,
> - MAX_SCHEDULE_TIMEOUT);
> -   if (unlikely(ret < 0)) {
> -   DRM_DEBUG_PRIME("Fence wait failed: %li\n", ret);
> -   amdgpu_bo_unreserve(bo);
> -   return ret;
> +   r = reservation_object_wait_timeout_rcu(bo->tbo.resv, true, false,
> +   MAX_SCHEDULE_TIMEOUT);
> +   if (unlikely(r < 0)) {
> +   DRM_DEBUG_PRIME("Fence wait failed: %li\n", r);
> +   goto error_unreserve;
> }
>
> /* pin buffer into GTT */
> -   ret = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT, NULL);
> -   if (likely(ret == 0))
> +   r = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT, NULL);
> +   if (likely(r == 0))
> bo->prime_shared_count++;
>
> +error_unreserve:
> amdgpu_bo_unreserve(bo);
> -   return ret;
> +
> +error_detach:
> +   if (r)
> +   drm_gem_map_detach(dma_buf, attach);
> +   return r;
>  }
>
> -void amdgpu_gem_prime_unpin(struct drm_gem_object *obj)
> +static void amdgpu_gem_map_detach(struct dma_buf *dma_buf,
> + struct dma_buf_attachment *attach)
>  {
> +   struct drm_gem_object *obj = dma_buf->priv;
> struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
> int ret = 0;
>
> ret = amdgpu_bo_reserve(bo, true);
> if (unlikely(ret 

[PATCH 1/2] drm/amdgpu: implement amdgpu_gem_map_(attach/detach)

2018-02-19 Thread Christian König
Instead of the pin/unpin callback implement the attach/detach ones.

Functional identical, but allows us access to the attachment.

Signed-off-by: Christian König 
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h   |  2 --
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c   |  2 --
 drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c | 52 ---
 3 files changed, 34 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 9df563149a68..b0bb956bb9d1 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -393,8 +393,6 @@ struct dma_buf *amdgpu_gem_prime_export(struct drm_device 
*dev,
int flags);
 struct drm_gem_object *amdgpu_gem_prime_import(struct drm_device *dev,
struct dma_buf *dma_buf);
-int amdgpu_gem_prime_pin(struct drm_gem_object *obj);
-void amdgpu_gem_prime_unpin(struct drm_gem_object *obj);
 struct reservation_object *amdgpu_gem_prime_res_obj(struct drm_gem_object *);
 void *amdgpu_gem_prime_vmap(struct drm_gem_object *obj);
 void amdgpu_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 6c8ae59d4d94..88ec9280a67a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -885,8 +885,6 @@ static struct drm_driver kms_driver = {
.prime_fd_to_handle = drm_gem_prime_fd_to_handle,
.gem_prime_export = amdgpu_gem_prime_export,
.gem_prime_import = amdgpu_gem_prime_import,
-   .gem_prime_pin = amdgpu_gem_prime_pin,
-   .gem_prime_unpin = amdgpu_gem_prime_unpin,
.gem_prime_res_obj = amdgpu_gem_prime_res_obj,
.gem_prime_get_sg_table = amdgpu_gem_prime_get_sg_table,
.gem_prime_import_sg_table = amdgpu_gem_prime_import_sg_table,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
index 2a8d980d17f6..f6d7f6404a07 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
@@ -113,49 +113,65 @@ amdgpu_gem_prime_import_sg_table(struct drm_device *dev,
return >gem_base;
 }
 
-int amdgpu_gem_prime_pin(struct drm_gem_object *obj)
+static int amdgpu_gem_map_attach(struct dma_buf *dma_buf,
+struct device *target_dev,
+struct dma_buf_attachment *attach)
 {
+   struct drm_gem_object *obj = dma_buf->priv;
struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
-   long ret = 0;
+   long r;
 
-   ret = amdgpu_bo_reserve(bo, false);
-   if (unlikely(ret != 0))
-   return ret;
+   r = drm_gem_map_attach(dma_buf, target_dev, attach);
+   if (r)
+   return r;
+
+   r = amdgpu_bo_reserve(bo, false);
+   if (unlikely(r != 0))
+   goto error_detach;
 
/*
 * Wait for all shared fences to complete before we switch to future
 * use of exclusive fence on this prime shared bo.
 */
-   ret = reservation_object_wait_timeout_rcu(bo->tbo.resv, true, false,
- MAX_SCHEDULE_TIMEOUT);
-   if (unlikely(ret < 0)) {
-   DRM_DEBUG_PRIME("Fence wait failed: %li\n", ret);
-   amdgpu_bo_unreserve(bo);
-   return ret;
+   r = reservation_object_wait_timeout_rcu(bo->tbo.resv, true, false,
+   MAX_SCHEDULE_TIMEOUT);
+   if (unlikely(r < 0)) {
+   DRM_DEBUG_PRIME("Fence wait failed: %li\n", r);
+   goto error_unreserve;
}
 
/* pin buffer into GTT */
-   ret = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT, NULL);
-   if (likely(ret == 0))
+   r = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT, NULL);
+   if (likely(r == 0))
bo->prime_shared_count++;
 
+error_unreserve:
amdgpu_bo_unreserve(bo);
-   return ret;
+
+error_detach:
+   if (r)
+   drm_gem_map_detach(dma_buf, attach);
+   return r;
 }
 
-void amdgpu_gem_prime_unpin(struct drm_gem_object *obj)
+static void amdgpu_gem_map_detach(struct dma_buf *dma_buf,
+ struct dma_buf_attachment *attach)
 {
+   struct drm_gem_object *obj = dma_buf->priv;
struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
int ret = 0;
 
ret = amdgpu_bo_reserve(bo, true);
if (unlikely(ret != 0))
-   return;
+   goto error;
 
amdgpu_bo_unpin(bo);
if (bo->prime_shared_count)
bo->prime_shared_count--;
amdgpu_bo_unreserve(bo);
+
+error:
+   drm_gem_map_detach(dma_buf, attach);
 }
 
 struct reservation_object *amdgpu_gem_prime_res_obj(struct drm_gem_object *obj)
@@ -194,8 +210,8 @@ static