diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1471-drm-amdgpu-Add-kfd2kgd-API-for-submitting-IB.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1471-drm-amdgpu-Add-kfd2kgd-API-for-submitting-IB.patch | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1471-drm-amdgpu-Add-kfd2kgd-API-for-submitting-IB.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1471-drm-amdgpu-Add-kfd2kgd-API-for-submitting-IB.patch new file mode 100644 index 00000000..1e2a7a36 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1471-drm-amdgpu-Add-kfd2kgd-API-for-submitting-IB.patch @@ -0,0 +1,154 @@ +From 8993ec870c61b7e8260d699fd13db4500d6ae13d Mon Sep 17 00:00:00 2001 +From: Amber Lin <Amber.Lin@amd.com> +Date: Fri, 8 Jul 2016 15:53:47 -0400 +Subject: [PATCH 1471/4131] drm/amdgpu: Add kfd2kgd API for submitting IB + +This interface allows KFD to submit IB to a specific engine and VMID. + +BUG: SWDEV-93847 + +Signed-off-by: Amber Lin <Amber.Lin@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 55 +++++++++++++++++++++++ + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 3 ++ + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 3 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 3 +- + drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 7 ++- + 5 files changed, 68 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +index ea5372b..9e0ddbb 100755 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +@@ -272,6 +272,61 @@ void amdgpu_amdkfd_cancel_restore_mem(struct amdgpu_device *adev, + cancel_delayed_work_sync(&mem->data2.work); + } + ++int amdgpu_amdkfd_submit_ib(struct kgd_dev *kgd, enum kgd_engine_type engine, ++ uint32_t vmid, uint64_t gpu_addr, ++ uint32_t *ib_cmd, uint32_t ib_len) ++{ ++ struct amdgpu_device *adev = (struct amdgpu_device *)kgd; ++ struct amdgpu_job *job; ++ struct amdgpu_ib *ib; ++ struct amdgpu_ring *ring; ++ struct fence *f = NULL; ++ int ret; ++ ++ switch (engine) { ++ case KGD_ENGINE_MEC1: ++ ring = &adev->gfx.compute_ring[0]; ++ break; ++ case KGD_ENGINE_SDMA1: ++ ring = &adev->sdma.instance[0].ring; ++ break; ++ case KGD_ENGINE_SDMA2: ++ ring = &adev->sdma.instance[1].ring; ++ break; ++ default: ++ pr_err("Invalid engine in IB submission: %d\n", engine); ++ ret = -EINVAL; ++ goto err; ++ } ++ ++ ret = amdgpu_job_alloc(adev, 1, &job, NULL); ++ if (ret) ++ goto err; ++ ++ ib = &job->ibs[0]; ++ memset(ib, 0, sizeof(struct amdgpu_ib)); ++ ++ ib->gpu_addr = gpu_addr; ++ ib->ptr = ib_cmd; ++ ib->length_dw = ib_len; ++ /* This works for NO_HWS. TODO: need to handle without knowing VMID */ ++ job->vm_id = vmid; ++ ++ ret = amdgpu_ib_schedule(ring, 1, ib, NULL, job, &f); ++ if (ret) { ++ DRM_ERROR("amdgpu: failed to schedule IB.\n"); ++ goto err_ib_sched; ++ } ++ ++ ret = fence_wait(f, false); ++ ++err_ib_sched: ++ fence_put(f); ++ amdgpu_job_free(job); ++err: ++ return ret; ++} ++ + u32 pool_to_domain(enum kgd_memory_pool p) + { + switch (p) { +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +index bbf3404..70b8652 100755 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +@@ -91,6 +91,9 @@ int amdgpu_amdkfd_schedule_restore_mem(struct amdgpu_device *adev, + unsigned long delay); + void amdgpu_amdkfd_cancel_restore_mem(struct amdgpu_device *adev, + struct kgd_mem *mem); ++int amdgpu_amdkfd_submit_ib(struct kgd_dev *kgd, enum kgd_engine_type engine, ++ uint32_t vmid, uint64_t gpu_addr, ++ uint32_t *ib_cmd, uint32_t ib_len); + + struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions(void); + struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions(void); +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c +index 3e42eaa..65b5e2b 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c +@@ -197,7 +197,8 @@ static const struct kfd2kgd_calls kfd2kgd = { + .unpin_put_sg_table_bo = amdgpu_amdkfd_gpuvm_unpin_put_sg_table, + .get_dmabuf_info = amdgpu_amdkfd_get_dmabuf_info, + .import_dmabuf = amdgpu_amdkfd_gpuvm_import_dmabuf, +- .get_vm_fault_info = amdgpu_amdkfd_gpuvm_get_vm_fault_info ++ .get_vm_fault_info = amdgpu_amdkfd_gpuvm_get_vm_fault_info, ++ .submit_ib = amdgpu_amdkfd_submit_ib + }; + + struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions() +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c +index ad92de6..af2fcec 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c +@@ -179,7 +179,8 @@ static const struct kfd2kgd_calls kfd2kgd = { + .unpin_put_sg_table_bo = amdgpu_amdkfd_gpuvm_unpin_put_sg_table, + .get_dmabuf_info = amdgpu_amdkfd_get_dmabuf_info, + .import_dmabuf = amdgpu_amdkfd_gpuvm_import_dmabuf, +- .get_vm_fault_info = amdgpu_amdkfd_gpuvm_get_vm_fault_info ++ .get_vm_fault_info = amdgpu_amdkfd_gpuvm_get_vm_fault_info, ++ .submit_ib = amdgpu_amdkfd_submit_ib + }; + + struct kfd2kgd_calls *amdgpu_amdkfd_gfx_8_0_get_functions() +diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +index 3db537b..4ab5eb6 100644 +--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h ++++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +@@ -205,6 +205,9 @@ struct kgd2kfd_shared_resources { + * @import_dmabuf: Imports a DMA buffer, creating a new kgd_mem object + * Supports only DMA buffers created by GPU driver on the same GPU + * ++ * @submit_ib: Submits an IB to the engine specified by inserting the IB to ++ * the corresonded ring (ring type). ++ * + * This structure contains function pointers to services that the kgd driver + * provides to amdkfd driver. + * +@@ -339,7 +342,9 @@ struct kfd2kgd_calls { + + int (*get_vm_fault_info)(struct kgd_dev *kgd, + struct kfd_vm_fault_info *info); +- ++ int (*submit_ib)(struct kgd_dev *kgd, enum kgd_engine_type engine, ++ uint32_t vmid, uint64_t gpu_addr, ++ uint32_t *ib_cmd, uint32_t ib_len); + }; + + /** +-- +2.7.4 + |