Skip to content

Commit 5f3c40e

Browse files
ChristianKoenigAMDalexdeucher
authored andcommitted
drm/amdgpu: cleanup SPM support a bit
This should probably not access job->vm and also emit the SPM switch under the conditional execute. Signed-off-by: Christian König <[email protected]> Reviewed-by: Alex Deucher <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 56b0989 commit 5f3c40e

File tree

3 files changed

+7
-4
lines changed

3 files changed

+7
-4
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ static int amdgpu_vmid_grab_reserved(struct amdgpu_vm *vm,
315315
return r;
316316

317317
job->vm_needs_flush = needs_flush;
318+
job->spm_update_needed = true;
318319
return 0;
319320
}
320321

drivers/gpu/drm/amd/amdgpu/amdgpu_job.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ struct amdgpu_job {
5454
uint32_t preemption_status;
5555
bool vm_needs_flush;
5656
bool gds_switch_needed;
57+
bool spm_update_needed;
5758
uint64_t vm_pd_addr;
5859
unsigned vmid;
5960
unsigned pasid;

drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -519,22 +519,20 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job,
519519
unsigned vmhub = ring->funcs->vmhub;
520520
struct amdgpu_vmid_mgr *id_mgr = &adev->vm_manager.id_mgr[vmhub];
521521
struct amdgpu_vmid *id = &id_mgr->ids[job->vmid];
522+
bool spm_update_needed = job->spm_update_needed;
522523
bool gds_switch_needed = ring->funcs->emit_gds_switch &&
523524
job->gds_switch_needed;
524525
bool vm_flush_needed = job->vm_needs_flush;
525526
struct dma_fence *fence = NULL;
526527
bool pasid_mapping_needed = false;
527528
unsigned patch_offset = 0;
528-
bool update_spm_vmid_needed = (job->vm && (job->vm->reserved_vmid[vmhub] != NULL));
529529
int r;
530530

531-
if (update_spm_vmid_needed && adev->gfx.rlc.funcs->update_spm_vmid)
532-
adev->gfx.rlc.funcs->update_spm_vmid(adev, job->vmid);
533-
534531
if (amdgpu_vmid_had_gpu_reset(adev, id)) {
535532
gds_switch_needed = true;
536533
vm_flush_needed = true;
537534
pasid_mapping_needed = true;
535+
spm_update_needed = true;
538536
}
539537

540538
mutex_lock(&id_mgr->lock);
@@ -567,6 +565,9 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job,
567565
if (pasid_mapping_needed)
568566
amdgpu_gmc_emit_pasid_mapping(ring, job->vmid, job->pasid);
569567

568+
if (spm_update_needed && adev->gfx.rlc.funcs->update_spm_vmid)
569+
adev->gfx.rlc.funcs->update_spm_vmid(adev, job->vmid);
570+
570571
if (!ring->is_mes_queue && ring->funcs->emit_gds_switch &&
571572
gds_switch_needed) {
572573
amdgpu_ring_emit_gds_switch(ring, job->vmid, job->gds_base,

0 commit comments

Comments
 (0)