Commit b3cd285f authored by Christian König's avatar Christian König Committed by Alex Deucher

drm/amdgpu: update the PASID mapping only on demand

Updating the PASID is rather heavyweight and shouldn't be done all the
time.
Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent c633c00b
...@@ -607,6 +607,7 @@ void amdgpu_vmid_mgr_fini(struct amdgpu_device *adev) ...@@ -607,6 +607,7 @@ void amdgpu_vmid_mgr_fini(struct amdgpu_device *adev)
amdgpu_sync_free(&id->active); amdgpu_sync_free(&id->active);
dma_fence_put(id->flushed_updates); dma_fence_put(id->flushed_updates);
dma_fence_put(id->last_flush); dma_fence_put(id->last_flush);
dma_fence_put(id->pasid_mapping);
} }
} }
} }
...@@ -57,6 +57,9 @@ struct amdgpu_vmid { ...@@ -57,6 +57,9 @@ struct amdgpu_vmid {
uint32_t gws_size; uint32_t gws_size;
uint32_t oa_base; uint32_t oa_base;
uint32_t oa_size; uint32_t oa_size;
unsigned pasid;
struct dma_fence *pasid_mapping;
}; };
struct amdgpu_vmid_mgr { struct amdgpu_vmid_mgr {
......
...@@ -591,14 +591,24 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job, bool need_ ...@@ -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_base != job->oa_base ||
id->oa_size != job->oa_size); id->oa_size != job->oa_size);
bool vm_flush_needed = job->vm_needs_flush; 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; unsigned patch_offset = 0;
int r; int r;
if (amdgpu_vmid_had_gpu_reset(adev, id)) { if (amdgpu_vmid_had_gpu_reset(adev, id)) {
gds_switch_needed = true; gds_switch_needed = true;
vm_flush_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) if (!vm_flush_needed && !gds_switch_needed && !need_pipe_sync)
return 0; return 0;
...@@ -608,27 +618,36 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job, bool need_ ...@@ -608,27 +618,36 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job, bool need_
if (need_pipe_sync) if (need_pipe_sync)
amdgpu_ring_emit_pipeline_sync(ring); amdgpu_ring_emit_pipeline_sync(ring);
if (ring->funcs->emit_vm_flush && vm_flush_needed) { if (vm_flush_needed) {
struct dma_fence *fence;
trace_amdgpu_vm_flush(ring, job->vmid, job->vm_pd_addr); trace_amdgpu_vm_flush(ring, job->vmid, job->vm_pd_addr);
amdgpu_ring_emit_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); r = amdgpu_fence_emit(ring, &fence);
if (r) if (r)
return r; return r;
}
if (vm_flush_needed) {
mutex_lock(&id_mgr->lock); mutex_lock(&id_mgr->lock);
dma_fence_put(id->last_flush); dma_fence_put(id->last_flush);
id->last_flush = fence; id->last_flush = dma_fence_get(fence);
id->current_gpu_reset_count = atomic_read(&adev->gpu_reset_counter); id->current_gpu_reset_count =
atomic_read(&adev->gpu_reset_counter);
mutex_unlock(&id_mgr->lock); 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) { if (ring->funcs->emit_gds_switch && gds_switch_needed) {
id->gds_base = job->gds_base; id->gds_base = job->gds_base;
id->gds_size = job->gds_size; id->gds_size = job->gds_size;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment