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

Alex Deucher alexdeucher at gmail.com
Mon Feb 19 14:00:46 UTC 2018


On Mon, Feb 19, 2018 at 8:57 AM, Christian König
<ckoenig.leichtzumerken at gmail.com> 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 <christian.koenig at amd.com>

Series is:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  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 &bo->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 int amdgpu_gem_begin_cpu_access(struct dma_buf *dma_buf,
>  }
>
>  static const struct dma_buf_ops amdgpu_dmabuf_ops = {
> -       .attach = drm_gem_map_attach,
> -       .detach = drm_gem_map_detach,
> +       .attach = amdgpu_gem_map_attach,
> +       .detach = amdgpu_gem_map_detach,
>         .map_dma_buf = drm_gem_map_dma_buf,
>         .unmap_dma_buf = drm_gem_unmap_dma_buf,
>         .release = drm_gem_dmabuf_release,
> --
> 2.14.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list