diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 33 | 
1 files changed, 30 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c index 4ff348e10e4d..ebeddc9a37e9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c @@ -136,7 +136,9 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  	uint64_t fence_ctx;  	uint32_t status = 0, alloc_size;  	unsigned fence_flags = 0; -	bool secure; +	bool secure, init_shadow; +	u64 shadow_va, csa_va, gds_va; +	int vmid = AMDGPU_JOB_GET_VMID(job);  	unsigned i;  	int r = 0; @@ -150,9 +152,17 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  		vm = job->vm;  		fence_ctx = job->base.s_fence ?  			job->base.s_fence->scheduled.context : 0; +		shadow_va = job->shadow_va; +		csa_va = job->csa_va; +		gds_va = job->gds_va; +		init_shadow = job->init_shadow;  	} else {  		vm = NULL;  		fence_ctx = 0; +		shadow_va = 0; +		csa_va = 0; +		gds_va = 0; +		init_shadow = false;  	}  	if (!ring->sched.ready && !ring->is_mes_queue) { @@ -212,7 +222,12 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  	}  	amdgpu_ring_ib_begin(ring); -	if (job && ring->funcs->init_cond_exec) + +	if (ring->funcs->emit_gfx_shadow) +		amdgpu_ring_emit_gfx_shadow(ring, shadow_va, csa_va, gds_va, +					    init_shadow, vmid); + +	if (ring->funcs->init_cond_exec)  		patch_offset = amdgpu_ring_init_cond_exec(ring);  	amdgpu_device_flush_hdp(adev, ring); @@ -263,6 +278,18 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  				       fence_flags | AMDGPU_FENCE_FLAG_64BIT);  	} +	if (ring->funcs->emit_gfx_shadow) { +		amdgpu_ring_emit_gfx_shadow(ring, 0, 0, 0, false, 0); + +		if (ring->funcs->init_cond_exec) { +			unsigned ce_offset = ~0; + +			ce_offset = amdgpu_ring_init_cond_exec(ring); +			if (ce_offset != ~0 && ring->funcs->patch_cond_exec) +				amdgpu_ring_patch_cond_exec(ring, ce_offset); +		} +	} +  	r = amdgpu_fence_emit(ring, f, job, fence_flags);  	if (r) {  		dev_err(adev->dev, "failed to emit fence (%d)\n", r); @@ -436,7 +463,7 @@ int amdgpu_ib_ring_tests(struct amdgpu_device *adev)  static int amdgpu_debugfs_sa_info_show(struct seq_file *m, void *unused)  { -	struct amdgpu_device *adev = (struct amdgpu_device *)m->private; +	struct amdgpu_device *adev = m->private;  	seq_printf(m, "--------------------- DELAYED --------------------- \n");  	amdgpu_sa_bo_dump_debug_info(&adev->ib_pools[AMDGPU_IB_POOL_DELAYED],  | 
