[PATCH 2/2] drm/amdgpu: add independent DMA-buf import v9

Christian König ckoenig.leichtzumerken at gmail.com
Mon Oct 28 16:05:52 UTC 2019


Thanks, as discussed internally I've just pushed those two to 
drm-misc-next instead of amd-staging-drm-next.

Christian.

Am 28.10.19 um 16:38 schrieb Deucher, Alexander:
> Series is:
> Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ------------------------------------------------------------------------
> *From:* amd-gfx <amd-gfx-bounces at lists.freedesktop.org> on behalf of 
> Christian König <ckoenig.leichtzumerken at gmail.com>
> *Sent:* Monday, October 28, 2019 11:14 AM
> *To:* amd-gfx at lists.freedesktop.org <amd-gfx at lists.freedesktop.org>
> *Subject:* [PATCH 2/2] drm/amdgpu: add independent DMA-buf import v9
> Instead of relying on the DRM functions just implement our own import
> functions. This prepares support for taking care of unpinned DMA-buf.
>
> v2: enable for all exporters, not just amdgpu, fix invalidation
>     handling, lock reservation object while setting callback
> v3: change to new dma_buf attach interface
> v4: split out from unpinned DMA-buf work
> v5: rebased and cleanup on new DMA-buf interface
> v6: squash with invalidation callback change,
>     stop using _(map|unmap)_locked
> v7: drop invalidations when the BO is already in system domain
> v8: rebase on new DMA-buf patch and drop move notification
> v9: cleanup comments
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c | 43 ++++++++++++---------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.h |  4 --
>  drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c     |  1 -
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c     | 32 ++++++++++++---
>  4 files changed, 52 insertions(+), 28 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
> index f14b52cc7205..d5bcdfefbad6 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
> @@ -370,31 +370,28 @@ struct dma_buf *amdgpu_gem_prime_export(struct 
> drm_gem_object *gobj,
>  }
>
>  /**
> - * amdgpu_gem_prime_import_sg_table - 
> &drm_driver.gem_prime_import_sg_table
> - * implementation
> + * amdgpu_dma_buf_create_obj - create BO for DMA-buf import
> + *
>   * @dev: DRM device
> - * @attach: DMA-buf attachment
> - * @sg: Scatter/gather table
> + * @dma_buf: DMA-buf
>   *
> - * Imports shared DMA buffer memory exported by another device.
> + * Creates an empty SG BO for DMA-buf import.
>   *
>   * Returns:
>   * A new GEM BO of the given DRM device, representing the memory
>   * described by the given DMA-buf attachment and scatter/gather table.
>   */
> -struct drm_gem_object *
> -amdgpu_gem_prime_import_sg_table(struct drm_device *dev,
> -                                struct dma_buf_attachment *attach,
> -                                struct sg_table *sg)
> +static struct drm_gem_object *
> +amdgpu_dma_buf_create_obj(struct drm_device *dev, struct dma_buf 
> *dma_buf)
>  {
> -       struct dma_resv *resv = attach->dmabuf->resv;
> +       struct dma_resv *resv = dma_buf->resv;
>          struct amdgpu_device *adev = dev->dev_private;
>          struct amdgpu_bo *bo;
>          struct amdgpu_bo_param bp;
>          int ret;
>
>          memset(&bp, 0, sizeof(bp));
> -       bp.size = attach->dmabuf->size;
> +       bp.size = dma_buf->size;
>          bp.byte_align = PAGE_SIZE;
>          bp.domain = AMDGPU_GEM_DOMAIN_CPU;
>          bp.flags = 0;
> @@ -405,11 +402,9 @@ amdgpu_gem_prime_import_sg_table(struct 
> drm_device *dev,
>          if (ret)
>                  goto error;
>
> -       bo->tbo.sg = sg;
> -       bo->tbo.ttm->sg = sg;
>          bo->allowed_domains = AMDGPU_GEM_DOMAIN_GTT;
>          bo->preferred_domains = AMDGPU_GEM_DOMAIN_GTT;
> -       if (attach->dmabuf->ops != &amdgpu_dmabuf_ops)
> +       if (dma_buf->ops != &amdgpu_dmabuf_ops)
>                  bo->prime_shared_count = 1;
>
>          dma_resv_unlock(resv);
> @@ -425,15 +420,15 @@ amdgpu_gem_prime_import_sg_table(struct 
> drm_device *dev,
>   * @dev: DRM device
>   * @dma_buf: Shared DMA buffer
>   *
> - * The main work is done by the &drm_gem_prime_import helper, which 
> in turn
> - * uses &amdgpu_gem_prime_import_sg_table.
> + * Import a dma_buf into a the driver and potentially create a new 
> GEM object.
>   *
>   * Returns:
>   * GEM BO representing the shared DMA buffer for the given device.
>   */
>  struct drm_gem_object *amdgpu_gem_prime_import(struct drm_device *dev,
> -                                           struct dma_buf *dma_buf)
> +                                              struct dma_buf *dma_buf)
>  {
> +       struct dma_buf_attachment *attach;
>          struct drm_gem_object *obj;
>
>          if (dma_buf->ops == &amdgpu_dmabuf_ops) {
> @@ -448,5 +443,17 @@ struct drm_gem_object 
> *amdgpu_gem_prime_import(struct drm_device *dev,
>                  }
>          }
>
> -       return drm_gem_prime_import(dev, dma_buf);
> +       obj = amdgpu_dma_buf_create_obj(dev, dma_buf);
> +       if (IS_ERR(obj))
> +               return obj;
> +
> +       attach = dma_buf_dynamic_attach(dma_buf, dev->dev, true);
> +       if (IS_ERR(attach)) {
> +               drm_gem_object_put(obj);
> +               return ERR_CAST(attach);
> +       }
> +
> +       get_dma_buf(dma_buf);
> +       obj->import_attach = attach;
> +       return obj;
>  }
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.h
> index ce1b3f017451..ec447a7b6b28 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.h
> @@ -25,10 +25,6 @@
>
>  #include <drm/drm_gem.h>
>
> -struct drm_gem_object *
> -amdgpu_gem_prime_import_sg_table(struct drm_device *dev,
> -                                struct dma_buf_attachment *attach,
> -                                struct sg_table *sg);
>  struct dma_buf *amdgpu_gem_prime_export(struct drm_gem_object *gobj,
>                                          int flags);
>  struct drm_gem_object *amdgpu_gem_prime_import(struct drm_device *dev,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> index 8805776c8c52..25adf2b847e8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> @@ -1445,7 +1445,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_import_sg_table = amdgpu_gem_prime_import_sg_table,
>          .gem_prime_vmap = amdgpu_gem_prime_vmap,
>          .gem_prime_vunmap = amdgpu_gem_prime_vunmap,
>          .gem_prime_mmap = amdgpu_gem_prime_mmap,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index 8e867b8b432f..c19100ced040 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -39,6 +39,7 @@
>  #include <linux/slab.h>
>  #include <linux/swap.h>
>  #include <linux/swiotlb.h>
> +#include <linux/dma-buf.h>
>
>  #include <drm/ttm/ttm_bo_api.h>
>  #include <drm/ttm/ttm_bo_driver.h>
> @@ -763,6 +764,7 @@ static unsigned long amdgpu_ttm_io_mem_pfn(struct 
> ttm_buffer_object *bo,
>   */
>  struct amdgpu_ttm_tt {
>          struct ttm_dma_tt       ttm;
> +       struct drm_gem_object   *gobj;
>          u64                     offset;
>          uint64_t                userptr;
>          struct task_struct      *usertask;
> @@ -1227,6 +1229,7 @@ static struct ttm_tt 
> *amdgpu_ttm_tt_create(struct ttm_buffer_object *bo,
>                  return NULL;
>          }
>          gtt->ttm.ttm.func = &amdgpu_backend_func;
> +       gtt->gobj = &bo->base;
>
>          /* allocate space for the uninitialized page entries */
>          if (ttm_sg_tt_init(&gtt->ttm, bo, page_flags)) {
> @@ -1247,7 +1250,6 @@ static int amdgpu_ttm_tt_populate(struct ttm_tt 
> *ttm,
>  {
>          struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev);
>          struct amdgpu_ttm_tt *gtt = (void *)ttm;
> -       bool slave = !!(ttm->page_flags & TTM_PAGE_FLAG_SG);
>
>          /* user pages are bound by amdgpu_ttm_tt_pin_userptr() */
>          if (gtt && gtt->userptr) {
> @@ -1260,7 +1262,19 @@ static int amdgpu_ttm_tt_populate(struct ttm_tt 
> *ttm,
>                  return 0;
>          }
>
> -       if (slave && ttm->sg) {
> +       if (ttm->page_flags & TTM_PAGE_FLAG_SG) {
> +               if (!ttm->sg) {
> +                       struct dma_buf_attachment *attach;
> +                       struct sg_table *sgt;
> +
> +                       attach = gtt->gobj->import_attach;
> +                       sgt = dma_buf_map_attachment(attach, 
> DMA_BIDIRECTIONAL);
> +                       if (IS_ERR(sgt))
> +                               return PTR_ERR(sgt);
> +
> +                       ttm->sg = sgt;
> +               }
> +
> drm_prime_sg_to_page_addr_arrays(ttm->sg, ttm->pages,
> gtt->ttm.dma_address,
> ttm->num_pages);
> @@ -1287,9 +1301,8 @@ static int amdgpu_ttm_tt_populate(struct ttm_tt 
> *ttm,
>   */
>  static void amdgpu_ttm_tt_unpopulate(struct ttm_tt *ttm)
>  {
> -       struct amdgpu_device *adev;
>          struct amdgpu_ttm_tt *gtt = (void *)ttm;
> -       bool slave = !!(ttm->page_flags & TTM_PAGE_FLAG_SG);
> +       struct amdgpu_device *adev;
>
>          if (gtt && gtt->userptr) {
>                  amdgpu_ttm_tt_set_user_pages(ttm, NULL);
> @@ -1298,7 +1311,16 @@ static void amdgpu_ttm_tt_unpopulate(struct 
> ttm_tt *ttm)
>                  return;
>          }
>
> -       if (slave)
> +       if (ttm->sg && gtt->gobj->import_attach) {
> +               struct dma_buf_attachment *attach;
> +
> +               attach = gtt->gobj->import_attach;
> +               dma_buf_unmap_attachment(attach, ttm->sg, 
> DMA_BIDIRECTIONAL);
> +               ttm->sg = NULL;
> +               return;
> +       }
> +
> +       if (ttm->page_flags & TTM_PAGE_FLAG_SG)
>                  return;
>
>          adev = amdgpu_ttm_adev(ttm->bdev);
> -- 
> 2.17.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/amd-gfx/attachments/20191028/59fb9959/attachment-0001.html>


More information about the amd-gfx mailing list