diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3794-drm-amdgpu-allow-direct-submission-in-the-VM-backend.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3794-drm-amdgpu-allow-direct-submission-in-the-VM-backend.patch | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3794-drm-amdgpu-allow-direct-submission-in-the-VM-backend.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3794-drm-amdgpu-allow-direct-submission-in-the-VM-backend.patch new file mode 100644 index 00000000..58d83a26 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3794-drm-amdgpu-allow-direct-submission-in-the-VM-backend.patch @@ -0,0 +1,141 @@ +From ea045338c36f33e51a493279523a73951faeebaa Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> +Date: Wed, 27 Mar 2019 13:16:18 +0100 +Subject: [PATCH 3794/4256] drm/amdgpu: allow direct submission in the VM + backends v2 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This allows us to update page tables directly while in a page fault. + +v2: use direct/delayed entities and still wait for moves + +Signed-off-by: Christian König <christian.koenig@amd.com> +Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 5 +++++ + drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.c | 16 ++++++------- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c | 25 +++++++++++---------- + 3 files changed, 26 insertions(+), 20 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +index 8bb6d0a5c55d..7aa15714d600 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +@@ -201,6 +201,11 @@ struct amdgpu_vm_update_params { + */ + struct amdgpu_vm *vm; + ++ /** ++ * @direct: if changes should be made directly ++ */ ++ bool direct; ++ + /** + * @pages_addr: + * +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.c +index 5222d165abfc..a2daeadd770f 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.c +@@ -49,13 +49,6 @@ static int amdgpu_vm_cpu_prepare(struct amdgpu_vm_update_params *p, void *owner, + { + int r; + +- /* Wait for PT BOs to be idle. PTs share the same resv. object +- * as the root PD BO +- */ +- r = amdgpu_bo_sync_wait(p->vm->root.base.bo, owner, true); +- if (unlikely(r)) +- return r; +- + /* Wait for any BO move to be completed */ + if (exclusive) { + r = dma_fence_wait(exclusive, true); +@@ -63,7 +56,14 @@ static int amdgpu_vm_cpu_prepare(struct amdgpu_vm_update_params *p, void *owner, + return r; + } + +- return 0; ++ /* Don't wait for submissions during page fault */ ++ if (p->direct) ++ return 0; ++ ++ /* Wait for PT BOs to be idle. PTs share the same resv. object ++ * as the root PD BO ++ */ ++ return amdgpu_bo_sync_wait(p->vm->root.base.bo, owner, true); + } + + /** +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c +index d087d6650d79..38c966cedc26 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c +@@ -68,17 +68,19 @@ static int amdgpu_vm_sdma_prepare(struct amdgpu_vm_update_params *p, + if (r) + return r; + ++ p->num_dw_left = ndw; ++ ++ /* Wait for moves to be completed */ + r = amdgpu_sync_fence(p->adev, &p->job->sync, exclusive, false); + if (r) + return r; + +- r = amdgpu_sync_resv(p->adev, &p->job->sync, root->tbo.resv, +- owner, false); +- if (r) +- return r; ++ /* Don't wait for any submissions during page fault handling */ ++ if (p->direct) ++ return 0; + +- p->num_dw_left = ndw; +- return 0; ++ return amdgpu_sync_resv(p->adev, &p->job->sync, root->tbo.resv, ++ owner, false); + } + + /** +@@ -95,23 +97,23 @@ static int amdgpu_vm_sdma_commit(struct amdgpu_vm_update_params *p, + { + struct amdgpu_bo *root = p->vm->root.base.bo; + struct amdgpu_ib *ib = p->job->ibs; ++ struct drm_sched_entity *entity; + struct amdgpu_ring *ring; + struct dma_fence *f; + int r; + +- ring = container_of(p->vm->delayed.rq->sched, struct amdgpu_ring, +- sched); ++ entity = p->direct ? &p->vm->direct : &p->vm->delayed; ++ ring = container_of(entity->rq->sched, struct amdgpu_ring, sched); + + WARN_ON(ib->length_dw == 0); + amdgpu_ring_pad_ib(ring, ib); + WARN_ON(ib->length_dw > p->num_dw_left); +- r = amdgpu_job_submit(p->job, &p->vm->delayed, +- AMDGPU_FENCE_OWNER_VM, &f); ++ r = amdgpu_job_submit(p->job, entity, AMDGPU_FENCE_OWNER_VM, &f); + if (r) + goto error; + + amdgpu_bo_fence(root, f, true); +- if (fence) ++ if (fence && !p->direct) + swap(*fence, f); + dma_fence_put(f); + return 0; +@@ -121,7 +123,6 @@ static int amdgpu_vm_sdma_commit(struct amdgpu_vm_update_params *p, + return r; + } + +- + /** + * amdgpu_vm_sdma_copy_ptes - copy the PTEs from mapping + * +-- +2.17.1 + |