diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4254-drm-amdkfd-CMA-Remove-diff.-device-restriction.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/4254-drm-amdkfd-CMA-Remove-diff.-device-restriction.patch | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4254-drm-amdkfd-CMA-Remove-diff.-device-restriction.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4254-drm-amdkfd-CMA-Remove-diff.-device-restriction.patch new file mode 100644 index 00000000..bb79eff3 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4254-drm-amdkfd-CMA-Remove-diff.-device-restriction.patch @@ -0,0 +1,102 @@ +From ce3bd835c235507674e471acc612104da3eeec45 Mon Sep 17 00:00:00 2001 +From: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com> +Date: Fri, 6 Apr 2018 18:07:25 -0400 +Subject: [PATCH 4254/5725] drm/amdkfd: CMA: Remove diff. device restriction + +CMA is supported in certain situations if the BOs are registered to differnt +devices. They are - + +a) If both source and destination are userptr then device doens't matter +as CPU is used to copy. +b) If one of them is a userptr, then the shadow system BO will be created +on the other device. So the copy will done by that device. + +The non supported cases are - + +a) The system BOs are always registered to the first device. So if one +BO is system and the other BO is a local memory in different device then +it is not supported currently. +b) If both BOs are in local memory of different devices then it is not +supported. + +BUG:SWDEV-146559 + +Change-Id: I0ff5426402c147dd19ec15abafd18807ecca25fe +Signed-off-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com> +--- + drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 21 ++++++++++----------- + 1 file changed, 10 insertions(+), 11 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +index d1a18c9..a216225 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +@@ -2118,6 +2118,7 @@ static int kfd_copy_bos(struct cma_iter *si, struct cma_iter *di, + struct kfd_bo *dst_bo = di->cur_bo, *src_bo = si->cur_bo; + uint64_t src_offset = si->bo_offset, dst_offset = di->bo_offset; + struct kgd_mem *src_mem = src_bo->mem, *dst_mem = dst_bo->mem; ++ struct kfd_dev *dev = dst_bo->dev; + + *copied = 0; + if (f) +@@ -2129,11 +2130,14 @@ static int kfd_copy_bos(struct cma_iter *si, struct cma_iter *di, + * by using the underlying userptr BO pages. Then use this shadow + * BO for copy. src_offset & dst_offset are adjusted because the new BO + * is only created for the window (offset, size) requested. ++ * The shadow BO is created on the other device. This means if the ++ * other BO is a device memory, the copy will be using that device. + * The BOs are stored in cma_list for deferred cleanup. This minimizes + * fence waiting just to the last fence. + */ + if (src_bo->cpuva) { +- err = kfd_create_cma_system_bo(dst_bo->dev, src_bo, &size, ++ dev = dst_bo->dev; ++ err = kfd_create_cma_system_bo(dev, src_bo, &size, + si->bo_offset, cma_write, + si->p, si->mm, si->task, + &si->cma_bo); +@@ -2141,7 +2145,8 @@ static int kfd_copy_bos(struct cma_iter *si, struct cma_iter *di, + src_offset = si->bo_offset & (PAGE_SIZE - 1); + list_add_tail(&si->cma_bo->list, &si->cma_list); + } else if (dst_bo->cpuva) { +- err = kfd_create_cma_system_bo(src_bo->dev, dst_bo, &size, ++ dev = src_bo->dev; ++ err = kfd_create_cma_system_bo(dev, dst_bo, &size, + di->bo_offset, cma_write, + di->p, di->mm, di->task, + &di->cma_bo); +@@ -2150,15 +2155,15 @@ static int kfd_copy_bos(struct cma_iter *si, struct cma_iter *di, + list_add_tail(&di->cma_bo->list, &di->cma_list); + } else if (src_bo->dev->kgd != dst_bo->dev->kgd) { + pr_err("CMA %d fail. Not same dev\n", cma_write); +- err = -EINVAL; ++ return -EINVAL; + } + + if (err) { + pr_err("Failed to create system BO %d", err); +- err = -EINVAL; ++ return -EINVAL; + } + +- err = dst_bo->dev->kfd2kgd->copy_mem_to_mem(src_bo->dev->kgd, src_mem, ++ err = dst_bo->dev->kfd2kgd->copy_mem_to_mem(dev->kgd, src_mem, + src_offset, dst_mem, + dst_offset, size, f, + copied); +@@ -2193,12 +2198,6 @@ static int kfd_copy_single_range(struct cma_iter *si, struct cma_iter *di, + + copy_size = min(size, (di->array->size - di->offset)); + +- /* Check both BOs belong to same device */ +- if (src_bo->dev->kgd != dst_bo->dev->kgd) { +- pr_err("CMA fail. Not same dev\n"); +- return -EINVAL; +- } +- + err = kfd_copy_bos(si, di, cma_write, copy_size, &fence, &n); + if (err) { + pr_err("CMA %d failed\n", err); +-- +2.7.4 + |