diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/Makefile | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c (renamed from drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c) | 131 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.h | 46 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h | 16 | 
7 files changed, 116 insertions, 83 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile b/drivers/gpu/drm/amd/amdgpu/Makefile index fdd0ca4b0f0b..9ca3b4b261b5 100644 --- a/drivers/gpu/drm/amd/amdgpu/Makefile +++ b/drivers/gpu/drm/amd/amdgpu/Makefile @@ -49,7 +49,7 @@ amdgpu-y += amdgpu_device.o amdgpu_kms.o \  	amdgpu_cs.o amdgpu_bios.o amdgpu_benchmark.o amdgpu_test.o \  	amdgpu_pm.o atombios_dp.o amdgpu_afmt.o amdgpu_trace_points.o \  	atombios_encoders.o amdgpu_sa.o atombios_i2c.o \ -	amdgpu_prime.o amdgpu_vm.o amdgpu_ib.o amdgpu_pll.o \ +	amdgpu_dma_buf.o amdgpu_vm.o amdgpu_ib.o amdgpu_pll.o \  	amdgpu_ucode.o amdgpu_bo_list.o amdgpu_ctx.o amdgpu_sync.o \  	amdgpu_gtt_mgr.o amdgpu_vram_mgr.o amdgpu_virt.o amdgpu_atomfirmware.o \  	amdgpu_vf_error.o amdgpu_sched.o amdgpu_debugfs.o amdgpu_ids.o \ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c index 2e2a2617134b..98326e3b5619 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c @@ -25,6 +25,7 @@  #include <drm/drmP.h>  #include "amdgpu.h"  #include "amdgpu_gfx.h" +#include "amdgpu_dma_buf.h"  #include <linux/module.h>  #include <linux/dma-buf.h>  #include "amdgpu_xgmi.h" diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index d39cb36b4830..5b4fff9a1509 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c @@ -30,6 +30,7 @@  #include "amdgpu_object.h"  #include "amdgpu_vm.h"  #include "amdgpu_amdkfd.h" +#include "amdgpu_dma_buf.h"  /* Special VM and GART address alignment needed for VI pre-Fiji due to   * a HW bug. diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c index a38e0fb4a6fe..4711cf1b5bd2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c @@ -1,5 +1,5 @@  /* - * Copyright 2012 Advanced Micro Devices, Inc. + * Copyright 2019 Advanced Micro Devices, Inc.   *   * Permission is hereby granted, free of charge, to any person obtaining a   * copy of this software and associated documentation files (the "Software"), @@ -103,7 +103,8 @@ void amdgpu_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)   * Returns:   * 0 on success or a negative error code on failure.   */ -int amdgpu_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma) +int amdgpu_gem_prime_mmap(struct drm_gem_object *obj, +			  struct vm_area_struct *vma)  {  	struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);  	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); @@ -137,57 +138,6 @@ int amdgpu_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma  	return ret;  } -/** - * amdgpu_gem_prime_import_sg_table - &drm_driver.gem_prime_import_sg_table - * implementation - * @dev: DRM device - * @attach: DMA-buf attachment - * @sg: Scatter/gather table - * - * Imports shared DMA buffer memory exported by another device. - * - * 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) -{ -	struct reservation_object *resv = attach->dmabuf->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.byte_align = PAGE_SIZE; -	bp.domain = AMDGPU_GEM_DOMAIN_CPU; -	bp.flags = 0; -	bp.type = ttm_bo_type_sg; -	bp.resv = resv; -	ww_mutex_lock(&resv->lock, NULL); -	ret = amdgpu_bo_create(adev, &bp, &bo); -	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) -		bo->prime_shared_count = 1; - -	ww_mutex_unlock(&resv->lock); -	return &bo->gem_base; - -error: -	ww_mutex_unlock(&resv->lock); -	return ERR_PTR(ret); -} -  static int  __reservation_object_make_exclusive(struct reservation_object *obj)  { @@ -231,7 +181,7 @@ err_fences_put:  }  /** - * amdgpu_gem_map_attach - &dma_buf_ops.attach implementation + * amdgpu_dma_buf_map_attach - &dma_buf_ops.attach implementation   * @dma_buf: Shared DMA buffer   * @attach: DMA-buf attachment   * @@ -242,8 +192,8 @@ err_fences_put:   * Returns:   * 0 on success or a negative error code on failure.   */ -static int amdgpu_gem_map_attach(struct dma_buf *dma_buf, -				 struct dma_buf_attachment *attach) +static int amdgpu_dma_buf_map_attach(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); @@ -291,15 +241,15 @@ error_detach:  }  /** - * amdgpu_gem_map_detach - &dma_buf_ops.detach implementation + * amdgpu_dma_buf_map_detach - &dma_buf_ops.detach implementation   * @dma_buf: Shared DMA buffer   * @attach: DMA-buf attachment   *   * This is called when a shared DMA buffer no longer needs to be accessible by   * another device. For now, simply unpins the buffer from GTT.   */ -static void amdgpu_gem_map_detach(struct dma_buf *dma_buf, -				  struct dma_buf_attachment *attach) +static void amdgpu_dma_buf_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); @@ -334,7 +284,7 @@ struct reservation_object *amdgpu_gem_prime_res_obj(struct drm_gem_object *obj)  }  /** - * amdgpu_gem_begin_cpu_access - &dma_buf_ops.begin_cpu_access implementation + * amdgpu_dma_buf_begin_cpu_access - &dma_buf_ops.begin_cpu_access implementation   * @dma_buf: Shared DMA buffer   * @direction: Direction of DMA transfer   * @@ -345,8 +295,8 @@ struct reservation_object *amdgpu_gem_prime_res_obj(struct drm_gem_object *obj)   * Returns:   * 0 on success or a negative error code on failure.   */ -static int amdgpu_gem_begin_cpu_access(struct dma_buf *dma_buf, -				       enum dma_data_direction direction) +static int amdgpu_dma_buf_begin_cpu_access(struct dma_buf *dma_buf, +					   enum dma_data_direction direction)  {  	struct amdgpu_bo *bo = gem_to_amdgpu_bo(dma_buf->priv);  	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); @@ -374,12 +324,12 @@ static int amdgpu_gem_begin_cpu_access(struct dma_buf *dma_buf,  }  const struct dma_buf_ops amdgpu_dmabuf_ops = { -	.attach = amdgpu_gem_map_attach, -	.detach = amdgpu_gem_map_detach, +	.attach = amdgpu_dma_buf_map_attach, +	.detach = amdgpu_dma_buf_map_detach,  	.map_dma_buf = drm_gem_map_dma_buf,  	.unmap_dma_buf = drm_gem_unmap_dma_buf,  	.release = drm_gem_dmabuf_release, -	.begin_cpu_access = amdgpu_gem_begin_cpu_access, +	.begin_cpu_access = amdgpu_dma_buf_begin_cpu_access,  	.mmap = drm_gem_dmabuf_mmap,  	.vmap = drm_gem_dmabuf_vmap,  	.vunmap = drm_gem_dmabuf_vunmap, @@ -418,6 +368,57 @@ struct dma_buf *amdgpu_gem_prime_export(struct drm_device *dev,  }  /** + * amdgpu_gem_prime_import_sg_table - &drm_driver.gem_prime_import_sg_table + * implementation + * @dev: DRM device + * @attach: DMA-buf attachment + * @sg: Scatter/gather table + * + * Imports shared DMA buffer memory exported by another device. + * + * 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) +{ +	struct reservation_object *resv = attach->dmabuf->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.byte_align = PAGE_SIZE; +	bp.domain = AMDGPU_GEM_DOMAIN_CPU; +	bp.flags = 0; +	bp.type = ttm_bo_type_sg; +	bp.resv = resv; +	ww_mutex_lock(&resv->lock, NULL); +	ret = amdgpu_bo_create(adev, &bp, &bo); +	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) +		bo->prime_shared_count = 1; + +	ww_mutex_unlock(&resv->lock); +	return &bo->gem_base; + +error: +	ww_mutex_unlock(&resv->lock); +	return ERR_PTR(ret); +} + +/**   * amdgpu_gem_prime_import - &drm_driver.gem_prime_import implementation   * @dev: DRM device   * @dma_buf: Shared DMA buffer diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.h new file mode 100644 index 000000000000..c7056cbe8685 --- /dev/null +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.h @@ -0,0 +1,46 @@ +/* + * Copyright 2019 Advanced Micro Devices, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + */ +#ifndef __AMDGPU_DMA_BUF_H__ +#define __AMDGPU_DMA_BUF_H__ + +#include <drm/drm_gem.h> + +struct sg_table *amdgpu_gem_prime_get_sg_table(struct drm_gem_object *obj); +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_device *dev, +					struct drm_gem_object *gobj, +					int flags); +struct drm_gem_object *amdgpu_gem_prime_import(struct drm_device *dev, +					    struct dma_buf *dma_buf); +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); +int amdgpu_gem_prime_mmap(struct drm_gem_object *obj, +			  struct vm_area_struct *vma); + +extern const struct dma_buf_ops amdgpu_dmabuf_ops; + +#endif diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 5924d89e0aee..8fd8807272a7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -36,7 +36,7 @@  #include "amdgpu.h"  #include "amdgpu_irq.h" -#include "amdgpu_gem.h" +#include "amdgpu_dma_buf.h"  #include "amdgpu_amdkfd.h" diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h index f1ddfc50bcc7..b8ba6e27c61f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h @@ -39,22 +39,6 @@ int amdgpu_gem_object_open(struct drm_gem_object *obj,  void amdgpu_gem_object_close(struct drm_gem_object *obj,  				struct drm_file *file_priv);  unsigned long amdgpu_gem_timeout(uint64_t timeout_ns); -struct sg_table *amdgpu_gem_prime_get_sg_table(struct drm_gem_object *obj); -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_device *dev, -					struct drm_gem_object *gobj, -					int flags); -struct drm_gem_object *amdgpu_gem_prime_import(struct drm_device *dev, -					    struct dma_buf *dma_buf); -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); -int amdgpu_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); - -extern const struct dma_buf_ops amdgpu_dmabuf_ops;  /*   * GEM objects.  | 

