diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3579-drm-amdgpu-update-the-PASID-mapping-only-on-demand.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3579-drm-amdgpu-update-the-PASID-mapping-only-on-demand.patch | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3579-drm-amdgpu-update-the-PASID-mapping-only-on-demand.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3579-drm-amdgpu-update-the-PASID-mapping-only-on-demand.patch new file mode 100644 index 00000000..a3e44c8e --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3579-drm-amdgpu-update-the-PASID-mapping-only-on-demand.patch @@ -0,0 +1,124 @@ +From c9ace8f4048d47d736515f03e45fd50f205153cb Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> +Date: Mon, 5 Feb 2018 17:38:01 +0100 +Subject: [PATCH 3579/4131] drm/amdgpu: update the PASID mapping only on demand +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Updating the PASID is rather heavyweight and shouldn't be done all the +time. + +Signed-off-by: Christian König <christian.koenig@amd.com> +Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c | 1 + + drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h | 3 +++ + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 37 +++++++++++++++++++++++++-------- + 3 files changed, 32 insertions(+), 9 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c +index 436b281..46b541b 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c +@@ -611,6 +611,7 @@ void amdgpu_vmid_mgr_fini(struct amdgpu_device *adev) + amdgpu_sync_free(&id->active); + dma_fence_put(id->flushed_updates); + dma_fence_put(id->last_flush); ++ dma_fence_put(id->pasid_mapping); + } + } + } +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h +index 20d4eca..7625419 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h +@@ -57,6 +57,9 @@ struct amdgpu_vmid { + uint32_t gws_size; + uint32_t oa_base; + uint32_t oa_size; ++ ++ unsigned pasid; ++ struct dma_fence *pasid_mapping; + }; + + struct amdgpu_vmid_mgr { +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +index 08ba210..9b86822 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +@@ -591,14 +591,24 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job, bool need_ + id->oa_base != job->oa_base || + id->oa_size != job->oa_size); + bool vm_flush_needed = job->vm_needs_flush; ++ bool pasid_mapping_needed = id->pasid != job->pasid || ++ !id->pasid_mapping || ++ !dma_fence_is_signaled(id->pasid_mapping); ++ struct dma_fence *fence = NULL; + unsigned patch_offset = 0; + int r; + + if (amdgpu_vmid_had_gpu_reset(adev, id)) { + gds_switch_needed = true; + vm_flush_needed = true; ++ pasid_mapping_needed = true; + } + ++ gds_switch_needed &= !!ring->funcs->emit_gds_switch; ++ vm_flush_needed &= !!ring->funcs->emit_vm_flush; ++ pasid_mapping_needed &= adev->gmc.gmc_funcs->emit_pasid_mapping && ++ ring->funcs->emit_wreg; ++ + if (!vm_flush_needed && !gds_switch_needed && !need_pipe_sync) + return 0; + +@@ -608,27 +618,36 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job, bool need_ + if (need_pipe_sync) + amdgpu_ring_emit_pipeline_sync(ring); + +- if (ring->funcs->emit_vm_flush && vm_flush_needed) { +- struct dma_fence *fence; +- ++ if (vm_flush_needed) { + trace_amdgpu_vm_flush(ring, job->vmid, job->vm_pd_addr); + amdgpu_ring_emit_vm_flush(ring, job->vmid, job->vm_pd_addr); +- if (adev->gmc.gmc_funcs->emit_pasid_mapping && +- ring->funcs->emit_wreg) +- amdgpu_gmc_emit_pasid_mapping(ring, job->vmid, +- job->pasid); ++ } + ++ if (pasid_mapping_needed) ++ amdgpu_gmc_emit_pasid_mapping(ring, job->vmid, job->pasid); ++ ++ if (vm_flush_needed || pasid_mapping_needed) { + r = amdgpu_fence_emit(ring, &fence); + if (r) + return r; ++ } + ++ if (vm_flush_needed) { + mutex_lock(&id_mgr->lock); + dma_fence_put(id->last_flush); +- id->last_flush = fence; +- id->current_gpu_reset_count = atomic_read(&adev->gpu_reset_counter); ++ id->last_flush = dma_fence_get(fence); ++ id->current_gpu_reset_count = ++ atomic_read(&adev->gpu_reset_counter); + mutex_unlock(&id_mgr->lock); + } + ++ if (pasid_mapping_needed) { ++ id->pasid = job->pasid; ++ dma_fence_put(id->pasid_mapping); ++ id->pasid_mapping = dma_fence_get(fence); ++ } ++ dma_fence_put(fence); ++ + if (ring->funcs->emit_gds_switch && gds_switch_needed) { + id->gds_base = job->gds_base; + id->gds_size = job->gds_size; +-- +2.7.4 + |